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

#include <NativeInteger.h>
#include <constr_SEQUENCE.h>
#include <BOOLEAN.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 {
		struct type1 {
			long	*common	/* DEFAULT 0 */;
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} type1;
		struct type2 {
			BOOLEAN_t	*common	/* DEFAULT 0 */;
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} 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;

/*** <<< CODE [TestChoice] >>> ***/

static int
memb_common_2_constraint(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 [TestChoice] >>> ***/

static asn_TYPE_member_t asn_MBR_type1_2[] = {
	{ ATF_POINTER, 1, offsetof(struct type1, common),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_NativeInteger,
		.memb_constraints = memb_common_2_constraint,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_type1_2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_type1_2_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* common at 20 */
};
static asn_SEQUENCE_specifics_t asn_SPC_type1_2_specs = {
	sizeof(struct type1),
	offsetof(struct type1, _asn_ctx),
	asn_MAP_type1_2_tag2el,
	1,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_type1_2 = {
	"type1",
	"type1",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_type1_2_tags,
	sizeof(asn_DEF_type1_2_tags)
		/sizeof(asn_DEF_type1_2_tags[0]), /* 1 */
	asn_DEF_type1_2_tags,	/* Same as above */
	sizeof(asn_DEF_type1_2_tags)
		/sizeof(asn_DEF_type1_2_tags[0]), /* 1 */
	asn_MBR_type1_2,
	1,	/* Elements count */
	&asn_SPC_type1_2_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_type2_4[] = {
	{ ATF_POINTER, 1, offsetof(struct type2, 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 */
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_type2_4_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_type2_4_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 } /* common at 21 */
};
static asn_SEQUENCE_specifics_t asn_SPC_type2_4_specs = {
	sizeof(struct type2),
	offsetof(struct type2, _asn_ctx),
	asn_MAP_type2_4_tag2el,
	1,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_type2_4 = {
	"type2",
	"type2",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_type2_4_tags,
	sizeof(asn_DEF_type2_4_tags)
		/sizeof(asn_DEF_type2_4_tags[0]) - 1, /* 1 */
	asn_DEF_type2_4_tags,	/* Same as above */
	sizeof(asn_DEF_type2_4_tags)
		/sizeof(asn_DEF_type2_4_tags[0]), /* 2 */
	asn_MBR_type2_4,
	1,	/* Elements count */
	&asn_SPC_type2_4_specs	/* Additional specs */
};

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_type1_2,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.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_type2_4,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "type2"
		},
};
static asn_TYPE_tag2member_t asn_MAP_TestChoice_1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* type1 at 16 */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* type2 at 16 */
};
static asn_CHOICE_specifics_t asn_SPC_TestChoice_1_specs = {
	sizeof(struct TestChoice),
	offsetof(struct TestChoice, _asn_ctx),
	offsetof(struct TestChoice, present),
	sizeof(((struct TestChoice *)0)->present),
	asn_MAP_TestChoice_1_tag2el,
	2,	/* Count of tags in the map */
	0	/* Whether extensible */
};
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,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	asn_MBR_TestChoice_1,
	2,	/* Elements count */
	&asn_SPC_TestChoice_1_specs	/* Additional specs */
};


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

#include <NativeInteger.h>
#include <constr_SEQUENCE.h>
#include <BOOLEAN.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 {
		struct type1 {
			long	 common;
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} type1;
		struct type2 {
			BOOLEAN_t	 common;
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} 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;

/*** <<< CODE [AutoChoice] >>> ***/

static int
memb_common_2_constraint(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_4_constraint(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 [AutoChoice] >>> ***/

static asn_TYPE_member_t asn_MBR_type1_2[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct type1, common),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NativeInteger,
		.memb_constraints = memb_common_2_constraint,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_type1_2_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_type1_2_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 37 */
};
static asn_SEQUENCE_specifics_t asn_SPC_type1_2_specs = {
	sizeof(struct type1),
	offsetof(struct type1, _asn_ctx),
	asn_MAP_type1_2_tag2el,
	1,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_type1_2 = {
	"type1",
	"type1",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_type1_2_tags,
	sizeof(asn_DEF_type1_2_tags)
		/sizeof(asn_DEF_type1_2_tags[0]) - 1, /* 1 */
	asn_DEF_type1_2_tags,	/* Same as above */
	sizeof(asn_DEF_type1_2_tags)
		/sizeof(asn_DEF_type1_2_tags[0]), /* 2 */
	asn_MBR_type1_2,
	1,	/* Elements count */
	&asn_SPC_type1_2_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_type2_4[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct type2, common),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_BOOLEAN,
		.memb_constraints = memb_common_4_constraint,
		.name = "common"
		},
};
static ber_tlv_tag_t asn_DEF_type2_4_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_type2_4_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* common at 38 */
};
static asn_SEQUENCE_specifics_t asn_SPC_type2_4_specs = {
	sizeof(struct type2),
	offsetof(struct type2, _asn_ctx),
	asn_MAP_type2_4_tag2el,
	1,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_type2_4 = {
	"type2",
	"type2",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_type2_4_tags,
	sizeof(asn_DEF_type2_4_tags)
		/sizeof(asn_DEF_type2_4_tags[0]) - 1, /* 1 */
	asn_DEF_type2_4_tags,	/* Same as above */
	sizeof(asn_DEF_type2_4_tags)
		/sizeof(asn_DEF_type2_4_tags[0]), /* 2 */
	asn_MBR_type2_4,
	1,	/* Elements count */
	&asn_SPC_type2_4_specs	/* Additional specs */
};

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_type1_2,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.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_type2_4,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "type2"
		},
};
static asn_TYPE_tag2member_t asn_MAP_AutoChoice_1_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* type1 at 34 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* type2 at 34 */
};
static asn_CHOICE_specifics_t asn_SPC_AutoChoice_1_specs = {
	sizeof(struct AutoChoice),
	offsetof(struct AutoChoice, _asn_ctx),
	offsetof(struct AutoChoice, present),
	sizeof(((struct AutoChoice *)0)->present),
	asn_MAP_AutoChoice_1_tag2el,
	2,	/* Count of tags in the map */
	0	/* Whether extensible */
};
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,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	asn_MBR_AutoChoice_1,
	2,	/* Elements count */
	&asn_SPC_AutoChoice_1_specs	/* Additional specs */
};

