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

#include "SimpleType.h"
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

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

typedef struct T {
	A_SET_OF(SimpleType_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T_t;

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

extern asn_TYPE_descriptor_t asn_DEF_T;

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

static asn_TYPE_member_t asn_MBR_T_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_SimpleType,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "named"
		},
};
static const ber_tlv_tag_t asn_DEF_T_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_T_specs_1 = {
	sizeof(struct T),
	offsetof(struct T, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_T = {
	"T",
	"T",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	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,
	1,	/* Single element */
	&asn_SPC_T_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SimpleType] >>> ***/

#include <ENUMERATED.h>

/*** <<< DEPS [SimpleType] >>> ***/

typedef enum SimpleType {
	SimpleType_one	= 0,
	SimpleType_two	= 1,
	SimpleType_three	= 2
} e_SimpleType;

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

typedef ENUMERATED_t	 SimpleType_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SimpleType;
extern asn_INTEGER_specifics_t asn_SPC_SimpleType_specs_1;
asn_struct_free_f SimpleType_free;
asn_struct_print_f SimpleType_print;
asn_constr_check_f SimpleType_constraint;
ber_type_decoder_f SimpleType_decode_ber;
der_type_encoder_f SimpleType_encode_der;
xer_type_decoder_f SimpleType_decode_xer;
xer_type_encoder_f SimpleType_encode_xer;

/*** <<< CODE [SimpleType] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

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

static const asn_INTEGER_enum_map_t asn_MAP_SimpleType_value2enum_1[] = {
	{ 0,	3,	"one" },
	{ 1,	3,	"two" },
	{ 2,	5,	"three" }
};
static const unsigned int asn_MAP_SimpleType_enum2value_1[] = {
	0,	/* one(0) */
	2,	/* three(2) */
	1	/* two(1) */
};
const asn_INTEGER_specifics_t asn_SPC_SimpleType_specs_1 = {
	asn_MAP_SimpleType_value2enum_1,	/* "tag" => N; sorted by tag */
	asn_MAP_SimpleType_enum2value_1,	/* N => "tag"; sorted by N */
	3,	/* Number of elements in the maps */
	0,	/* Enumeration is not extensible */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_SimpleType_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn_TYPE_descriptor_t asn_DEF_SimpleType = {
	"SimpleType",
	"SimpleType",
	ENUMERATED_free,
	ENUMERATED_print,
	ENUMERATED_constraint,
	ENUMERATED_decode_ber,
	ENUMERATED_encode_der,
	ENUMERATED_decode_xer,
	ENUMERATED_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SimpleType_tags_1,
	sizeof(asn_DEF_SimpleType_tags_1)
		/sizeof(asn_DEF_SimpleType_tags_1[0]), /* 1 */
	asn_DEF_SimpleType_tags_1,	/* Same as above */
	sizeof(asn_DEF_SimpleType_tags_1)
		/sizeof(asn_DEF_SimpleType_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* Defined elsewhere */
	&asn_SPC_SimpleType_specs_1	/* Additional specs */
};

