
/*** <<< 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 to actual type */
		.name = ""
		},
};
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",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	0,				/* Not implemented yet */
	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_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;
}

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);
}

ber_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_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 ber_tlv_tag_t asn_DEF_SimpleType_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn_TYPE_descriptor_t asn_DEF_SimpleType = {
	"SimpleType",
	SimpleType_free,
	SimpleType_print,
	SimpleType_constraint,
	SimpleType_decode_ber,
	SimpleType_encode_der,
	0,				/* Not implemented yet */
	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,	/* No members */
	0	/* No specifics */
};

