
/*** <<< INCLUDES [PrimitiveType] >>> ***/

#include <OCTET_STRING.h>

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


typedef OCTET_STRING_t	 PrimitiveType_t;

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

/* This type is equivalent to OCTET_STRING */
#define	asn_DEF_PrimitiveType	asn_DEF_OCTET_STRING

/*** <<< CODE [PrimitiveType] >>> ***/

/* This type is equivalent to OCTET_STRING */


/*** <<< INCLUDES [ConstructedType] >>> ***/

#include <PrimitiveType.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [ConstructedType] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_ConstructedType;

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


typedef struct ConstructedType {
	PrimitiveType_t	 field;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} ConstructedType_t;

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

static asn_TYPE_member_t asn_MBR_ConstructedType[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ConstructedType, field),
		.tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_PrimitiveType,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "field"
		},
};
static ber_tlv_tag_t asn_DEF_ConstructedType_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_ConstructedType_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 0, 0, 0 }, /* field at 18 */
};
static asn_SEQUENCE_specifics_t asn_DEF_ConstructedType_specs = {
	sizeof(struct ConstructedType),
	offsetof(struct ConstructedType, _asn_ctx),
	asn_DEF_ConstructedType_tag2el,
	1,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_ConstructedType = {
	"ConstructedType",
	"ConstructedType",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	0,				/* Not implemented yet */
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_ConstructedType_tags,
	sizeof(asn_DEF_ConstructedType_tags)
		/sizeof(asn_DEF_ConstructedType_tags[0]), /* 1 */
	asn_DEF_ConstructedType_tags,	/* Same as above */
	sizeof(asn_DEF_ConstructedType_tags)
		/sizeof(asn_DEF_ConstructedType_tags[0]), /* 1 */
	asn_MBR_ConstructedType,
	1,	/* Elements count */
	&asn_DEF_ConstructedType_specs	/* Additional specs */
};


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

#include <ConstructedType.h>

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


typedef ConstructedType_t	 T_t;

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

extern asn_TYPE_descriptor_t asn_DEF_T;
asn_struct_free_f T_free;
asn_struct_print_f T_print;
asn_constr_check_f T_constraint;
ber_type_decoder_f T_decode_ber;
der_type_encoder_f T_encode_der;
xer_type_encoder_f T_encode_xer;

/*** <<< CODE [T] >>> ***/

int
T_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_ConstructedType.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

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

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

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

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

asn_enc_rval_t
T_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) {
	T_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

asn_enc_rval_t
T_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) {
	T_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static ber_tlv_tag_t asn_DEF_T_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_TYPE_descriptor_t asn_DEF_T = {
	"T",
	"T",
	T_free,
	T_print,
	T_constraint,
	T_decode_ber,
	T_encode_der,
	0,				/* Not implemented yet */
	T_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_T_tags,
	sizeof(asn_DEF_T_tags)
		/sizeof(asn_DEF_T_tags[0]) - 1, /* 1 */
	asn_DEF_T_tags,	/* Same as above */
	sizeof(asn_DEF_T_tags)
		/sizeof(asn_DEF_T_tags[0]), /* 2 */
	0, 0,	/* Defined elsewhere */
	0	/* No specifics */
};

