
/*** <<< INCLUDES [UnconstrainedREAL] >>> ***/

#include <NativeReal.h>

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

typedef double	 UnconstrainedREAL_t;

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

extern asn_TYPE_descriptor_t asn_DEF_UnconstrainedREAL;
asn_struct_free_f UnconstrainedREAL_free;
asn_struct_print_f UnconstrainedREAL_print;
asn_constr_check_f UnconstrainedREAL_constraint;
ber_type_decoder_f UnconstrainedREAL_decode_ber;
der_type_encoder_f UnconstrainedREAL_encode_der;
xer_type_decoder_f UnconstrainedREAL_decode_xer;
xer_type_encoder_f UnconstrainedREAL_encode_xer;
per_type_decoder_f UnconstrainedREAL_decode_uper;
per_type_encoder_f UnconstrainedREAL_encode_uper;

/*** <<< CODE [UnconstrainedREAL] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_UnconstrainedREAL_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_UnconstrainedREAL = {
	"UnconstrainedREAL",
	"UnconstrainedREAL",
	&asn_OP_NativeReal,
	asn_DEF_UnconstrainedREAL_tags_1,
	sizeof(asn_DEF_UnconstrainedREAL_tags_1)
		/sizeof(asn_DEF_UnconstrainedREAL_tags_1[0]), /* 1 */
	asn_DEF_UnconstrainedREAL_tags_1,	/* Same as above */
	sizeof(asn_DEF_UnconstrainedREAL_tags_1)
		/sizeof(asn_DEF_UnconstrainedREAL_tags_1[0]), /* 1 */
	{ 0, 0, NativeReal_constraint },
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [WeirdlyConstrainedREAL] >>> ***/

#include <NativeReal.h>

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

typedef double	 WeirdlyConstrainedREAL_t;

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

extern asn_TYPE_descriptor_t asn_DEF_WeirdlyConstrainedREAL;
asn_struct_free_f WeirdlyConstrainedREAL_free;
asn_struct_print_f WeirdlyConstrainedREAL_print;
asn_constr_check_f WeirdlyConstrainedREAL_constraint;
ber_type_decoder_f WeirdlyConstrainedREAL_decode_ber;
der_type_encoder_f WeirdlyConstrainedREAL_encode_der;
xer_type_decoder_f WeirdlyConstrainedREAL_decode_xer;
xer_type_encoder_f WeirdlyConstrainedREAL_encode_xer;
per_type_decoder_f WeirdlyConstrainedREAL_decode_uper;
per_type_encoder_f WeirdlyConstrainedREAL_encode_uper;

/*** <<< CODE [WeirdlyConstrainedREAL] >>> ***/

int
WeirdlyConstrainedREAL_constraint(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	double value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const double *)sptr;
	
	if((value == 3)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

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

/*** <<< CTDEFS [WeirdlyConstrainedREAL] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_WeirdlyConstrainedREAL_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_WeirdlyConstrainedREAL = {
	"WeirdlyConstrainedREAL",
	"WeirdlyConstrainedREAL",
	&asn_OP_NativeReal,
	asn_DEF_WeirdlyConstrainedREAL_tags_1,
	sizeof(asn_DEF_WeirdlyConstrainedREAL_tags_1)
		/sizeof(asn_DEF_WeirdlyConstrainedREAL_tags_1[0]), /* 1 */
	asn_DEF_WeirdlyConstrainedREAL_tags_1,	/* Same as above */
	sizeof(asn_DEF_WeirdlyConstrainedREAL_tags_1)
		/sizeof(asn_DEF_WeirdlyConstrainedREAL_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_WeirdlyConstrainedREAL_constr_1, WeirdlyConstrainedREAL_constraint },
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [Indirect-IEEE-binary32] >>> ***/

#include "UnconstrainedREAL.h"

/*** <<< TYPE-DECLS [Indirect-IEEE-binary32] >>> ***/

typedef UnconstrainedREAL_t	 Indirect_IEEE_binary32_t;

/*** <<< FUNC-DECLS [Indirect-IEEE-binary32] >>> ***/

extern asn_per_constraints_t asn_PER_type_Indirect_IEEE_binary32_constr_1;
extern asn_TYPE_descriptor_t asn_DEF_Indirect_IEEE_binary32;
extern const asn_NativeReal_specifics_t asn_SPC_Indirect_IEEE_binary32_specs_1;
asn_struct_free_f Indirect_IEEE_binary32_free;
asn_struct_print_f Indirect_IEEE_binary32_print;
asn_constr_check_f Indirect_IEEE_binary32_constraint;
ber_type_decoder_f Indirect_IEEE_binary32_decode_ber;
der_type_encoder_f Indirect_IEEE_binary32_encode_der;
xer_type_decoder_f Indirect_IEEE_binary32_decode_xer;
xer_type_encoder_f Indirect_IEEE_binary32_encode_xer;
per_type_decoder_f Indirect_IEEE_binary32_decode_uper;
per_type_encoder_f Indirect_IEEE_binary32_encode_uper;

/*** <<< CODE [Indirect-IEEE-binary32] >>> ***/

int
Indirect_IEEE_binary32_constraint(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);
}

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

