
/*** <<< 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(const 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->op->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(const 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->encoding_constraints.general_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,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.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,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.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 */
	0, 0,
	.ext_start = -1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_value_3 = {
	"value",
	"value",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	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,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints =  memb_ident_constraint_1 },
		0, 0, /* No default value */
		.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,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints =  memb_value_constraint_1 },
		0, 0, /* No default value */
		.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",
	&asn_OP_SEQUENCE,
	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, 0, SEQUENCE_constraint },
	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(const 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",
	&asn_OP_NativeInteger,
	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, 0, ConstrainedInteger_constraint },
	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",
	&asn_OP_SEQUENCE,
	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, 0, SEQUENCE_constraint },
	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",
	&asn_OP_SEQUENCE,
	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, 0, SEQUENCE_constraint },
	0, 0,	/* No members */
	&asn_SPC_ComplexMessage_specs_1	/* Additional specs */
};

