
/*** <<< 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,
		.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,
		.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,
		.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 */
};