/*** <<< CTDEFS [Indirect-IEEE-binary32] >>> ***/

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

/*** <<< STAT-DEFS [Indirect-IEEE-binary32] >>> ***/

const asn_NativeReal_specifics_t asn_SPC_Indirect_IEEE_binary32_specs_1 = {
	4	/* Use 'float' type. */
};
static const ber_tlv_tag_t asn_DEF_Indirect_IEEE_binary32_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Indirect_IEEE_binary32 = {
	"Indirect-IEEE-binary32",
	"Indirect-IEEE-binary32",
	&asn_OP_NativeReal,
	asn_DEF_Indirect_IEEE_binary32_tags_1,
	sizeof(asn_DEF_Indirect_IEEE_binary32_tags_1)
		/sizeof(asn_DEF_Indirect_IEEE_binary32_tags_1[0]), /* 1 */
	asn_DEF_Indirect_IEEE_binary32_tags_1,	/* Same as above */
	sizeof(asn_DEF_Indirect_IEEE_binary32_tags_1)
		/sizeof(asn_DEF_Indirect_IEEE_binary32_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_Indirect_IEEE_binary32_constr_1, Indirect_IEEE_binary32_constraint },
	0, 0,	/* No members */
	&asn_SPC_Indirect_IEEE_binary32_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [IEEE-binary32-w] >>> ***/

#include <NativeReal.h>

/*** <<< TYPE-DECLS [IEEE-binary32-w] >>> ***/

typedef float	 IEEE_binary32_w_t;

/*** <<< FUNC-DECLS [IEEE-binary32-w] >>> ***/

extern asn_per_constraints_t asn_PER_type_IEEE_binary32_w_constr_1;
extern asn_TYPE_descriptor_t asn_DEF_IEEE_binary32_w;
extern const asn_NativeReal_specifics_t asn_SPC_IEEE_binary32_w_specs_1;
asn_struct_free_f IEEE_binary32_w_free;
asn_struct_print_f IEEE_binary32_w_print;
asn_constr_check_f IEEE_binary32_w_constraint;
ber_type_decoder_f IEEE_binary32_w_decode_ber;
der_type_encoder_f IEEE_binary32_w_encode_der;
xer_type_decoder_f IEEE_binary32_w_decode_xer;
xer_type_encoder_f IEEE_binary32_w_encode_xer;
per_type_decoder_f IEEE_binary32_w_decode_uper;
per_type_encoder_f IEEE_binary32_w_encode_uper;

/*** <<< CODE [IEEE-binary32-w] >>> ***/

int
IEEE_binary32_w_constraint(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);
}

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

/*** <<< CTDEFS [IEEE-binary32-w] >>> ***/

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

/*** <<< STAT-DEFS [IEEE-binary32-w] >>> ***/

