
/*** <<< INCLUDES [Frame] >>> ***/

#include "ConstrainedInteger.h"
#include <ANY.h>
#include <asn_ioc.h>
#include "PrimitiveMessage.h"
#include "ComplexMessage.h"
#include <OPEN_TYPE.h>
#include <constr_CHOICE.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [Frame] >>> ***/

typedef enum value_PR {
	value_PR_NOTHING,	/* No components present */
	value_PR_PrimitiveMessage,
	value_PR_ComplexMessage
} value_PR;

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

typedef struct Frame {
	ConstrainedInteger_t	 ident;
	struct value {
		value_PR present;
		union value_u {
			PrimitiveMessage_t	 PrimitiveMessage;
			ComplexMessage_t	 ComplexMessage;
		} choice;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} value;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Frame_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Frame;

/*** <<< IOC-TABLES [Frame] >>> ***/

static const long asn_VAL_1_primMessage = 1;
static const long asn_VAL_2_cplxMessage = 2;
static const asn_ioc_cell_t asn_IOS_FrameTypes_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ConstrainedInteger, &asn_VAL_1_primMessage },
	{ "&Type", aioc__type, &asn_DEF_PrimitiveMessage },
	{ "&id", aioc__value, &asn_DEF_ConstrainedInteger, &asn_VAL_2_cplxMessage },
	{ "&Type", aioc__type, &asn_DEF_ComplexMessage }
};
static const asn_ioc_set_t asn_IOS_FrameTypes_1[] = {
	2, 2, asn_IOS_FrameTypes_1_rows
};

/*** <<< CODE [Frame] >>> ***/

static int
memb_ident_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 32767)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_FrameTypes_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &Type */
	size_t row;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct Frame, ident));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(constraining_cell->type_descriptor->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = row + 1;
	        break;
	    }
	}
	
	return result;
}

static int
memb_value_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->check_constraints(td, sptr, ctfailcb, app_key);
}


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

