
/*** <<< 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),
	.tag2el = asn_MAP_SIGNED_16P0_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_SIGNED_16P0 = {
	"SIGNED",
	"SIGNED",
	&asn_OP_SEQUENCE,
	SEQUENCE_constraint,
	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),
	.tag2el = asn_MAP_signed_tag2el_4,
	.tag2el_count = 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",
	&asn_OP_SET,
	SET_constraint,
	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),
	.tag2el = asn_MAP_SIGNED_16P1_tag2el_3,
	.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_SIGNED_16P1 = {
	"SIGNED",
	"SIGNED",
	&asn_OP_SEQUENCE,
	SEQUENCE_constraint,
	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",
	&asn_OP_SEQUENCE,
	SEQUENCE_constraint,
	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",
	&asn_OP_SEQUENCE,
	SEQUENCE_constraint,
	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 */
};