const asn_NativeReal_specifics_t asn_SPC_IEEE_binary32_w_specs_1 = {
	4	/* Use 'float' type. */
};
static const ber_tlv_tag_t asn_DEF_IEEE_binary32_w_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_IEEE_binary32_w = {
	"IEEE-binary32-w",
	"IEEE-binary32-w",
	&asn_OP_NativeReal,
	asn_DEF_IEEE_binary32_w_tags_1,
	sizeof(asn_DEF_IEEE_binary32_w_tags_1)
		/sizeof(asn_DEF_IEEE_binary32_w_tags_1[0]), /* 1 */
	asn_DEF_IEEE_binary32_w_tags_1,	/* Same as above */
	sizeof(asn_DEF_IEEE_binary32_w_tags_1)
		/sizeof(asn_DEF_IEEE_binary32_w_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_IEEE_binary32_w_constr_1, IEEE_binary32_w_constraint },
	0, 0,	/* No members */
	&asn_SPC_IEEE_binary32_w_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [IEEE-binary32-0w] >>> ***/

#include <NativeReal.h>

/*** <<< TYPE-DECLS [IEEE-binary32-0w] >>> ***/

typedef float	 IEEE_binary32_0w_t;

/*** <<< FUNC-DECLS [IEEE-binary32-0w] >>> ***/

extern asn_per_constraints_t asn_PER_type_IEEE_binary32_0w_constr_1;
extern asn_TYPE_descriptor_t asn_DEF_IEEE_binary32_0w;
extern const asn_NativeReal_specifics_t asn_SPC_IEEE_binary32_0w_specs_1;
asn_struct_free_f IEEE_binary32_0w_free;
asn_struct_print_f IEEE_binary32_0w_print;
asn_constr_check_f IEEE_binary32_0w_constraint;
ber_type_decoder_f IEEE_binary32_0w_decode_ber;
der_type_encoder_f IEEE_binary32_0w_encode_der;
xer_type_decoder_f IEEE_binary32_0w_decode_xer;
xer_type_encoder_f IEEE_binary32_0w_encode_xer;
per_type_decoder_f IEEE_binary32_0w_decode_uper;
per_type_encoder_f IEEE_binary32_0w_encode_uper;

/*** <<< CODE [IEEE-binary32-0w] >>> ***/

int
IEEE_binary32_0w_constraint(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);
}

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

/*** <<< CTDEFS [IEEE-binary32-0w] >>> ***/

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

/*** <<< STAT-DEFS [IEEE-binary32-0w] >>> ***/

const asn_NativeReal_specifics_t asn_SPC_IEEE_binary32_0w_specs_1 = {
	4	/* Use 'float' type. */
};
static const ber_tlv_tag_t asn_DEF_IEEE_binary32_0w_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_IEEE_binary32_0w = {
	"IEEE-binary32-0w",
	"IEEE-binary32-0w",
	&asn_OP_NativeReal,
	asn_DEF_IEEE_binary32_0w_tags_1,
	sizeof(asn_DEF_IEEE_binary32_0w_tags_1)
		/sizeof(asn_DEF_IEEE_binary32_0w_tags_1[0]), /* 1 */
	asn_DEF_IEEE_binary32_0w_tags_1,	/* Same as above */
	sizeof(asn_DEF_IEEE_binary32_0w_tags_1)
		/sizeof(asn_DEF_IEEE_binary32_0w_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_IEEE_binary32_0w_constr_1, IEEE_binary32_0w_constraint },
	0, 0,	/* No members */
	&asn_SPC_IEEE_binary32_0w_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [IEEE-binary32-w0] >>> ***/

#include <NativeReal.h>

/*** <<< TYPE-DECLS [IEEE-binary32-w0] >>> ***/

typedef float	 IEEE_binary32_w0_t;

/*** <<< FUNC-DECLS [IEEE-binary32-w0] >>> ***/

extern asn_per_constraints_t asn_PER_type_IEEE_binary32_w0_constr_1;
extern asn_TYPE_descriptor_t asn_DEF_IEEE_binary32_w0;
extern const asn_NativeReal_specifics_t asn_SPC_IEEE_binary32_w0_specs_1;
asn_struct_free_f IEEE_binary32_w0_free;
asn_struct_print_f IEEE_binary32_w0_print;
asn_constr_check_f IEEE_binary32_w0_constraint;
ber_type_decoder_f IEEE_binary32_w0_decode_ber;
der_type_encoder_f IEEE_binary32_w0_encode_der;
xer_type_decoder_f IEEE_binary32_w0_decode_xer;
xer_type_encoder_f IEEE_binary32_w0_encode_xer;
per_type_decoder_f IEEE_binary32_w0_decode_uper;
per_type_encoder_f IEEE_binary32_w0_encode_uper;

/*** <<< CODE [IEEE-binary32-w0] >>> ***/

int
IEEE_binary32_w0_constraint(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);
}

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

