# vim: set noexpandtab:
TYPEMAP
PLCB_XS_OBJPAIR_t	T_PLCB_XS_OBJPAIR_T
PLCB_XS_STRING_NONULL_t	T_PLCB_XS_STRING_NONULL_T
PLCB_XS_STRING_t	T_PLCB_XS_STRING_T
PLCB_viewhandle_t *	T_PLCB_COUCH_HANDLE_T
PLCB_jsondec_t*	T_PLCB_JSONDEC_T
PLCB_t *        T_PLCB
plcb_OPCTX*		T_OPCTX
lcbvb_CONFIG *	T_VBC
plcb_IOPROCS *	T_IOPROCS
plcb_EVENT	*	T_IOEVENT

INPUT
T_PLCB_XS_OBJPAIR_T
	if (! (SvROK($arg) && SvOBJECT(SvRV($arg)) && SvIOK(SvRV($arg)))) {
	    die(\"Not a valid Couchbase::Bucket\");
	}

	$var.sv = $arg;
	$var.ptr = NUM2PTR(PLCB_t*, SvIV(SvRV($arg)));

T_PLCB
	if (! (SvROK($arg) && (SvOBJECT($arg) || SvOBJECT(SvRV($arg))) && SvIOK(SvRV($arg)))) {
		die(\"Not a valid Couchbase::Bucket\"); \
	}
	$var = NUM2PTR(PLCB_t*,SvIV(SvRV($arg)));

T_OPCTX
	if (!sv_isa($arg, \"Couchbase::OpContext\")) {
		die(\"Not a valid Couchbase::OpContext\");
	}
	$var = NUM2PTR($type, SvIV(SvRV($arg))); \
	if (!SvROK($var->parent)) {
		parent = NULL;
	} else {
		parent = NUM2PTR(PLCB_t*,SvIV(SvRV($var->parent)));
	}

T_VBC
	if (!sv_isa($arg, \"Couchbase::BucketConfig\")) {
		die(\"Not a valid Couchbase::BucketConfig\");
	}
	$var = NUM2PTR($type, SvIV(SvRV($arg)));

T_IOPROCS
	if (!sv_isa($arg, \"Couchbase::IO\")) {
		die(\"Not a valid Couchbase::IO\");
	}
	$var = NUM2PTR($type, SvIV(SvRV($arg)));

T_IOEVENT
	if (!sv_derived_from($arg, \"Couchbase::IO::Event\")) {
		sv_dump($arg);
		die(\"Not a valid Couchbase::IO::Event\");
	}
	{
		SV **tmpsv = av_fetch((AV*)SvRV((SV*)$arg), PLCB_EVIDX_OPAQUE, 0);
		$var = NUM2PTR($type, SvIV(*tmpsv));
	}

T_PLCB_XS_STRING_NONULL_T
	if(!SvPOK($arg)) {
	    $var.base = NULL;
	    $var.len = 0;
	} else {
	    $var.base = SvPV($arg, $var.len);
	}
	$var.origsv = $arg;
	if($var.len == 0) {
	    die(\"$var cannot be empty\");
	}

T_PLCB_XS_STRING_T
	if(!SvPOK($arg)) {
	    $var.base = NULL;
	    $var.len = 0;
	} else {
	    $var.base = SvPV($arg, $var.len);
	}
	$var.origsv = $arg;


T_PLCB_COUCH_HANDLE_T
	if (! (SvROK($arg) && SvOBJECT(SvRV($arg)) && SvIOK(SvRV($arg)))) {
	    die(\"Not a valid Couchbase::Couch::RequestHandle\");
	}

	$var = NUM2PTR(PLCB_viewhandle_t *, SvIV(SvRV($arg)));


T_PLCB_JSONDEC_T
	$var = (PLCB_jsondec_t*)SvPVX(SvRV($arg));

T_PLCB_ITER_T
	if (! (SvROK($arg) && SvOBJECT(SvRV($arg)) && SvIOK(SvRV($arg)))) {
	    die(\"Not a valid Couchbase::DocIterator\");
	}

	$var = NUM2PTR(PLCB_iter_t*, SvIV(SvRV($arg)));

T_PLCB_EXP_T
	$var = plcb_exp_from_sv($arg);

OUTPUT
T_VBC
	sv_setref_pv($arg, \"Couchbase::BucketConfig\", (void*)$var);
