
/*** <<< 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,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.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",
	&asn_OP_SET_OF,
	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, 0, SET_OF_constraint },
	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 const 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",
	&asn_OP_ENUMERATED,
	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, 0, ENUMERATED_constraint },
	0, 0,	/* Defined elsewhere */
	&asn_SPC_SimpleType_specs_1	/* Additional specs */
};