/*** <<< CTDEFS [IEEE-binary32-w0] >>> ***/

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

/*** <<< STAT-DEFS [IEEE-binary32-w0] >>> ***/

const asn_NativeReal_specifics_t asn_SPC_IEEE_binary32_w0_specs_1 = {
	4	/* Use 'float' type. */
};
static const ber_tlv_tag_t asn_DEF_IEEE_binary32_w0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_IEEE_binary32_w0 = {
	"IEEE-binary32-w0",
	"IEEE-binary32-w0",
	&asn_OP_NativeReal,
	asn_DEF_IEEE_binary32_w0_tags_1,
	sizeof(asn_DEF_IEEE_binary32_w0_tags_1)
		/sizeof(asn_DEF_IEEE_binary32_w0_tags_1[0]), /* 1 */
	asn_DEF_IEEE_binary32_w0_tags_1,	/* Same as above */
	sizeof(asn_DEF_IEEE_binary32_w0_tags_1)
		/sizeof(asn_DEF_IEEE_binary32_w0_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_IEEE_binary32_w0_constr_1, IEEE_binary32_w0_constraint },
	0, 0,	/* No members */
	&asn_SPC_IEEE_binary32_w0_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [IEEE-binary64-w] >>> ***/

#include <NativeReal.h>

/*** <<< TYPE-DECLS [IEEE-binary64-w] >>> ***/

typedef double	 IEEE_binary64_w_t;

/*** <<< FUNC-DECLS [IEEE-binary64-w] >>> ***/

extern asn_per_constraints_t asn_PER_type_IEEE_binary64_w_constr_1;
extern asn_TYPE_descriptor_t asn_DEF_IEEE_binary64_w;
asn_struct_free_f IEEE_binary64_w_free;
asn_struct_print_f IEEE_binary64_w_print;
asn_constr_check_f IEEE_binary64_w_constraint;
ber_type_decoder_f IEEE_binary64_w_decode_ber;
der_type_encoder_f IEEE_binary64_w_encode_der;
xer_type_decoder_f IEEE_binary64_w_decode_xer;
xer_type_encoder_f IEEE_binary64_w_encode_xer;
per_type_decoder_f IEEE_binary64_w_decode_uper;
per_type_encoder_f IEEE_binary64_w_encode_uper;

/*** <<< CODE [IEEE-binary64-w] >>> ***/

int
IEEE_binary64_w_constraint(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);
}

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

/*** <<< CTDEFS [IEEE-binary64-w] >>> ***/

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

/*** <<< STAT-DEFS [IEEE-binary64-w] >>> ***/

static const ber_tlv_tag_t asn_DEF_IEEE_binary64_w_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_IEEE_binary64_w = {
	"IEEE-binary64-w",
	"IEEE-binary64-w",
	&asn_OP_NativeReal,
	asn_DEF_IEEE_binary64_w_tags_1,
	sizeof(asn_DEF_IEEE_binary64_w_tags_1)
		/sizeof(asn_DEF_IEEE_binary64_w_tags_1[0]), /* 1 */
	asn_DEF_IEEE_binary64_w_tags_1,	/* Same as above */
	sizeof(asn_DEF_IEEE_binary64_w_tags_1)
		/sizeof(asn_DEF_IEEE_binary64_w_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_IEEE_binary64_w_constr_1, IEEE_binary64_w_constraint },
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [IEEE-binary64-0w] >>> ***/

#include <NativeReal.h>

/*** <<< TYPE-DECLS [IEEE-binary64-0w] >>> ***/

typedef double	 IEEE_binary64_0w_t;

/*** <<< FUNC-DECLS [IEEE-binary64-0w] >>> ***/

extern asn_per_constraints_t asn_PER_type_IEEE_binary64_0w_constr_1;
extern asn_TYPE_descriptor_t asn_DEF_IEEE_binary64_0w;
asn_struct_free_f IEEE_binary64_0w_free;
asn_struct_print_f IEEE_binary64_0w_print;
asn_constr_check_f IEEE_binary64_0w_constraint;
ber_type_decoder_f IEEE_binary64_0w_decode_ber;
der_type_encoder_f IEEE_binary64_0w_encode_der;
xer_type_decoder_f IEEE_binary64_0w_decode_xer;
xer_type_encoder_f IEEE_binary64_0w_encode_xer;
per_type_decoder_f IEEE_binary64_0w_decode_uper;
per_type_encoder_f IEEE_binary64_0w_encode_uper;

/*** <<< CODE [IEEE-binary64-0w] >>> ***/

int
IEEE_binary64_0w_constraint(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);
}

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

