
/*** <<< 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,
		.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",
	&asn_OP_SET_OF,
	SET_OF_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,
	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,
	ENUMERATED_constraint,
	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 */
};

