
/*** <<< INCLUDES [Message] >>> ***/

#include "SpecializedContent.h"
#include <constr_SEQUENCE.h>

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

typedef struct Message {
	SpecializedContent_30P0_t	 content;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Message_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Message;

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

static asn_TYPE_member_t asn_MBR_Message_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Message, content),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_SpecializedContent_30P0,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "content"
		},
};
static const ber_tlv_tag_t asn_DEF_Message_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Message_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* content */
};
static asn_SEQUENCE_specifics_t asn_SPC_Message_specs_1 = {
	sizeof(struct Message),
	offsetof(struct Message, _asn_ctx),
	.tag2el = asn_MAP_Message_tag2el_1,
	.tag2el_count = 1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_Message = {
	"Message",
	"Message",
	&asn_OP_SEQUENCE,
	asn_DEF_Message_tags_1,
	sizeof(asn_DEF_Message_tags_1)
		/sizeof(asn_DEF_Message_tags_1[0]), /* 1 */
	asn_DEF_Message_tags_1,	/* Same as above */
	sizeof(asn_DEF_Message_tags_1)
		/sizeof(asn_DEF_Message_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Message_1,
	1,	/* Elements count */
	&asn_SPC_Message_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SpecializedContent] >>> ***/

#include <NativeInteger.h>
#include <ANY.h>
#include <asn_ioc.h>
#include <OPEN_TYPE.h>
#include <BOOLEAN.h>
#include <constr_CHOICE.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [SpecializedContent] >>> ***/

typedef enum value_PR {
	value_PR_NOTHING,	/* No components present */
	value_PR_INTEGER,
	value_PR_BOOLEAN
} value_PR;

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

typedef struct SpecializedContent_30P0 {
	long	 id;
	struct value {
		value_PR present;
		union SpecializedContent_30P0__value_u {
			long	 INTEGER;
			BOOLEAN_t	 BOOLEAN;
		} choice;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} value;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SpecializedContent_30P0_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SpecializedContent_30P0;
extern asn_SEQUENCE_specifics_t asn_SPC_SpecializedContent_30P0_specs_1;
extern asn_TYPE_member_t asn_MBR_SpecializedContent_30P0_1[2];

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

static const long asn_VAL_1_1 = 1;
static const long asn_VAL_2_2 = 2;
static const asn_ioc_cell_t asn_IOS_RegionalExtension_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_NativeInteger, &asn_VAL_1_1 },
	{ "&Type", ,
	{ "&id", aioc__value, &asn_DEF_NativeInteger, &asn_VAL_2_2 },
	{ "&Type", 
};
static const asn_ioc_set_t asn_IOS_RegionalExtension_1[] = {
	2, 2, asn_IOS_RegionalExtension_1_rows
};

/*** <<< CODE [SpecializedContent] >>> ***/

static int
memb_id_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);
}

static asn_type_selector_result_t
select_SpecializedContent_30P0_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_RegionalExtension_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 SpecializedContent_30P0, id));
	
	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);
}


/*** <<< CTDEFS [SpecializedContent] >>> ***/

static asn_per_constraints_t asn_PER_memb_id_constr_2 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_value_constr_3 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};

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

static asn_TYPE_member_t asn_MBR_value_3[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct value, choice.INTEGER),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_NativeInteger,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "INTEGER"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct value, choice.BOOLEAN),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_BOOLEAN,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "BOOLEAN"
		},
};
static const unsigned asn_MAP_value_to_canonical_3[] = { 1, 0 };
static const unsigned asn_MAP_value_from_canonical_3[] = { 1, 0 };
static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_3[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 1, 0, 0 }, /* BOOLEAN */
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* INTEGER */
};
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 */
	.to_canonical_order = asn_MAP_value_to_canonical_3,
	.from_canonical_order = asn_MAP_value_from_canonical_3,
	.first_extension = -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 */
};

asn_TYPE_member_t asn_MBR_SpecializedContent_30P0_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SpecializedContent_30P0, id),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_NativeInteger,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = &asn_PER_memb_id_constr_2, .general_constraints =  memb_id_constraint_1 },
		0, 0, /* No default value */
		.name = "id"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SpecializedContent_30P0, value),
		.tag = -1 /* Ambiguous tag (ANY?) */,
		.tag_mode = 0,
		.type = &asn_DEF_value_3,
		.type_selector = select_SpecializedContent_30P0_value_type,
		{ .oer_constraints = 0, .per_constraints = &asn_PER_memb_value_constr_3, .general_constraints =  memb_value_constraint_1 },
		0, 0, /* No default value */
		.name = "value"
		},
};
static const ber_tlv_tag_t asn_DEF_SpecializedContent_30P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SpecializedContent_30P0_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* id */
};
asn_SEQUENCE_specifics_t asn_SPC_SpecializedContent_30P0_specs_1 = {
	sizeof(struct SpecializedContent_30P0),
	offsetof(struct SpecializedContent_30P0, _asn_ctx),
	.tag2el = asn_MAP_SpecializedContent_30P0_tag2el_1,
	.tag2el_count = 1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_SpecializedContent_30P0 = {
	"SpecializedContent",
	"SpecializedContent",
	&asn_OP_SEQUENCE,
	asn_DEF_SpecializedContent_30P0_tags_1,
	sizeof(asn_DEF_SpecializedContent_30P0_tags_1)
		/sizeof(asn_DEF_SpecializedContent_30P0_tags_1[0]), /* 1 */
	asn_DEF_SpecializedContent_30P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_SpecializedContent_30P0_tags_1)
		/sizeof(asn_DEF_SpecializedContent_30P0_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_SpecializedContent_30P0_1,
	2,	/* Elements count */
	&asn_SPC_SpecializedContent_30P0_specs_1	/* Additional specs */
};