static asn_TYPE_member_t asn_MBR_value_3[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct value, choice.PrimitiveMessage),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_PrimitiveMessage,
		.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 = "PrimitiveMessage"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct value, choice.ComplexMessage),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_ComplexMessage,
		.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 = "ComplexMessage"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_3[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* PrimitiveMessage */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* ComplexMessage */
};
static asn_CHOICE_specifics_t asn_SPC_value_specs_3 = {
	sizeof(struct value),
	offsetof(struct value, _asn_ctx),
	offsetof(struct value, present),
	sizeof(((struct value *)0)->present),
	.tag2el = asn_MAP_value_tag2el_3,
	.tag2el_count = 2,	/* Count of tags in the map */
	.canonical_order = 0,
	.ext_start = -1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_value_3 = {
	"value",
	"value",
	OPEN_TYPE_free,
	OPEN_TYPE_print,
	OPEN_TYPE_compare,
	OPEN_TYPE_constraint,
	OPEN_TYPE_decode_ber,
	OPEN_TYPE_encode_der,
	OPEN_TYPE_decode_xer,
	OPEN_TYPE_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_value_3,
	2,	/* Elements count */
	&asn_SPC_value_specs_3	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Frame_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Frame, ident),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_ConstrainedInteger,
		.type_selector = 0,
		.memb_constraints = memb_ident_constraint_1,
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "ident"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct Frame, value),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = &asn_DEF_value_3,
		.type_selector = select_value_type,
		.memb_constraints = memb_value_constraint_1,
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "value"
		},
};
static const ber_tlv_tag_t asn_DEF_Frame_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Frame_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ident */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* value */
};
static asn_SEQUENCE_specifics_t asn_SPC_Frame_specs_1 = {
	sizeof(struct Frame),
	offsetof(struct Frame, _asn_ctx),
	.tag2el = asn_MAP_Frame_tag2el_1,
	.tag2el_count = 2,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Frame = {
	"Frame",
	"Frame",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_compare,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Frame_tags_1,
	sizeof(asn_DEF_Frame_tags_1)
		/sizeof(asn_DEF_Frame_tags_1[0]), /* 1 */
	asn_DEF_Frame_tags_1,	/* Same as above */
	sizeof(asn_DEF_Frame_tags_1)
		/sizeof(asn_DEF_Frame_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_Frame_1,
	2,	/* Elements count */
	&asn_SPC_Frame_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [ConstrainedInteger] >>> ***/

#include <NativeInteger.h>

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

typedef long	 ConstrainedInteger_t;

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

extern asn_TYPE_descriptor_t asn_DEF_ConstrainedInteger;
asn_struct_free_f ConstrainedInteger_free;
asn_struct_print_f ConstrainedInteger_print;
asn_constr_check_f ConstrainedInteger_constraint;
ber_type_decoder_f ConstrainedInteger_decode_ber;
der_type_encoder_f ConstrainedInteger_encode_der;
xer_type_decoder_f ConstrainedInteger_decode_xer;
xer_type_encoder_f ConstrainedInteger_encode_xer;

/*** <<< CODE [ConstrainedInteger] >>> ***/

int
ConstrainedInteger_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 32767)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

/*
 * This type is implemented using NativeInteger,
 * so here we adjust the DEF accordingly.
 */

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

static const ber_tlv_tag_t asn_DEF_ConstrainedInteger_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_ConstrainedInteger = {
	"ConstrainedInteger",
	"ConstrainedInteger",
	NativeInteger_free,
	NativeInteger_print,
	NativeInteger_compare,
	ConstrainedInteger_constraint,
	NativeInteger_decode_ber,
	NativeInteger_encode_der,
	NativeInteger_decode_xer,
	NativeInteger_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_ConstrainedInteger_tags_1,
	sizeof(asn_DEF_ConstrainedInteger_tags_1)
		/sizeof(asn_DEF_ConstrainedInteger_tags_1[0]), /* 1 */
	asn_DEF_ConstrainedInteger_tags_1,	/* Same as above */
	sizeof(asn_DEF_ConstrainedInteger_tags_1)
		/sizeof(asn_DEF_ConstrainedInteger_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [PrimitiveMessage] >>> ***/

#include <constr_SEQUENCE.h>

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

typedef struct PrimitiveMessage {
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} PrimitiveMessage_t;

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

extern asn_TYPE_descriptor_t asn_DEF_PrimitiveMessage;
extern asn_SEQUENCE_specifics_t asn_SPC_PrimitiveMessage_specs_1;

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

static const ber_tlv_tag_t asn_DEF_PrimitiveMessage_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_SEQUENCE_specifics_t asn_SPC_PrimitiveMessage_specs_1 = {
	sizeof(struct PrimitiveMessage),
	offsetof(struct PrimitiveMessage, _asn_ctx),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_PrimitiveMessage = {
	"PrimitiveMessage",
	"PrimitiveMessage",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_compare,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_PrimitiveMessage_tags_1,
	sizeof(asn_DEF_PrimitiveMessage_tags_1)
		/sizeof(asn_DEF_PrimitiveMessage_tags_1[0]), /* 1 */
	asn_DEF_PrimitiveMessage_tags_1,	/* Same as above */
	sizeof(asn_DEF_PrimitiveMessage_tags_1)
		/sizeof(asn_DEF_PrimitiveMessage_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	&asn_SPC_PrimitiveMessage_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [ComplexMessage] >>> ***/

#include <constr_SEQUENCE.h>

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

typedef struct ComplexMessage {
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} ComplexMessage_t;

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

extern asn_TYPE_descriptor_t asn_DEF_ComplexMessage;
extern asn_SEQUENCE_specifics_t asn_SPC_ComplexMessage_specs_1;

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

static const ber_tlv_tag_t asn_DEF_ComplexMessage_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_SEQUENCE_specifics_t asn_SPC_ComplexMessage_specs_1 = {
	sizeof(struct ComplexMessage),
	offsetof(struct ComplexMessage, _asn_ctx),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_ComplexMessage = {
	"ComplexMessage",
	"ComplexMessage",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_compare,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_ComplexMessage_tags_1,
	sizeof(asn_DEF_ComplexMessage_tags_1)
		/sizeof(asn_DEF_ComplexMessage_tags_1[0]), /* 1 */
	asn_DEF_ComplexMessage_tags_1,	/* Same as above */
	sizeof(asn_DEF_ComplexMessage_tags_1)
		/sizeof(asn_DEF_ComplexMessage_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	&asn_SPC_ComplexMessage_specs_1	/* Additional specs */
};

