
/*** <<< INCLUDES [SIGNED] >>> ***/

#include <REAL.h>
#include <constr_SEQUENCE.h>
#include <INTEGER.h>
#include <constr_SET.h>

/*** <<< DEPS [SIGNED] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum signed_PR {
	signed_PR_a,	/* Member a is present */
} signed_PR;

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

typedef struct SIGNED_16P0 {
	REAL_t	 Signed;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SIGNED_16P0_t;
typedef struct SIGNED_16P1 {
	struct Signed {
		INTEGER_t	 a;
		
		/* Presence bitmask: ASN_SET_ISPRESENT(psigned, signed_PR_x) */
		unsigned int _presence_map
			[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} Signed;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SIGNED_16P1_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SIGNED_16P0;
extern asn_SEQUENCE_specifics_t asn_SPC_SIGNED_16P0_specs_1;
extern asn_TYPE_member_t asn_MBR_SIGNED_16P0_1[1];
extern asn_TYPE_descriptor_t asn_DEF_SIGNED_16P1;
extern asn_SEQUENCE_specifics_t asn_SPC_SIGNED_16P1_specs_3;
extern asn_TYPE_member_t asn_MBR_SIGNED_16P1_3[1];

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

asn_TYPE_member_t asn_MBR_SIGNED_16P0_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SIGNED_16P0, Signed),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_REAL,
		.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 = "signed"
		},
};
static const ber_tlv_tag_t asn_DEF_SIGNED_16P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SIGNED_16P0_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 0, 0, 0 } /* signed */
};
asn_SEQUENCE_specifics_t asn_SPC_SIGNED_16P0_specs_1 = {
	sizeof(struct SIGNED_16P0),
	offsetof(struct SIGNED_16P0, _asn_ctx),
	asn_MAP_SIGNED_16P0_tag2el_1,
	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_SIGNED_16P0 = {
	"SIGNED",
	"SIGNED",
	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_SIGNED_16P0_tags_1,
	sizeof(asn_DEF_SIGNED_16P0_tags_1)
		/sizeof(asn_DEF_SIGNED_16P0_tags_1[0]), /* 1 */
	asn_DEF_SIGNED_16P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_SIGNED_16P0_tags_1)
		/sizeof(asn_DEF_SIGNED_16P0_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_SIGNED_16P0_1,
	1,	/* Elements count */
	&asn_SPC_SIGNED_16P0_specs_1	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_signed_4[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Signed, a),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_INTEGER,
		.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 = "a"
		},
};
static const ber_tlv_tag_t asn_DEF_signed_tags_4[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_signed_tag2el_4[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* a */
};
static const uint8_t asn_MAP_signed_mmap_4[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(1 << 7)
};
static 
asn_SET_specifics_t asn_SPC_signed_specs_4 = {
	sizeof(struct Signed),
	offsetof(struct Signed, _asn_ctx),
	offsetof(struct Signed, _presence_map),
	asn_MAP_signed_tag2el_4,
	1,	/* Count of tags in the map */
	asn_MAP_signed_tag2el_4,	/* Same as above */
	1,	/* Count of tags in the CXER map */
	0,	/* Whether extensible */
	(const unsigned int *)asn_MAP_signed_mmap_4	/* Mandatory elements map */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_signed_4 = {
	"signed",
	"signed",
	SET_free,
	SET_print,
	SET_compare,
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	SET_decode_xer,
	SET_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_signed_tags_4,
	sizeof(asn_DEF_signed_tags_4)
		/sizeof(asn_DEF_signed_tags_4[0]), /* 1 */
	asn_DEF_signed_tags_4,	/* Same as above */
	sizeof(asn_DEF_signed_tags_4)
		/sizeof(asn_DEF_signed_tags_4[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_signed_4,
	1,	/* Elements count */
	&asn_SPC_signed_specs_4	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_SIGNED_16P1_3[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SIGNED_16P1, Signed),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_signed_4,
		.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 = "signed"
		},
};
static const ber_tlv_tag_t asn_DEF_SIGNED_16P1_tags_3[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SIGNED_16P1_tag2el_3[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 } /* signed */
};
asn_SEQUENCE_specifics_t asn_SPC_SIGNED_16P1_specs_3 = {
	sizeof(struct SIGNED_16P1),
	offsetof(struct SIGNED_16P1, _asn_ctx),
	asn_MAP_SIGNED_16P1_tag2el_3,
	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_SIGNED_16P1 = {
	"SIGNED",
	"SIGNED",
	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_SIGNED_16P1_tags_3,
	sizeof(asn_DEF_SIGNED_16P1_tags_3)
		/sizeof(asn_DEF_SIGNED_16P1_tags_3[0]), /* 1 */
	asn_DEF_SIGNED_16P1_tags_3,	/* Same as above */
	sizeof(asn_DEF_SIGNED_16P1_tags_3)
		/sizeof(asn_DEF_SIGNED_16P1_tags_3[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_SIGNED_16P1_3,
	1,	/* Elements count */
	&asn_SPC_SIGNED_16P1_specs_3	/* Additional specs */
};


/*** <<< INCLUDES [SignedREAL] >>> ***/

#include "SIGNED.h"

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

typedef SIGNED_16P0_t	 SignedREAL_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SignedREAL;
asn_struct_free_f SignedREAL_free;
asn_struct_print_f SignedREAL_print;
asn_constr_check_f SignedREAL_constraint;
ber_type_decoder_f SignedREAL_decode_ber;
der_type_encoder_f SignedREAL_encode_der;
xer_type_decoder_f SignedREAL_decode_xer;
xer_type_encoder_f SignedREAL_encode_xer;

/*** <<< CODE [SignedREAL] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_SignedREAL_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_TYPE_descriptor_t asn_DEF_SignedREAL = {
	"SignedREAL",
	"SignedREAL",
	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_SignedREAL_tags_1,
	sizeof(asn_DEF_SignedREAL_tags_1)
		/sizeof(asn_DEF_SignedREAL_tags_1[0]), /* 1 */
	asn_DEF_SignedREAL_tags_1,	/* Same as above */
	sizeof(asn_DEF_SignedREAL_tags_1)
		/sizeof(asn_DEF_SignedREAL_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_SIGNED_16P0_1,
	1,	/* Elements count */
	&asn_SPC_SIGNED_16P0_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SignedSET] >>> ***/

#include "SIGNED.h"

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

typedef SIGNED_16P1_t	 SignedSET_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SignedSET;
asn_struct_free_f SignedSET_free;
asn_struct_print_f SignedSET_print;
asn_constr_check_f SignedSET_constraint;
ber_type_decoder_f SignedSET_decode_ber;
der_type_encoder_f SignedSET_encode_der;
xer_type_decoder_f SignedSET_decode_xer;
xer_type_encoder_f SignedSET_encode_xer;

/*** <<< CODE [SignedSET] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_SignedSET_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_TYPE_descriptor_t asn_DEF_SignedSET = {
	"SignedSET",
	"SignedSET",
	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_SignedSET_tags_1,
	sizeof(asn_DEF_SignedSET_tags_1)
		/sizeof(asn_DEF_SignedSET_tags_1[0]), /* 1 */
	asn_DEF_SignedSET_tags_1,	/* Same as above */
	sizeof(asn_DEF_SignedSET_tags_1)
		/sizeof(asn_DEF_SignedSET_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_SIGNED_16P1_3,
	1,	/* Elements count */
	&asn_SPC_SIGNED_16P1_specs_3	/* Additional specs */
};