/*** <<< CTDEFS [IEEE-binary64-0w] >>> ***/

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

/*** <<< STAT-DEFS [IEEE-binary64-0w] >>> ***/

static const ber_tlv_tag_t asn_DEF_IEEE_binary64_0w_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_IEEE_binary64_0w = {
	"IEEE-binary64-0w",
	"IEEE-binary64-0w",
	&asn_OP_NativeReal,
	asn_DEF_IEEE_binary64_0w_tags_1,
	sizeof(asn_DEF_IEEE_binary64_0w_tags_1)
		/sizeof(asn_DEF_IEEE_binary64_0w_tags_1[0]), /* 1 */
	asn_DEF_IEEE_binary64_0w_tags_1,	/* Same as above */
	sizeof(asn_DEF_IEEE_binary64_0w_tags_1)
		/sizeof(asn_DEF_IEEE_binary64_0w_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_IEEE_binary64_0w_constr_1, IEEE_binary64_0w_constraint },
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [IEEE-binary64-w0] >>> ***/

#include <NativeReal.h>

/*** <<< TYPE-DECLS [IEEE-binary64-w0] >>> ***/

typedef double	 IEEE_binary64_w0_t;

/*** <<< FUNC-DECLS [IEEE-binary64-w0] >>> ***/

extern asn_per_constraints_t asn_PER_type_IEEE_binary64_w0_constr_1;
extern asn_TYPE_descriptor_t asn_DEF_IEEE_binary64_w0;
asn_struct_free_f IEEE_binary64_w0_free;
asn_struct_print_f IEEE_binary64_w0_print;
asn_constr_check_f IEEE_binary64_w0_constraint;
ber_type_decoder_f IEEE_binary64_w0_decode_ber;
der_type_encoder_f IEEE_binary64_w0_encode_der;
xer_type_decoder_f IEEE_binary64_w0_decode_xer;
xer_type_encoder_f IEEE_binary64_w0_encode_xer;
per_type_decoder_f IEEE_binary64_w0_decode_uper;
per_type_encoder_f IEEE_binary64_w0_encode_uper;

/*** <<< CODE [IEEE-binary64-w0] >>> ***/

int
IEEE_binary64_w0_constraint(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);
}

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

/*** <<< CTDEFS [IEEE-binary64-w0] >>> ***/

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

/*** <<< STAT-DEFS [IEEE-binary64-w0] >>> ***/

static const ber_tlv_tag_t asn_DEF_IEEE_binary64_w0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
asn_TYPE_descriptor_t asn_DEF_IEEE_binary64_w0 = {
	"IEEE-binary64-w0",
	"IEEE-binary64-w0",
	&asn_OP_NativeReal,
	asn_DEF_IEEE_binary64_w0_tags_1,
	sizeof(asn_DEF_IEEE_binary64_w0_tags_1)
		/sizeof(asn_DEF_IEEE_binary64_w0_tags_1[0]), /* 1 */
	asn_DEF_IEEE_binary64_w0_tags_1,	/* Same as above */
	sizeof(asn_DEF_IEEE_binary64_w0_tags_1)
		/sizeof(asn_DEF_IEEE_binary64_w0_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_IEEE_binary64_w0_constr_1, IEEE_binary64_w0_constraint },
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [Test] >>> ***/

#include "Indirect-IEEE-binary32.h"
#include "IEEE-binary32-w.h"
#include "IEEE-binary32-0w.h"
#include "IEEE-binary32-w0.h"
#include "IEEE-binary64-w.h"
#include "IEEE-binary64-0w.h"
#include "IEEE-binary64-w0.h"
#include <constr_SEQUENCE.h>

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

typedef struct Test {
	Indirect_IEEE_binary32_t	 indirect_ieee_binary32;
	IEEE_binary32_w_t	 ieee_binary32_w;
	IEEE_binary32_0w_t	 ieee_binary32_0w;
	IEEE_binary32_w0_t	 ieee_binary32_w0;
	IEEE_binary64_w_t	 ieee_binary64_w;
	IEEE_binary64_0w_t	 ieee_binary64_0w;
	IEEE_binary64_w0_t	 ieee_binary64_w0;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Test_t;

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

/* extern asn_TYPE_descriptor_t asn_DEF_indirect_ieee_binary32_2;	// (Use -fall-defs-global to expose) */
/* extern asn_TYPE_descriptor_t asn_DEF_ieee_binary32_w_3;	// (Use -fall-defs-global to expose) */
/* extern asn_TYPE_descriptor_t asn_DEF_ieee_binary32_0w_4;	// (Use -fall-defs-global to expose) */
/* extern asn_TYPE_descriptor_t asn_DEF_ieee_binary32_w0_5;	// (Use -fall-defs-global to expose) */
extern asn_TYPE_descriptor_t asn_DEF_Test;

/*** <<< CODE [Test] >>> ***/

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

/*
 * This type is implemented using Indirect_IEEE_binary32,
 * so here we adjust the DEF accordingly.
 */
static int
ieee_binary32_w_3_constraint(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);
}

/*
 * This type is implemented using IEEE_binary32_w,
 * so here we adjust the DEF accordingly.
 */
static int
ieee_binary32_0w_4_constraint(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);
}

