Sereal-Encoder
view release on metacpan or search on metacpan
SRL_INIT_OPTION( SRL_ENC_OPT_IDX_UNDEF_UNKNOWN, SRL_ENC_OPT_STR_UNDEF_UNKNOWN );
SRL_INIT_OPTION( SRL_ENC_OPT_IDX_USE_PROTOCOL_V1, SRL_ENC_OPT_STR_USE_PROTOCOL_V1 );
SRL_INIT_OPTION( SRL_ENC_OPT_IDX_WARN_UNKNOWN, SRL_ENC_OPT_STR_WARN_UNKNOWN );
SRL_INIT_OPTION( SRL_ENC_OPT_IDX_USE_STANDARD_DOUBLE, SRL_ENC_OPT_STR_USE_STANDARD_DOUBLE );
SRL_INIT_OPTION( SRL_ENC_OPT_IDX_FREEZE_ALLOW_CLASSES, SRL_ENC_OPT_STR_FREEZE_ALLOW_CLASSES );
SRL_INIT_OPTION( SRL_ENC_OPT_IDX_FREEZE_DENY_ACTION, SRL_ENC_OPT_STR_FREEZE_DENY_ACTION );
}
#if USE_CUSTOM_OPS
{
XOP *xop;
Newxz(xop, 1, XOP);
XopENTRY_set(xop, xop_name, "sereal_encode_with_object");
XopENTRY_set(xop, xop_desc, "sereal_encode_with_object");
XopENTRY_set(xop, xop_class, OA_UNOP);
Perl_custom_op_register(aTHX_ THX_pp_sereal_encode_with_object, xop);
}
#endif /* USE_CUSTOM_OPS */
{
GV *gv;
CV *cv = newXSproto_portable("Sereal::Encoder::sereal_encode_with_object",
THX_xsfunc_sereal_encode_with_object, __FILE__, "$$;$");
#if USE_CUSTOM_OPS
cv_set_call_checker(cv, THX_ck_entersub_args_sereal_encode_with_object, (SV*)cv);
#endif /* USE_CUSTOM_OPS */
gv = gv_fetchpv("Sereal::Encoder::encode", GV_ADDMULTI, SVt_PVCV);
GvCV_set(gv, cv);
}
}
srl_encoder_t *
new(CLASS, opt = NULL)
char *CLASS;
HV *opt;
PREINIT:
dMY_CXT;
CODE:
RETVAL = srl_build_encoder_struct(aTHX_ opt, MY_CXT.options);
RETVAL->flags |= SRL_F_REUSE_ENCODER;
OUTPUT: RETVAL
void
DESTROY(enc)
srl_encoder_t *enc;
CODE:
srl_destroy_encoder(aTHX_ enc);
U32
flags(enc)
srl_encoder_t *enc;
CODE:
RETVAL = enc->flags;
OUTPUT: RETVAL
void
encode_sereal(src, opt = NULL)
SV *src;
HV *opt;
PREINIT:
srl_encoder_t *enc;
dMY_CXT;
PPCODE:
enc = srl_build_encoder_struct(aTHX_ opt, MY_CXT.options);
assert(enc != NULL);
/* Avoid copy by stealing string buffer if it is not too large.
* This makes sense in the functional interface since the string
* buffer isn't ever going to be reused. */
ST(0) = srl_dump_data_structure_mortal_sv(aTHX_ enc, src, NULL, SRL_ENC_SV_REUSE_MAYBE);
XSRETURN(1);
void
encode_sereal_with_header_data(src, hdr_user_data_src, opt = NULL)
SV *src;
SV *hdr_user_data_src;
HV *opt;
PREINIT:
srl_encoder_t *enc;
dMY_CXT;
PPCODE:
if (!SvOK(hdr_user_data_src))
hdr_user_data_src = NULL;
enc = srl_build_encoder_struct(aTHX_ opt, MY_CXT.options);
assert(enc != NULL);
/* Avoid copy by stealing string buffer if it is not too large.
* This makes sense in the functional interface since the string
* buffer isn't ever going to be reused. */
ST(0) = srl_dump_data_structure_mortal_sv(aTHX_ enc, src, hdr_user_data_src, SRL_ENC_SV_REUSE_MAYBE);
XSRETURN(1);
MODULE = Sereal::Encoder PACKAGE = Sereal::Encoder::_ptabletest
void
test()
PREINIT:
PTABLE_t *tbl;
PTABLE_ITER_t *iter;
PTABLE_ENTRY_t *ent;
UV i, n = 20;
char *check[20];
char fail[5] = "not ";
char noop[1] = "";
CODE:
tbl = PTABLE_new_size(10);
for (i = 0; i < (UV)n; ++i) {
PTABLE_store(tbl, INT2PTR(void *,(1000+i)), INT2PTR(void *, (1000+i)));
check[i] = fail;
}
for (i = 0; i < (UV)n; ++i) {
const UV res = PTR2UV(PTABLE_fetch(tbl, INT2PTR(void *, (1000+i))));
printf("%sok %u - fetch %u\n", (res == (UV)(1000+i)) ? noop : fail, (unsigned int)(1+i), (unsigned int)(i+1));
}
iter = PTABLE_iter_new(tbl);
while ( NULL != (ent = PTABLE_iter_next(iter)) ) {
const UV res = (PTR2UV(ent->value)) - 1000;
if (res < 20)
check[res] = noop;
else
abort();
}
for (i = 0; i < (UV)n; ++i) {
printf("%sok %u - iter %u\n", check[i], (unsigned int)(21+i), (unsigned int)(i+1));
}
PTABLE_iter_free(iter);
PTABLE_free(tbl);
( run in 0.507 second using v1.01-cache-2.11-cpan-4e7a2411597 )