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

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

/*** <<< DEPS [T] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_T;

/*** <<< 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;

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

static asn_TYPE_member_t asn_MBR_T[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_SimpleType,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "named"
		},
};
static ber_tlv_tag_t asn_DEF_T_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_T_specs = {
	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,	/* Use generic outmost tag fetcher */
	asn_DEF_T_tags,
	sizeof(asn_DEF_T_tags)
		/sizeof(asn_DEF_T_tags[0]), /* 1 */
	asn_DEF_T_tags,	/* Same as above */
	sizeof(asn_DEF_T_tags)
		/sizeof(asn_DEF_T_tags[0]), /* 1 */
	asn_MBR_T,
	1,	/* Single element */
	&asn_DEF_T_specs	/* Additional specs */
};


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

#include <ENUMERATED.h>

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

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

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


typedef ENUMERATED_t	 SimpleType_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SimpleType;
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] >>> ***/

int
SimpleType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn_DEF_ENUMERATED.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */
static void
SimpleType_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_ENUMERATED.free_struct;
	td->print_struct   = asn_DEF_ENUMERATED.print_struct;
	td->ber_decoder    = asn_DEF_ENUMERATED.ber_decoder;
	td->der_encoder    = asn_DEF_ENUMERATED.der_encoder;
	td->xer_decoder    = asn_DEF_ENUMERATED.xer_decoder;
	td->xer_encoder    = asn_DEF_ENUMERATED.xer_encoder;
	td->elements       = asn_DEF_ENUMERATED.elements;
	td->elements_count = asn_DEF_ENUMERATED.elements_count;
    /* td->specifics      = asn_DEF_ENUMERATED.specifics;	// Defined explicitly */
}

void
SimpleType_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	SimpleType_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

int
SimpleType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	SimpleType_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

asn_dec_rval_t
SimpleType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	SimpleType_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

asn_enc_rval_t
SimpleType_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	SimpleType_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_dec_rval_t
SimpleType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, void *bufptr, size_t size) {
	SimpleType_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

asn_enc_rval_t
SimpleType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	SimpleType_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static asn_INTEGER_enum_map_t asn_MAP_SimpleType_value2enum[] = {
	{ 0,	3,	"one" },
	{ 1,	3,	"two" },
	{ 2,	5,	"three" }
};
static unsigned int asn_MAP_SimpleType_enum2value[] = {
	0,	/* one(0) */
	2,	/* three(2) */
	1	/* two(1) */
};
static asn_INTEGER_specifics_t asn_DEF_SimpleType_specs = {
	asn_MAP_SimpleType_value2enum,	/* "tag" => N; sorted by tag */
	asn_MAP_SimpleType_enum2value,	/* N => "tag"; sorted by N */
	3,	/* Number of elements in the maps */
	0,	/* Enumeration is not extensible */
	1	/* Strict enumeration */
};
static ber_tlv_tag_t asn_DEF_SimpleType_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn_TYPE_descriptor_t asn_DEF_SimpleType = {
	"SimpleType",
	"SimpleType",
	SimpleType_free,
	SimpleType_print,
	SimpleType_constraint,
	SimpleType_decode_ber,
	SimpleType_encode_der,
	SimpleType_decode_xer,
	SimpleType_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SimpleType_tags,
	sizeof(asn_DEF_SimpleType_tags)
		/sizeof(asn_DEF_SimpleType_tags[0]), /* 1 */
	asn_DEF_SimpleType_tags,	/* Same as above */
	sizeof(asn_DEF_SimpleType_tags)
		/sizeof(asn_DEF_SimpleType_tags[0]), /* 1 */
	0, 0,	/* Defined elsewhere */
	&asn_DEF_SimpleType_specs	/* Additional specs */
};