/*
 * This type is implemented using IEEE_binary32_0w,
 * so here we adjust the DEF accordingly.
 */
static int
ieee_binary32_w0_5_constraint(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);
}

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

/*** <<< CTDEFS [Test] >>> ***/

static asn_per_constraints_t asn_PER_type_indirect_ieee_binary32_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_type_ieee_binary32_w_constr_3 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_type_ieee_binary32_0w_constr_4 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_type_ieee_binary32_w0_constr_5 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};

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

static const asn_NativeReal_specifics_t asn_SPC_indirect_ieee_binary32_specs_2 = {
	4	/* Use 'float' type. */
};
static const ber_tlv_tag_t asn_DEF_indirect_ieee_binary32_tags_2[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_indirect_ieee_binary32_2 = {
	"indirect-ieee-binary32",
	"indirect-ieee-binary32",
	&asn_OP_NativeReal,
	asn_DEF_indirect_ieee_binary32_tags_2,
	sizeof(asn_DEF_indirect_ieee_binary32_tags_2)
		/sizeof(asn_DEF_indirect_ieee_binary32_tags_2[0]), /* 1 */
	asn_DEF_indirect_ieee_binary32_tags_2,	/* Same as above */
	sizeof(asn_DEF_indirect_ieee_binary32_tags_2)
		/sizeof(asn_DEF_indirect_ieee_binary32_tags_2[0]), /* 1 */
	{ 0, &asn_PER_type_indirect_ieee_binary32_constr_2, indirect_ieee_binary32_2_constraint },
	0, 0,	/* No members */
	&asn_SPC_indirect_ieee_binary32_specs_2	/* Additional specs */
};

static const asn_NativeReal_specifics_t asn_SPC_ieee_binary32_w_specs_3 = {
	4	/* Use 'float' type. */
};
static const ber_tlv_tag_t asn_DEF_ieee_binary32_w_tags_3[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_ieee_binary32_w_3 = {
	"ieee-binary32-w",
	"ieee-binary32-w",
	&asn_OP_NativeReal,
	asn_DEF_ieee_binary32_w_tags_3,
	sizeof(asn_DEF_ieee_binary32_w_tags_3)
		/sizeof(asn_DEF_ieee_binary32_w_tags_3[0]), /* 1 */
	asn_DEF_ieee_binary32_w_tags_3,	/* Same as above */
	sizeof(asn_DEF_ieee_binary32_w_tags_3)
		/sizeof(asn_DEF_ieee_binary32_w_tags_3[0]), /* 1 */
	{ 0, &asn_PER_type_ieee_binary32_w_constr_3, ieee_binary32_w_3_constraint },
	0, 0,	/* No members */
	&asn_SPC_ieee_binary32_w_specs_3	/* Additional specs */
};

static const asn_NativeReal_specifics_t asn_SPC_ieee_binary32_0w_specs_4 = {
	4	/* Use 'float' type. */
};
static const ber_tlv_tag_t asn_DEF_ieee_binary32_0w_tags_4[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_ieee_binary32_0w_4 = {
	"ieee-binary32-0w",
	"ieee-binary32-0w",
	&asn_OP_NativeReal,
	asn_DEF_ieee_binary32_0w_tags_4,
	sizeof(asn_DEF_ieee_binary32_0w_tags_4)
		/sizeof(asn_DEF_ieee_binary32_0w_tags_4[0]), /* 1 */
	asn_DEF_ieee_binary32_0w_tags_4,	/* Same as above */
	sizeof(asn_DEF_ieee_binary32_0w_tags_4)
		/sizeof(asn_DEF_ieee_binary32_0w_tags_4[0]), /* 1 */
	{ 0, &asn_PER_type_ieee_binary32_0w_constr_4, ieee_binary32_0w_4_constraint },
	0, 0,	/* No members */
	&asn_SPC_ieee_binary32_0w_specs_4	/* Additional specs */
};

static const asn_NativeReal_specifics_t asn_SPC_ieee_binary32_w0_specs_5 = {
	4	/* Use 'float' type. */
};
static const ber_tlv_tag_t asn_DEF_ieee_binary32_w0_tags_5[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (9 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_ieee_binary32_w0_5 = {
	"ieee-binary32-w0",
	"ieee-binary32-w0",
	&asn_OP_NativeReal,
	asn_DEF_ieee_binary32_w0_tags_5,
	sizeof(asn_DEF_ieee_binary32_w0_tags_5)
		/sizeof(asn_DEF_ieee_binary32_w0_tags_5[0]), /* 1 */
	asn_DEF_ieee_binary32_w0_tags_5,	/* Same as above */
	sizeof(asn_DEF_ieee_binary32_w0_tags_5)
		/sizeof(asn_DEF_ieee_binary32_w0_tags_5[0]), /* 1 */
	{ 0, &asn_PER_type_ieee_binary32_w0_constr_5, ieee_binary32_w0_5_constraint },
	0, 0,	/* No members */
	&asn_SPC_ieee_binary32_w0_specs_5	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Test_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Test, indirect_ieee_binary32),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Indirect_IEEE_binary32,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "indirect-ieee-binary32"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Test, ieee_binary32_w),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_IEEE_binary32_w,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "ieee-binary32-w"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Test, ieee_binary32_0w),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_IEEE_binary32_0w,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "ieee-binary32-0w"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Test, ieee_binary32_w0),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_IEEE_binary32_w0,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "ieee-binary32-w0"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Test, ieee_binary64_w),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_IEEE_binary64_w,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "ieee-binary64-w"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Test, ieee_binary64_0w),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_IEEE_binary64_0w,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "ieee-binary64-0w"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Test, ieee_binary64_w0),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_IEEE_binary64_w0,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "ieee-binary64-w0"
		},
};
static const ber_tlv_tag_t asn_DEF_Test_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Test_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 0, 0, 6 }, /* indirect-ieee-binary32 */
    { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 1, -1, 5 }, /* ieee-binary32-w */
    { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 2, -2, 4 }, /* ieee-binary32-0w */
    { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 3, -3, 3 }, /* ieee-binary32-w0 */
    { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 4, -4, 2 }, /* ieee-binary64-w */
    { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 5, -5, 1 }, /* ieee-binary64-0w */
    { (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)), 6, -6, 0 } /* ieee-binary64-w0 */
};
static asn_SEQUENCE_specifics_t asn_SPC_Test_specs_1 = {
	sizeof(struct Test),
	offsetof(struct Test, _asn_ctx),
	.tag2el = asn_MAP_Test_tag2el_1,
	.tag2el_count = 7,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_Test = {
	"Test",
	"Test",
	&asn_OP_SEQUENCE,
	asn_DEF_Test_tags_1,
	sizeof(asn_DEF_Test_tags_1)
		/sizeof(asn_DEF_Test_tags_1[0]), /* 1 */
	asn_DEF_Test_tags_1,	/* Same as above */
	sizeof(asn_DEF_Test_tags_1)
		/sizeof(asn_DEF_Test_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Test_1,
	7,	/* Elements count */
	&asn_SPC_Test_specs_1	/* Additional specs */
};

