
/*** <<< INCLUDES [TestType] >>> ***/

#include <NativeInteger.h>
#include <constr_SEQUENCE.h>
#include <BOOLEAN.h>

/*** <<< TYPE-DECLS [TestType] >>> ***/

typedef struct TestType_16P0 {
	long	 common	/* DEFAULT 0 */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} TestType_16P0_t;
typedef struct TestType_16P1 {
	BOOLEAN_t	 common	/* DEFAULT 0 */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} TestType_16P1_t;

/*** <<< FUNC-DECLS [TestType] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_TestType_16P0;
extern asn_TYPE_descriptor_t asn_DEF_TestType_16P1;

/*** <<< CODE [TestType] >>> ***/

static int
memb_common_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	long value;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 1 && value <= 10)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


/*** <<< STAT-DEFS [TestType] >>> ***/

static int asn_DFL_2_set_0(void **sptr) {
	long *st = *sptr;
	
	if(!st) {
		st = (*sptr = CALLOC(1, sizeof(*st)));
		if(!st) return -1;
	}
	
	/* Install default value 0 */
	*st = 0;
	return 0;
}
static asn_TYPE_member_t asn_MBR_TestType_16P0_1[] = {
	{ ATF_NOFLAGS, 1, offsetof(struct TestType_16P0, common),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_NativeInteger,
		.memb_constraints = memb_common_constraint_1,
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = asn_DFL_2_set_0,	/* DEFAULT 0 */
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_TestType_16P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_TestType_16P0_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* common at 20 */
};
static asn_SEQUENCE_specifics_t asn_SPC_TestType_16P0_specs_1 = {
	sizeof(struct TestType_16P0),
	offsetof(struct TestType_16P0, _asn_ctx),
	asn_MAP_TestType_16P0_tag2el_1,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_TestType_16P0 = {
	"TestType",
	"TestType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_TestType_16P0_tags_1,
	sizeof(asn_DEF_TestType_16P0_tags_1)
		/sizeof(asn_DEF_TestType_16P0_tags_1[0]), /* 1 */
	asn_DEF_TestType_16P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_TestType_16P0_tags_1)
		/sizeof(asn_DEF_TestType_16P0_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_TestType_16P0_1,
	1,	/* Elements count */
	&asn_SPC_TestType_16P0_specs_1	/* Additional specs */
};

static int asn_DFL_4_set_0(void **sptr) {
	BOOLEAN_t *st = *sptr;
	
	if(!st) {
		st = (*sptr = CALLOC(1, sizeof(*st)));
		if(!st) return -1;
	}
	
	/* Install default value 0 */
	*st = 0;
	return 0;
}
static asn_TYPE_member_t asn_MBR_TestType_16P1_3[] = {
	{ ATF_NOFLAGS, 1, offsetof(struct TestType_16P1, common),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_BOOLEAN,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = asn_DFL_4_set_0,	/* DEFAULT 0 */
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_TestType_16P1_tags_3[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_TestType_16P1_tag2el_3[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 } /* common at 21 */
};
static asn_SEQUENCE_specifics_t asn_SPC_TestType_16P1_specs_3 = {
	sizeof(struct TestType_16P1),
	offsetof(struct TestType_16P1, _asn_ctx),
	asn_MAP_TestType_16P1_tag2el_3,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_TestType_16P1 = {
	"TestType",
	"TestType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_TestType_16P1_tags_3,
	sizeof(asn_DEF_TestType_16P1_tags_3)
		/sizeof(asn_DEF_TestType_16P1_tags_3[0]), /* 1 */
	asn_DEF_TestType_16P1_tags_3,	/* Same as above */
	sizeof(asn_DEF_TestType_16P1_tags_3)
		/sizeof(asn_DEF_TestType_16P1_tags_3[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_TestType_16P1_3,
	1,	/* Elements count */
	&asn_SPC_TestType_16P1_specs_3	/* Additional specs */
};


/*** <<< INCLUDES [TestChoice] >>> ***/

#include <TestType.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [TestChoice] >>> ***/

typedef enum TestChoice_PR {
	TestChoice_PR_NOTHING,	/* No components present */
	TestChoice_PR_type1,
	TestChoice_PR_type2,
} TestChoice_PR;

/*** <<< TYPE-DECLS [TestChoice] >>> ***/

typedef struct TestChoice {
	TestChoice_PR present;
	union TestChoice_u {
		TestType_16P0_t	 type1;
		TestType_16P1_t	 type2;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} TestChoice_t;

/*** <<< FUNC-DECLS [TestChoice] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_TestChoice;

/*** <<< STAT-DEFS [TestChoice] >>> ***/

static asn_TYPE_member_t asn_MBR_TestChoice_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct TestChoice, choice.type1),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_TestType_16P0,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "type1"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct TestChoice, choice.type2),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_TestType_16P1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "type2"
		},
};
static asn_TYPE_tag2member_t asn_MAP_TestChoice_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* type1 at 20 */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* type2 at 21 */
};
static asn_CHOICE_specifics_t asn_SPC_TestChoice_specs_1 = {
	sizeof(struct TestChoice),
	offsetof(struct TestChoice, _asn_ctx),
	offsetof(struct TestChoice, present),
	sizeof(((struct TestChoice *)0)->present),
	asn_MAP_TestChoice_tag2el_1,
	2,	/* Count of tags in the map */
	.canonical_order = 0,
	.ext_start = -1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_TestChoice = {
	"TestChoice",
	"TestChoice",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	0,	/* No PER visible constraints */
	asn_MBR_TestChoice_1,
	2,	/* Elements count */
	&asn_SPC_TestChoice_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [AutoType] >>> ***/

#include <NativeInteger.h>
#include <constr_SEQUENCE.h>
#include <BOOLEAN.h>

/*** <<< TYPE-DECLS [AutoType] >>> ***/

typedef struct AutoType_34P0 {
	long	 common;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} AutoType_34P0_t;
typedef struct AutoType_34P1 {
	BOOLEAN_t	 common;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} AutoType_34P1_t;

/*** <<< FUNC-DECLS [AutoType] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_AutoType_34P0;
extern asn_TYPE_descriptor_t asn_DEF_AutoType_34P1;

/*** <<< CODE [AutoType] >>> ***/

static int
memb_common_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	long value;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value == 0)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_common_constraint_3(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	BOOLEAN_t value;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = (*(const long *)sptr) ? 1 : 0;
	
	if((value <= 0)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


/*** <<< STAT-DEFS [AutoType] >>> ***/

static asn_TYPE_member_t asn_MBR_AutoType_34P0_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct AutoType_34P0, common),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NativeInteger,
		.memb_constraints = memb_common_constraint_1,
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_AutoType_34P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_AutoType_34P0_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 37 */
};
static asn_SEQUENCE_specifics_t asn_SPC_AutoType_34P0_specs_1 = {
	sizeof(struct AutoType_34P0),
	offsetof(struct AutoType_34P0, _asn_ctx),
	asn_MAP_AutoType_34P0_tag2el_1,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_AutoType_34P0 = {
	"AutoType",
	"AutoType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_AutoType_34P0_tags_1,
	sizeof(asn_DEF_AutoType_34P0_tags_1)
		/sizeof(asn_DEF_AutoType_34P0_tags_1[0]), /* 1 */
	asn_DEF_AutoType_34P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_AutoType_34P0_tags_1)
		/sizeof(asn_DEF_AutoType_34P0_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_AutoType_34P0_1,
	1,	/* Elements count */
	&asn_SPC_AutoType_34P0_specs_1	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_AutoType_34P1_3[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct AutoType_34P1, common),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_BOOLEAN,
		.memb_constraints = memb_common_constraint_3,
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_AutoType_34P1_tags_3[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_AutoType_34P1_tag2el_3[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 38 */
};
static asn_SEQUENCE_specifics_t asn_SPC_AutoType_34P1_specs_3 = {
	sizeof(struct AutoType_34P1),
	offsetof(struct AutoType_34P1, _asn_ctx),
	asn_MAP_AutoType_34P1_tag2el_3,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_AutoType_34P1 = {
	"AutoType",
	"AutoType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_AutoType_34P1_tags_3,
	sizeof(asn_DEF_AutoType_34P1_tags_3)
		/sizeof(asn_DEF_AutoType_34P1_tags_3[0]), /* 1 */
	asn_DEF_AutoType_34P1_tags_3,	/* Same as above */
	sizeof(asn_DEF_AutoType_34P1_tags_3)
		/sizeof(asn_DEF_AutoType_34P1_tags_3[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_AutoType_34P1_3,
	1,	/* Elements count */
	&asn_SPC_AutoType_34P1_specs_3	/* Additional specs */
};


/*** <<< INCLUDES [AutoChoice] >>> ***/

#include <AutoType.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [AutoChoice] >>> ***/

typedef enum AutoChoice_PR {
	AutoChoice_PR_NOTHING,	/* No components present */
	AutoChoice_PR_type1,
	AutoChoice_PR_type2,
} AutoChoice_PR;

/*** <<< TYPE-DECLS [AutoChoice] >>> ***/

typedef struct AutoChoice {
	AutoChoice_PR present;
	union AutoChoice_u {
		AutoType_34P0_t	 type1;
		AutoType_34P1_t	 type2;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} AutoChoice_t;

/*** <<< FUNC-DECLS [AutoChoice] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_AutoChoice;

/*** <<< STAT-DEFS [AutoChoice] >>> ***/

static asn_TYPE_member_t asn_MBR_AutoChoice_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct AutoChoice, choice.type1),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_AutoType_34P0,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "type1"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct AutoChoice, choice.type2),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_AutoType_34P1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "type2"
		},
};
static asn_TYPE_tag2member_t asn_MAP_AutoChoice_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* type1 at 37 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* type2 at 38 */
};
static asn_CHOICE_specifics_t asn_SPC_AutoChoice_specs_1 = {
	sizeof(struct AutoChoice),
	offsetof(struct AutoChoice, _asn_ctx),
	offsetof(struct AutoChoice, present),
	sizeof(((struct AutoChoice *)0)->present),
	asn_MAP_AutoChoice_tag2el_1,
	2,	/* Count of tags in the map */
	.canonical_order = 0,
	.ext_start = -1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_AutoChoice = {
	"AutoChoice",
	"AutoChoice",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	0,	/* No PER decoder, -gen-PER to enable */
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	0,	/* No PER visible constraints */
	asn_MBR_AutoChoice_1,
	2,	/* Elements count */
	&asn_SPC_AutoChoice_specs_1	/* Additional specs */
};

