
/*** <<< INCLUDES [Flag] >>> ***/

#include <NativeInteger.h>
#include <constr_SEQUENCE.h>
#include <NativeEnumerated.h>

/*** <<< DEPS [Flag] >>> ***/

typedef enum Flag_15P0__field {
	Flag_15P0__field_red	= 0,
	Flag_15P0__field_green	= 1,
	Flag_15P0__field_blue	= 5
} e_Flag_15P0__field;
typedef enum Flag_15P1__field {
	Flag_15P1__field_red	= 3,
	Flag_15P1__field_green	= 4,
	Flag_15P1__field_blue	= 5
} e_Flag_15P1__field;

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

typedef struct Flag_15P0 {
	long	*field	/* DEFAULT 5 */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Flag_15P0_t;
typedef struct Flag_15P1 {
	long	*field	/* DEFAULT 5 */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Flag_15P1_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Flag_15P0;
extern asn_SEQUENCE_specifics_t asn_SPC_Flag_15P0_specs_1;
extern asn_TYPE_member_t asn_MBR_Flag_15P0_1[1];
/* extern asn_TYPE_descriptor_t asn_DEF_field_7;	// (Use -fall-defs-global to expose) */
extern asn_TYPE_descriptor_t asn_DEF_Flag_15P1;
extern asn_SEQUENCE_specifics_t asn_SPC_Flag_15P1_specs_6;
extern asn_TYPE_member_t asn_MBR_Flag_15P1_6[1];

/*** <<< CODE [Flag] >>> ***/

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

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

static int asn_DFL_2_set_5(int set_value, void **sptr) {
	long *st = *sptr;
	
	if(!st) {
		if(!set_value) return -1;	/* Not a default value */
		st = (*sptr = CALLOC(1, sizeof(*st)));
		if(!st) return -1;
	}
	
	if(set_value) {
		/* Install default value 5 */
		*st = 5;
		return 0;
	} else {
		/* Test default value 5 */
		return (*st == 5);
	}
}
asn_TYPE_member_t asn_MBR_Flag_15P0_1[] = {
	{ ATF_POINTER, 1, offsetof(struct Flag_15P0, field),
		.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 },
		.default_value = asn_DFL_2_set_5,	/* DEFAULT 5 */
		.name = "field"
		},
};
static const ber_tlv_tag_t asn_DEF_Flag_15P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Flag_15P0_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* field */
};
asn_SEQUENCE_specifics_t asn_SPC_Flag_15P0_specs_1 = {
	sizeof(struct Flag_15P0),
	offsetof(struct Flag_15P0, _asn_ctx),
	.tag2el = asn_MAP_Flag_15P0_tag2el_1,
	.tag2el_count = 1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Flag_15P0 = {
	"Flag",
	"Flag",
	&asn_OP_SEQUENCE,
	asn_DEF_Flag_15P0_tags_1,
	sizeof(asn_DEF_Flag_15P0_tags_1)
		/sizeof(asn_DEF_Flag_15P0_tags_1[0]), /* 1 */
	asn_DEF_Flag_15P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_Flag_15P0_tags_1)
		/sizeof(asn_DEF_Flag_15P0_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Flag_15P0_1,
	1,	/* Elements count */
	&asn_SPC_Flag_15P0_specs_1	/* Additional specs */
};

static int asn_DFL_7_set_5(int set_value, void **sptr) {
	long *st = *sptr;
	
	if(!st) {
		if(!set_value) return -1;	/* Not a default value */
		st = (*sptr = CALLOC(1, sizeof(*st)));
		if(!st) return -1;
	}
	
	if(set_value) {
		/* Install default value 5 */
		*st = 5;
		return 0;
	} else {
		/* Test default value 5 */
		return (*st == 5);
	}
}
static const asn_INTEGER_enum_map_t asn_MAP_field_value2enum_7[] = {
	{ 3,	3,	"red" },
	{ 4,	5,	"green" },
	{ 5,	4,	"blue" }
};
static const unsigned int asn_MAP_field_enum2value_7[] = {
	2,	/* blue(5) */
	1,	/* green(4) */
	0	/* red(3) */
};
static const asn_INTEGER_specifics_t asn_SPC_field_specs_7 = {
	asn_MAP_field_value2enum_7,	/* "tag" => N; sorted by tag */
	asn_MAP_field_enum2value_7,	/* N => "tag"; sorted by N */
	3,	/* Number of elements in the maps */
	0,	/* Enumeration is not extensible */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_field_tags_7[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_field_7 = {
	"field",
	"field",
	&asn_OP_NativeEnumerated,
	asn_DEF_field_tags_7,
	sizeof(asn_DEF_field_tags_7)
		/sizeof(asn_DEF_field_tags_7[0]), /* 1 */
	asn_DEF_field_tags_7,	/* Same as above */
	sizeof(asn_DEF_field_tags_7)
		/sizeof(asn_DEF_field_tags_7[0]), /* 1 */
	{ 0, 0, NativeEnumerated_constraint },
	0, 0,	/* Defined elsewhere */
	&asn_SPC_field_specs_7	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_Flag_15P1_6[] = {
	{ ATF_POINTER, 1, offsetof(struct Flag_15P1, field),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_field_7,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value = asn_DFL_7_set_5,	/* DEFAULT 5 */
		.name = "field"
		},
};
static const ber_tlv_tag_t asn_DEF_Flag_15P1_tags_6[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Flag_15P1_tag2el_6[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 0 } /* field */
};
asn_SEQUENCE_specifics_t asn_SPC_Flag_15P1_specs_6 = {
	sizeof(struct Flag_15P1),
	offsetof(struct Flag_15P1, _asn_ctx),
	.tag2el = asn_MAP_Flag_15P1_tag2el_6,
	.tag2el_count = 1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Flag_15P1 = {
	"Flag",
	"Flag",
	&asn_OP_SEQUENCE,
	asn_DEF_Flag_15P1_tags_6,
	sizeof(asn_DEF_Flag_15P1_tags_6)
		/sizeof(asn_DEF_Flag_15P1_tags_6[0]), /* 1 */
	asn_DEF_Flag_15P1_tags_6,	/* Same as above */
	sizeof(asn_DEF_Flag_15P1_tags_6)
		/sizeof(asn_DEF_Flag_15P1_tags_6[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Flag_15P1_6,
	1,	/* Elements count */
	&asn_SPC_Flag_15P1_specs_6	/* Additional specs */
};


/*** <<< INCLUDES [IntegerColorFlag] >>> ***/

#include "Flag.h"

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

typedef Flag_15P0_t	 IntegerColorFlag_t;

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

extern asn_TYPE_descriptor_t asn_DEF_IntegerColorFlag;
asn_struct_free_f IntegerColorFlag_free;
asn_struct_print_f IntegerColorFlag_print;
asn_constr_check_f IntegerColorFlag_constraint;
ber_type_decoder_f IntegerColorFlag_decode_ber;
der_type_encoder_f IntegerColorFlag_encode_der;
xer_type_decoder_f IntegerColorFlag_decode_xer;
xer_type_encoder_f IntegerColorFlag_encode_xer;

/*** <<< CODE [IntegerColorFlag] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_IntegerColorFlag_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_TYPE_descriptor_t asn_DEF_IntegerColorFlag = {
	"IntegerColorFlag",
	"IntegerColorFlag",
	&asn_OP_SEQUENCE,
	asn_DEF_IntegerColorFlag_tags_1,
	sizeof(asn_DEF_IntegerColorFlag_tags_1)
		/sizeof(asn_DEF_IntegerColorFlag_tags_1[0]), /* 1 */
	asn_DEF_IntegerColorFlag_tags_1,	/* Same as above */
	sizeof(asn_DEF_IntegerColorFlag_tags_1)
		/sizeof(asn_DEF_IntegerColorFlag_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Flag_15P0_1,
	1,	/* Elements count */
	&asn_SPC_Flag_15P0_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [EnumeratedColorFlag] >>> ***/

#include "Flag.h"

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

typedef Flag_15P1_t	 EnumeratedColorFlag_t;

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

extern asn_TYPE_descriptor_t asn_DEF_EnumeratedColorFlag;
asn_struct_free_f EnumeratedColorFlag_free;
asn_struct_print_f EnumeratedColorFlag_print;
asn_constr_check_f EnumeratedColorFlag_constraint;
ber_type_decoder_f EnumeratedColorFlag_decode_ber;
der_type_encoder_f EnumeratedColorFlag_encode_der;
xer_type_decoder_f EnumeratedColorFlag_decode_xer;
xer_type_encoder_f EnumeratedColorFlag_encode_xer;

/*** <<< CODE [EnumeratedColorFlag] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_EnumeratedColorFlag_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_TYPE_descriptor_t asn_DEF_EnumeratedColorFlag = {
	"EnumeratedColorFlag",
	"EnumeratedColorFlag",
	&asn_OP_SEQUENCE,
	asn_DEF_EnumeratedColorFlag_tags_1,
	sizeof(asn_DEF_EnumeratedColorFlag_tags_1)
		/sizeof(asn_DEF_EnumeratedColorFlag_tags_1[0]), /* 1 */
	asn_DEF_EnumeratedColorFlag_tags_1,	/* Same as above */
	sizeof(asn_DEF_EnumeratedColorFlag_tags_1)
		/sizeof(asn_DEF_EnumeratedColorFlag_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Flag_15P1_6,
	1,	/* Elements count */
	&asn_SPC_Flag_15P1_specs_6	/* Additional specs */
};

