
/*** <<< INCLUDES [MinMax] >>> ***/

#include <INTEGER.h>

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

typedef INTEGER_t	 MinMax_16P0_t;

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

extern asn_TYPE_descriptor_t asn_DEF_MinMax_16P0;
asn_struct_free_f MinMax_16P0_free;
asn_struct_print_f MinMax_16P0_print;
asn_constr_check_f MinMax_16P0_constraint;
ber_type_decoder_f MinMax_16P0_decode_ber;
der_type_encoder_f MinMax_16P0_encode_der;
xer_type_decoder_f MinMax_16P0_decode_xer;
xer_type_encoder_f MinMax_16P0_encode_xer;

/*** <<< CODE [MinMax] >>> ***/

int
MinMax_16P0_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const INTEGER_t *st = (const INTEGER_t *)sptr;
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	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 INTEGER,
 * so here we adjust the DEF accordingly.
 */

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

static const ber_tlv_tag_t asn_DEF_MinMax_16P0_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_MinMax_16P0 = {
	"MinMax",
	"MinMax",
	INTEGER_free,
	INTEGER_print,
	INTEGER_compare,
	MinMax_16P0_constraint,
	INTEGER_decode_ber,
	INTEGER_encode_der,
	INTEGER_decode_xer,
	INTEGER_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_MinMax_16P0_tags_1,
	sizeof(asn_DEF_MinMax_16P0_tags_1)
		/sizeof(asn_DEF_MinMax_16P0_tags_1[0]), /* 1 */
	asn_DEF_MinMax_16P0_tags_1,	/* Same as above */
	sizeof(asn_DEF_MinMax_16P0_tags_1)
		/sizeof(asn_DEF_MinMax_16P0_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};


/*** <<< INCLUDES [ThreePlus] >>> ***/

#include "MinMax.h"

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

typedef MinMax_16P0_t	 ThreePlus_t;

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

extern asn_TYPE_descriptor_t asn_DEF_ThreePlus;
asn_struct_free_f ThreePlus_free;
asn_struct_print_f ThreePlus_print;
asn_constr_check_f ThreePlus_constraint;
ber_type_decoder_f ThreePlus_decode_ber;
der_type_encoder_f ThreePlus_encode_der;
xer_type_decoder_f ThreePlus_decode_xer;
xer_type_encoder_f ThreePlus_encode_xer;

/*** <<< CODE [ThreePlus] >>> ***/

int
ThreePlus_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	const MinMax_16P0_t *st = (const MinMax_16P0_t *)sptr;
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(asn_INTEGER2long(st, &value)) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value too large (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	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 MinMax_16P0,
 * so here we adjust the DEF accordingly.
 */

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

static const ber_tlv_tag_t asn_DEF_ThreePlus_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_ThreePlus = {
	"ThreePlus",
	"ThreePlus",
	INTEGER_free,
	INTEGER_print,
	INTEGER_compare,
	ThreePlus_constraint,
	INTEGER_decode_ber,
	INTEGER_encode_der,
	INTEGER_decode_xer,
	INTEGER_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_ThreePlus_tags_1,
	sizeof(asn_DEF_ThreePlus_tags_1)
		/sizeof(asn_DEF_ThreePlus_tags_1[0]), /* 1 */
	asn_DEF_ThreePlus_tags_1,	/* Same as above */
	sizeof(asn_DEF_ThreePlus_tags_1)
		/sizeof(asn_DEF_ThreePlus_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	0	/* No specifics */
};

