/*
 * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
 * Redistribution and modifications are permitted subject to BSD license.
 */
#ifndef _CONSTR_CHOICE_H_
#define _CONSTR_CHOICE_H_

#include <asn_application.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct asn_CHOICE_specifics_s {
  /*
   * Target structure description.
   */
  unsigned struct_size; /* Size of the target structure. */
  unsigned ctx_offset;  /* Offset of the asn_codec_ctx_t member */
  unsigned pres_offset; /* Identifier of the present member */
  unsigned pres_size;   /* Size of the identifier (enum) */

  /*
   * Tags to members mapping table.
   */
  const asn_TYPE_tag2member_t* tag2el;
  unsigned tag2el_count;

  /* Canonical ordering of CHOICE elements, for PER */
  const unsigned* to_canonical_order;
  const unsigned* from_canonical_order;

  /*
   * Extensions-related stuff.
   */
  signed ext_start; /* First member of extensions, or -1 */
} asn_CHOICE_specifics_t;

/*
 * A set specialized functions dealing with the CHOICE type.
 */
asn_struct_free_f CHOICE_free;
asn_struct_print_f CHOICE_print;
asn_struct_compare_f CHOICE_compare;
asn_constr_check_f CHOICE_constraint;
ber_type_decoder_f CHOICE_decode_ber;
der_type_encoder_f CHOICE_encode_der;
xer_type_decoder_f CHOICE_decode_xer;
xer_type_encoder_f CHOICE_encode_xer;
oer_type_decoder_f CHOICE_decode_oer;
oer_type_encoder_f CHOICE_encode_oer;
per_type_decoder_f CHOICE_decode_uper;
per_type_encoder_f CHOICE_encode_uper;
per_type_decoder_f CHOICE_decode_aper;
per_type_encoder_f CHOICE_encode_aper;
asn_outmost_tag_f CHOICE_outmost_tag;
asn_random_fill_f CHOICE_random_fill;
extern asn_TYPE_operation_t asn_OP_CHOICE;

/*
 * Return the 1-based choice variant presence index.
 * Returns 0 in case of error.
 */
unsigned CHOICE_variant_get_presence(
    const asn_TYPE_descriptor_t* td, const void* structure_ptr);

/*
 * Sets or resets the 1-based choice variant presence index.
 * In case a previous index is not zero, the currently selected structure
 * member is freed and zeroed-out first.
 * Returns 0 on success and -1 on error.
 */
int CHOICE_variant_set_presence(
    const asn_TYPE_descriptor_t* td, void* structure_ptr, unsigned present);

#ifdef __cplusplus
}
#endif

#endif /* _CONSTR_CHOICE_H_ */
