/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "RANAP-IEs"
 * 	found in "../../asn1/ranap/RANAP-IEs.asn"
 */

#include <osmocom/ranap/RANAP_VelocityEstimate.h>

static asn_per_constraints_t asn_PER_type_RANAP_VelocityEstimate_constr_1 GCC_NOTUSED = {
	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_RANAP_VelocityEstimate_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VelocityEstimate, choice.horizontalVelocity),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_HorizontalVelocity,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"horizontalVelocity"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VelocityEstimate, choice.horizontalWithVerticalVelocity),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_HorizontalWithVerticalVelocity,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"horizontalWithVerticalVelocity"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VelocityEstimate, choice.horizontalVelocityWithUncertainty),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_HorizontalVelocityWithUncertainty,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"horizontalVelocityWithUncertainty"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VelocityEstimate, choice.horizontalWithVeritcalVelocityAndUncertainty),
		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"horizontalWithVeritcalVelocityAndUncertainty"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_VelocityEstimate_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* horizontalVelocity */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* horizontalWithVerticalVelocity */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* horizontalVelocityWithUncertainty */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* horizontalWithVeritcalVelocityAndUncertainty */
};
static asn_CHOICE_specifics_t asn_SPC_RANAP_VelocityEstimate_specs_1 = {
	sizeof(struct RANAP_VelocityEstimate),
	offsetof(struct RANAP_VelocityEstimate, _asn_ctx),
	offsetof(struct RANAP_VelocityEstimate, present),
	sizeof(((struct RANAP_VelocityEstimate *)0)->present),
	asn_MAP_RANAP_VelocityEstimate_tag2el_1,
	4,	/* Count of tags in the map */
	0,
	4	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_VelocityEstimate = {
	"RANAP_VelocityEstimate",
	"RANAP_VelocityEstimate",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	CHOICE_decode_uper,
	CHOICE_encode_uper,
	CHOICE_decode_aper,
	CHOICE_encode_aper,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	&asn_PER_type_RANAP_VelocityEstimate_constr_1,
	asn_MBR_RANAP_VelocityEstimate_1,
	4,	/* Elements count */
	&asn_SPC_RANAP_VelocityEstimate_specs_1	/* Additional specs */
};

