
/*** <<< INCLUDES [T] >>> ***/

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

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

typedef struct T {
	long	 small32range;
	long	 full32range;
	unsigned long	 unsigned32;
	unsigned long	 unsplit32;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T_t;

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

/* extern asn_TYPE_descriptor_t asn_DEF_unsigned32_4;	// (Use -fall-defs-global to expose) */
/* extern asn_TYPE_descriptor_t asn_DEF_unsplit32_5;	// (Use -fall-defs-global to expose) */
extern asn_TYPE_descriptor_t asn_DEF_T;

/*** <<< CODE [T] >>> ***/

static int
unsigned32_4_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	/* Constraint check succeeded */
	return 0;
}

/*
 * This type is implemented using NativeInteger,
 * so here we adjust the DEF accordingly.
 */
static int
unsplit32_5_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	unsigned long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const unsigned long *)sptr;
	
	if(((value >= 5 && value <= 500) || (value >= 600 && value <= 4294967290))) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using NativeInteger,
 * so here we adjust the DEF accordingly.
 */
static int
memb_small32range_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= -2000000000 && value <= 2000000000)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

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

static int
memb_unsigned32_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	/* Constraint check succeeded */
	return 0;
}

static int
memb_unsplit32_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	unsigned long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const unsigned long *)sptr;
	
	if(((value >= 5 && value <= 500) || (value >= 600 && value <= 4294967290))) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


/*** <<< CTDEFS [T] >>> ***/

static asn_per_constraints_t asn_PER_type_unsigned32_constr_4 GCC_NOTUSED = {
	{ APC_CONSTRAINED,	 32, -1,  0,  4294967295 }	/* (0..4294967295) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_type_unsplit32_constr_5 GCC_NOTUSED = {
	{ APC_CONSTRAINED,	 32, -1,  5,  4294967290 }	/* (5..4294967290) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_small32range_constr_2 GCC_NOTUSED = {
	{ APC_CONSTRAINED,	 32, -1, -2000000000,  2000000000 }	/* (-2000000000..2000000000) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_full32range_constr_3 GCC_NOTUSED = {
	{ APC_CONSTRAINED,	 32, -1, (-2147483647L - 1),  2147483647 }	/* (-2147483648..2147483647) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_unsigned32_constr_4 GCC_NOTUSED = {
	{ APC_CONSTRAINED,	 32, -1,  0,  4294967295 }	/* (0..4294967295) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_unsplit32_constr_5 GCC_NOTUSED = {
	{ APC_CONSTRAINED,	 32, -1,  5,  4294967290 }	/* (5..4294967290) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};

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

static const asn_INTEGER_specifics_t asn_SPC_unsigned32_specs_4 = {
	0,	0,	0,	0,	0,
	0,	/* Native long size */
	1	/* Unsigned representation */
};
static const ber_tlv_tag_t asn_DEF_unsigned32_tags_4[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_unsigned32_4 = {
	"unsigned32",
	"unsigned32",
	&asn_OP_NativeInteger,
	unsigned32_4_constraint,
	asn_DEF_unsigned32_tags_4,
	sizeof(asn_DEF_unsigned32_tags_4)
		/sizeof(asn_DEF_unsigned32_tags_4[0]) - 1, /* 1 */
	asn_DEF_unsigned32_tags_4,	/* Same as above */
	sizeof(asn_DEF_unsigned32_tags_4)
		/sizeof(asn_DEF_unsigned32_tags_4[0]), /* 2 */
	0,	/* No OER visible constraints */
	&asn_PER_type_unsigned32_constr_4,
	0, 0,	/* No members */
	&asn_SPC_unsigned32_specs_4	/* Additional specs */
};

static const asn_INTEGER_specifics_t asn_SPC_unsplit32_specs_5 = {
	0,	0,	0,	0,	0,
	0,	/* Native long size */
	1	/* Unsigned representation */
};
static const ber_tlv_tag_t asn_DEF_unsplit32_tags_5[] = {
	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_unsplit32_5 = {
	"unsplit32",
	"unsplit32",
	&asn_OP_NativeInteger,
	unsplit32_5_constraint,
	asn_DEF_unsplit32_tags_5,
	sizeof(asn_DEF_unsplit32_tags_5)
		/sizeof(asn_DEF_unsplit32_tags_5[0]) - 1, /* 1 */
	asn_DEF_unsplit32_tags_5,	/* Same as above */
	sizeof(asn_DEF_unsplit32_tags_5)
		/sizeof(asn_DEF_unsplit32_tags_5[0]), /* 2 */
	0,	/* No OER visible constraints */
	&asn_PER_type_unsplit32_constr_5,
	0, 0,	/* No members */
	&asn_SPC_unsplit32_specs_5	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_T_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T, small32range),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NativeInteger,
		.type_selector = 0,
		.memb_constraints = memb_small32range_constraint_1,
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = &asn_PER_memb_small32range_constr_2,
		.default_value = 0,
		.name = "small32range"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T, full32range),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NativeInteger,
		.type_selector = 0,
		.memb_constraints = memb_full32range_constraint_1,
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = &asn_PER_memb_full32range_constr_3,
		.default_value = 0,
		.name = "full32range"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T, unsigned32),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_unsigned32_4,
		.type_selector = 0,
		.memb_constraints = memb_unsigned32_constraint_1,
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = &asn_PER_memb_unsigned32_constr_4,
		.default_value = 0,
		.name = "unsigned32"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T, unsplit32),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_unsplit32_5,
		.type_selector = 0,
		.memb_constraints = memb_unsplit32_constraint_1,
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = &asn_PER_memb_unsplit32_constr_5,
		.default_value = 0,
		.name = "unsplit32"
		},
};
static const ber_tlv_tag_t asn_DEF_T_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* small32range */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* full32range */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* unsigned32 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* unsplit32 */
};
static asn_SEQUENCE_specifics_t asn_SPC_T_specs_1 = {
	sizeof(struct T),
	offsetof(struct T, _asn_ctx),
	.tag2el = asn_MAP_T_tag2el_1,
	.tag2el_count = 4,	/* 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_T = {
	"T",
	"T",
	&asn_OP_SEQUENCE,
	SEQUENCE_constraint,
	asn_DEF_T_tags_1,
	sizeof(asn_DEF_T_tags_1)
		/sizeof(asn_DEF_T_tags_1[0]), /* 1 */
	asn_DEF_T_tags_1,	/* Same as above */
	sizeof(asn_DEF_T_tags_1)
		/sizeof(asn_DEF_T_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_T_1,
	4,	/* Elements count */
	&asn_SPC_T_specs_1	/* Additional specs */
};

