X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=xs-src%2Fmouse_instance.xs;fp=xs-src%2Fmouse_instance.xs;h=dd74c1c615767372cb7901d180dfdaea96a6eb1b;hb=431657256f423bda264c0cb76c28de72fd879b20;hp=0000000000000000000000000000000000000000;hpb=6e64f8097e17ea8b7b950fee35046dfa43a5b4f3;p=gitmo%2FMouse.git diff --git a/xs-src/mouse_instance.xs b/xs-src/mouse_instance.xs new file mode 100644 index 0000000..dd74c1c --- /dev/null +++ b/xs-src/mouse_instance.xs @@ -0,0 +1,76 @@ +#include "mouse.h" + +#define CHECK_INSTANCE(instance) STMT_START{ \ + if(!(SvROK(instance) && SvTYPE(SvRV(instance)) == SVt_PVHV)){ \ + croak("Invalid object for instance managers"); \ + } \ + } STMT_END + +SV* +mouse_instance_create(pTHX_ HV* const stash) { + assert(stash); + return sv_bless( newRV_noinc((SV*)newHV()), stash ); +} + +SV* +mouse_instance_clone(pTHX_ SV* const instance) { + HV* proto; + assert(instance); + + CHECK_INSTANCE(instance); + proto = newHVhv((HV*)SvRV(instance)); + return sv_bless( newRV_noinc((SV*)proto), SvSTASH(SvRV(instance)) ); +} + +bool +mouse_instance_has_slot(pTHX_ SV* const instance, SV* const slot) { + assert(instance); + assert(slot); + CHECK_INSTANCE(instance); + return hv_exists_ent((HV*)SvRV(instance), slot, 0U); +} + +SV* +mouse_instance_get_slot(pTHX_ SV* const instance, SV* const slot) { + HE* he; + assert(instance); + assert(slot); + CHECK_INSTANCE(instance); + he = hv_fetch_ent((HV*)SvRV(instance), slot, FALSE, 0U); + return he ? HeVAL(he) : NULL; +} + +SV* +mouse_instance_set_slot(pTHX_ SV* const instance, SV* const slot, SV* const value) { + HE* he; + SV* sv; + assert(instance); + assert(slot); + assert(value); + CHECK_INSTANCE(instance); + he = hv_fetch_ent((HV*)SvRV(instance), slot, TRUE, 0U); + sv = HeVAL(he); + sv_setsv_mg(sv, value); + return sv; +} + +SV* +mouse_instance_delete_slot(pTHX_ SV* const instance, SV* const slot) { + assert(instance); + assert(slot); + CHECK_INSTANCE(instance); + return hv_delete_ent((HV*)SvRV(instance), slot, 0, 0U); +} + +void +mouse_instance_weaken_slot(pTHX_ SV* const instance, SV* const slot) { + HE* he; + assert(instance); + assert(slot); + CHECK_INSTANCE(instance); + he = hv_fetch_ent((HV*)SvRV(instance), slot, FALSE, 0U); + if(he){ + sv_rvweaken(HeVAL(he)); + } +} +