// This C++ header file was generated by the TTCN-3 compiler
// of the TTCN-3 Test Executor version CRL 113 200/6 R6A
// for Lénárd Nagy (elnrnag@elx78355y6x) on Thu Oct 24 10:29:40 2019

// Copyright (c) 2000-2019 Ericsson Telecom AB

// Do not edit this file unless you know what you are doing.

#ifndef CAN__matrix__messages_HH
#define CAN__matrix__messages_HH

#ifdef TITAN_RUNTIME_2
#error Generated code does not match with used runtime.\
 Code was generated without -R option but -DTITAN_RUNTIME_2 was used.
#endif

/* Header file includes */

#include <TTCN3.hh>
#include "Can.hh"
#include "CAN_matrix_signals.hh"

#if TTCN3_VERSION != 60600
#error Version mismatch detected.\
 Please check the version of the TTCN-3 compiler and the base library.\
 Run make clean and rebuild the project if the version of the compiler changed recently.
#endif

#ifndef LINUX
#error This file should be compiled on LINUX
#endif

#undef CAN__matrix__messages_HH
#endif

namespace CAN__matrix__messages {

/* Forward declarations of classes */

class CAN__MESSAGE__TESTFRAME0__msg__type;
class CAN__MESSAGE__TESTFRAME0__msg__type_template;
class CAN__MESSAGE__TESTFRAME1__msg__type;
class CAN__MESSAGE__TESTFRAME1__msg__type_template;
class CAN__MESSAGE__TESTFRAME2__msg__type;
class CAN__MESSAGE__TESTFRAME2__msg__type_template;
class CAN__MESSAGE__TESTFRAME3__msg__type;
class CAN__MESSAGE__TESTFRAME3__msg__type_template;
class CAN__MESSAGE__TESTFRAME4__msg__type;
class CAN__MESSAGE__TESTFRAME4__msg__type_template;
class CAN__MESSAGE__TESTFRAME5__msg__type;
class CAN__MESSAGE__TESTFRAME5__msg__type_template;
class CAN__MESSAGE__EXTENDEDFRAME1__msg__type;
class CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template;
class CAN__MatrixPayloadUnion;
class CAN__MatrixPayloadUnion_template;
class CAN__MatrixUnion;
class CAN__MatrixUnion_template;

} /* end of namespace */

#ifndef CAN__matrix__messages_HH
#define CAN__matrix__messages_HH

namespace CAN__matrix__messages {

/* Class definitions */

class CAN__MESSAGE__TESTFRAME0__msg__type : public Base_Type {
  BITSTRING field_test__sig__11__bit__bitstring__little__endian__coded;
  BITSTRING field_test__sig__5__bit__bitstring__little__endian__coded;
public:
  CAN__MESSAGE__TESTFRAME0__msg__type();
  CAN__MESSAGE__TESTFRAME0__msg__type(const BITSTRING& par_test__sig__11__bit__bitstring__little__endian__coded,
    const BITSTRING& par_test__sig__5__bit__bitstring__little__endian__coded);
  CAN__MESSAGE__TESTFRAME0__msg__type(const CAN__MESSAGE__TESTFRAME0__msg__type& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__MESSAGE__TESTFRAME0__msg__type& operator=(const CAN__MESSAGE__TESTFRAME0__msg__type& other_value);
  boolean operator==(const CAN__MESSAGE__TESTFRAME0__msg__type& other_value) const;
  inline boolean operator!=(const CAN__MESSAGE__TESTFRAME0__msg__type& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& test__sig__11__bit__bitstring__little__endian__coded()
    {return field_test__sig__11__bit__bitstring__little__endian__coded;}
  inline const BITSTRING& test__sig__11__bit__bitstring__little__endian__coded() const
    {return field_test__sig__11__bit__bitstring__little__endian__coded;}
  inline BITSTRING& test__sig__5__bit__bitstring__little__endian__coded()
    {return field_test__sig__5__bit__bitstring__little__endian__coded;}
  inline const BITSTRING& test__sig__5__bit__bitstring__little__endian__coded() const
    {return field_test__sig__5__bit__bitstring__little__endian__coded;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MESSAGE__TESTFRAME0__msg__type_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__MESSAGE__TESTFRAME0__msg__type_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__MESSAGE__TESTFRAME0__msg__type& other_value);
void copy_template(const CAN__MESSAGE__TESTFRAME0__msg__type_template& other_value);

public:
CAN__MESSAGE__TESTFRAME0__msg__type_template();
CAN__MESSAGE__TESTFRAME0__msg__type_template(template_sel other_value);
CAN__MESSAGE__TESTFRAME0__msg__type_template(const CAN__MESSAGE__TESTFRAME0__msg__type& other_value);
CAN__MESSAGE__TESTFRAME0__msg__type_template(const OPTIONAL<CAN__MESSAGE__TESTFRAME0__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME0__msg__type_template(const CAN__MESSAGE__TESTFRAME0__msg__type_template& other_value);
~CAN__MESSAGE__TESTFRAME0__msg__type_template();
CAN__MESSAGE__TESTFRAME0__msg__type_template& operator=(template_sel other_value);
CAN__MESSAGE__TESTFRAME0__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME0__msg__type& other_value);
CAN__MESSAGE__TESTFRAME0__msg__type_template& operator=(const OPTIONAL<CAN__MESSAGE__TESTFRAME0__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME0__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME0__msg__type_template& other_value);
boolean match(const CAN__MESSAGE__TESTFRAME0__msg__type& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__MESSAGE__TESTFRAME0__msg__type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MESSAGE__TESTFRAME0__msg__type_template& list_item(unsigned int list_index) const;
BITSTRING_template& test__sig__11__bit__bitstring__little__endian__coded();
const BITSTRING_template& test__sig__11__bit__bitstring__little__endian__coded() const;
BITSTRING_template& test__sig__5__bit__bitstring__little__endian__coded();
const BITSTRING_template& test__sig__5__bit__bitstring__little__endian__coded() const;
int size_of() const;
void log() const;
void log_match(const CAN__MESSAGE__TESTFRAME0__msg__type& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CAN__MESSAGE__TESTFRAME1__msg__type : public Base_Type {
  BITSTRING field_test__sig__11__bit__bitstring__big__endian__coded;
  BITSTRING field_test__sig__5__bit__bitstring__big__endian__coded;
public:
  CAN__MESSAGE__TESTFRAME1__msg__type();
  CAN__MESSAGE__TESTFRAME1__msg__type(const BITSTRING& par_test__sig__11__bit__bitstring__big__endian__coded,
    const BITSTRING& par_test__sig__5__bit__bitstring__big__endian__coded);
  CAN__MESSAGE__TESTFRAME1__msg__type(const CAN__MESSAGE__TESTFRAME1__msg__type& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__MESSAGE__TESTFRAME1__msg__type& operator=(const CAN__MESSAGE__TESTFRAME1__msg__type& other_value);
  boolean operator==(const CAN__MESSAGE__TESTFRAME1__msg__type& other_value) const;
  inline boolean operator!=(const CAN__MESSAGE__TESTFRAME1__msg__type& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline BITSTRING& test__sig__11__bit__bitstring__big__endian__coded()
    {return field_test__sig__11__bit__bitstring__big__endian__coded;}
  inline const BITSTRING& test__sig__11__bit__bitstring__big__endian__coded() const
    {return field_test__sig__11__bit__bitstring__big__endian__coded;}
  inline BITSTRING& test__sig__5__bit__bitstring__big__endian__coded()
    {return field_test__sig__5__bit__bitstring__big__endian__coded;}
  inline const BITSTRING& test__sig__5__bit__bitstring__big__endian__coded() const
    {return field_test__sig__5__bit__bitstring__big__endian__coded;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MESSAGE__TESTFRAME1__msg__type_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__MESSAGE__TESTFRAME1__msg__type_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__MESSAGE__TESTFRAME1__msg__type& other_value);
void copy_template(const CAN__MESSAGE__TESTFRAME1__msg__type_template& other_value);

public:
CAN__MESSAGE__TESTFRAME1__msg__type_template();
CAN__MESSAGE__TESTFRAME1__msg__type_template(template_sel other_value);
CAN__MESSAGE__TESTFRAME1__msg__type_template(const CAN__MESSAGE__TESTFRAME1__msg__type& other_value);
CAN__MESSAGE__TESTFRAME1__msg__type_template(const OPTIONAL<CAN__MESSAGE__TESTFRAME1__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME1__msg__type_template(const CAN__MESSAGE__TESTFRAME1__msg__type_template& other_value);
~CAN__MESSAGE__TESTFRAME1__msg__type_template();
CAN__MESSAGE__TESTFRAME1__msg__type_template& operator=(template_sel other_value);
CAN__MESSAGE__TESTFRAME1__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME1__msg__type& other_value);
CAN__MESSAGE__TESTFRAME1__msg__type_template& operator=(const OPTIONAL<CAN__MESSAGE__TESTFRAME1__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME1__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME1__msg__type_template& other_value);
boolean match(const CAN__MESSAGE__TESTFRAME1__msg__type& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__MESSAGE__TESTFRAME1__msg__type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MESSAGE__TESTFRAME1__msg__type_template& list_item(unsigned int list_index) const;
BITSTRING_template& test__sig__11__bit__bitstring__big__endian__coded();
const BITSTRING_template& test__sig__11__bit__bitstring__big__endian__coded() const;
BITSTRING_template& test__sig__5__bit__bitstring__big__endian__coded();
const BITSTRING_template& test__sig__5__bit__bitstring__big__endian__coded() const;
int size_of() const;
void log() const;
void log_match(const CAN__MESSAGE__TESTFRAME1__msg__type& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CAN__MESSAGE__TESTFRAME2__msg__type : public Base_Type {
  INTEGER field_test__sig__11__bit__integer__big__endian__coded;
  INTEGER field_test__sig__5__bit__integer__big__endian__coded;
public:
  CAN__MESSAGE__TESTFRAME2__msg__type();
  CAN__MESSAGE__TESTFRAME2__msg__type(const INTEGER& par_test__sig__11__bit__integer__big__endian__coded,
    const INTEGER& par_test__sig__5__bit__integer__big__endian__coded);
  CAN__MESSAGE__TESTFRAME2__msg__type(const CAN__MESSAGE__TESTFRAME2__msg__type& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__MESSAGE__TESTFRAME2__msg__type& operator=(const CAN__MESSAGE__TESTFRAME2__msg__type& other_value);
  boolean operator==(const CAN__MESSAGE__TESTFRAME2__msg__type& other_value) const;
  inline boolean operator!=(const CAN__MESSAGE__TESTFRAME2__msg__type& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline INTEGER& test__sig__11__bit__integer__big__endian__coded()
    {return field_test__sig__11__bit__integer__big__endian__coded;}
  inline const INTEGER& test__sig__11__bit__integer__big__endian__coded() const
    {return field_test__sig__11__bit__integer__big__endian__coded;}
  inline INTEGER& test__sig__5__bit__integer__big__endian__coded()
    {return field_test__sig__5__bit__integer__big__endian__coded;}
  inline const INTEGER& test__sig__5__bit__integer__big__endian__coded() const
    {return field_test__sig__5__bit__integer__big__endian__coded;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MESSAGE__TESTFRAME2__msg__type_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__MESSAGE__TESTFRAME2__msg__type_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__MESSAGE__TESTFRAME2__msg__type& other_value);
void copy_template(const CAN__MESSAGE__TESTFRAME2__msg__type_template& other_value);

public:
CAN__MESSAGE__TESTFRAME2__msg__type_template();
CAN__MESSAGE__TESTFRAME2__msg__type_template(template_sel other_value);
CAN__MESSAGE__TESTFRAME2__msg__type_template(const CAN__MESSAGE__TESTFRAME2__msg__type& other_value);
CAN__MESSAGE__TESTFRAME2__msg__type_template(const OPTIONAL<CAN__MESSAGE__TESTFRAME2__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME2__msg__type_template(const CAN__MESSAGE__TESTFRAME2__msg__type_template& other_value);
~CAN__MESSAGE__TESTFRAME2__msg__type_template();
CAN__MESSAGE__TESTFRAME2__msg__type_template& operator=(template_sel other_value);
CAN__MESSAGE__TESTFRAME2__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME2__msg__type& other_value);
CAN__MESSAGE__TESTFRAME2__msg__type_template& operator=(const OPTIONAL<CAN__MESSAGE__TESTFRAME2__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME2__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME2__msg__type_template& other_value);
boolean match(const CAN__MESSAGE__TESTFRAME2__msg__type& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__MESSAGE__TESTFRAME2__msg__type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MESSAGE__TESTFRAME2__msg__type_template& list_item(unsigned int list_index) const;
INTEGER_template& test__sig__11__bit__integer__big__endian__coded();
const INTEGER_template& test__sig__11__bit__integer__big__endian__coded() const;
INTEGER_template& test__sig__5__bit__integer__big__endian__coded();
const INTEGER_template& test__sig__5__bit__integer__big__endian__coded() const;
int size_of() const;
void log() const;
void log_match(const CAN__MESSAGE__TESTFRAME2__msg__type& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CAN__MESSAGE__TESTFRAME3__msg__type : public Base_Type {
  OCTETSTRING field_test__sig__1__byte__octetstring__big__endian__coded;
  OCTETSTRING field_test__sig__2__byte__octetstring__big__endian__coded;
public:
  CAN__MESSAGE__TESTFRAME3__msg__type();
  CAN__MESSAGE__TESTFRAME3__msg__type(const OCTETSTRING& par_test__sig__1__byte__octetstring__big__endian__coded,
    const OCTETSTRING& par_test__sig__2__byte__octetstring__big__endian__coded);
  CAN__MESSAGE__TESTFRAME3__msg__type(const CAN__MESSAGE__TESTFRAME3__msg__type& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__MESSAGE__TESTFRAME3__msg__type& operator=(const CAN__MESSAGE__TESTFRAME3__msg__type& other_value);
  boolean operator==(const CAN__MESSAGE__TESTFRAME3__msg__type& other_value) const;
  inline boolean operator!=(const CAN__MESSAGE__TESTFRAME3__msg__type& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& test__sig__1__byte__octetstring__big__endian__coded()
    {return field_test__sig__1__byte__octetstring__big__endian__coded;}
  inline const OCTETSTRING& test__sig__1__byte__octetstring__big__endian__coded() const
    {return field_test__sig__1__byte__octetstring__big__endian__coded;}
  inline OCTETSTRING& test__sig__2__byte__octetstring__big__endian__coded()
    {return field_test__sig__2__byte__octetstring__big__endian__coded;}
  inline const OCTETSTRING& test__sig__2__byte__octetstring__big__endian__coded() const
    {return field_test__sig__2__byte__octetstring__big__endian__coded;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MESSAGE__TESTFRAME3__msg__type_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__MESSAGE__TESTFRAME3__msg__type_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__MESSAGE__TESTFRAME3__msg__type& other_value);
void copy_template(const CAN__MESSAGE__TESTFRAME3__msg__type_template& other_value);

public:
CAN__MESSAGE__TESTFRAME3__msg__type_template();
CAN__MESSAGE__TESTFRAME3__msg__type_template(template_sel other_value);
CAN__MESSAGE__TESTFRAME3__msg__type_template(const CAN__MESSAGE__TESTFRAME3__msg__type& other_value);
CAN__MESSAGE__TESTFRAME3__msg__type_template(const OPTIONAL<CAN__MESSAGE__TESTFRAME3__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME3__msg__type_template(const CAN__MESSAGE__TESTFRAME3__msg__type_template& other_value);
~CAN__MESSAGE__TESTFRAME3__msg__type_template();
CAN__MESSAGE__TESTFRAME3__msg__type_template& operator=(template_sel other_value);
CAN__MESSAGE__TESTFRAME3__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME3__msg__type& other_value);
CAN__MESSAGE__TESTFRAME3__msg__type_template& operator=(const OPTIONAL<CAN__MESSAGE__TESTFRAME3__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME3__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME3__msg__type_template& other_value);
boolean match(const CAN__MESSAGE__TESTFRAME3__msg__type& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__MESSAGE__TESTFRAME3__msg__type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MESSAGE__TESTFRAME3__msg__type_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& test__sig__1__byte__octetstring__big__endian__coded();
const OCTETSTRING_template& test__sig__1__byte__octetstring__big__endian__coded() const;
OCTETSTRING_template& test__sig__2__byte__octetstring__big__endian__coded();
const OCTETSTRING_template& test__sig__2__byte__octetstring__big__endian__coded() const;
int size_of() const;
void log() const;
void log_match(const CAN__MESSAGE__TESTFRAME3__msg__type& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CAN__MESSAGE__TESTFRAME4__msg__type : public Base_Type {
  INTEGER field_test__unsig__9__bit__2__padded__integer__big__endian__coded;
  INTEGER field_test__sig__5__bit__integer__big__endian__coded;
public:
  CAN__MESSAGE__TESTFRAME4__msg__type();
  CAN__MESSAGE__TESTFRAME4__msg__type(const INTEGER& par_test__unsig__9__bit__2__padded__integer__big__endian__coded,
    const INTEGER& par_test__sig__5__bit__integer__big__endian__coded);
  CAN__MESSAGE__TESTFRAME4__msg__type(const CAN__MESSAGE__TESTFRAME4__msg__type& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__MESSAGE__TESTFRAME4__msg__type& operator=(const CAN__MESSAGE__TESTFRAME4__msg__type& other_value);
  boolean operator==(const CAN__MESSAGE__TESTFRAME4__msg__type& other_value) const;
  inline boolean operator!=(const CAN__MESSAGE__TESTFRAME4__msg__type& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline INTEGER& test__unsig__9__bit__2__padded__integer__big__endian__coded()
    {return field_test__unsig__9__bit__2__padded__integer__big__endian__coded;}
  inline const INTEGER& test__unsig__9__bit__2__padded__integer__big__endian__coded() const
    {return field_test__unsig__9__bit__2__padded__integer__big__endian__coded;}
  inline INTEGER& test__sig__5__bit__integer__big__endian__coded()
    {return field_test__sig__5__bit__integer__big__endian__coded;}
  inline const INTEGER& test__sig__5__bit__integer__big__endian__coded() const
    {return field_test__sig__5__bit__integer__big__endian__coded;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MESSAGE__TESTFRAME4__msg__type_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__MESSAGE__TESTFRAME4__msg__type_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__MESSAGE__TESTFRAME4__msg__type& other_value);
void copy_template(const CAN__MESSAGE__TESTFRAME4__msg__type_template& other_value);

public:
CAN__MESSAGE__TESTFRAME4__msg__type_template();
CAN__MESSAGE__TESTFRAME4__msg__type_template(template_sel other_value);
CAN__MESSAGE__TESTFRAME4__msg__type_template(const CAN__MESSAGE__TESTFRAME4__msg__type& other_value);
CAN__MESSAGE__TESTFRAME4__msg__type_template(const OPTIONAL<CAN__MESSAGE__TESTFRAME4__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME4__msg__type_template(const CAN__MESSAGE__TESTFRAME4__msg__type_template& other_value);
~CAN__MESSAGE__TESTFRAME4__msg__type_template();
CAN__MESSAGE__TESTFRAME4__msg__type_template& operator=(template_sel other_value);
CAN__MESSAGE__TESTFRAME4__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME4__msg__type& other_value);
CAN__MESSAGE__TESTFRAME4__msg__type_template& operator=(const OPTIONAL<CAN__MESSAGE__TESTFRAME4__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME4__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME4__msg__type_template& other_value);
boolean match(const CAN__MESSAGE__TESTFRAME4__msg__type& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__MESSAGE__TESTFRAME4__msg__type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MESSAGE__TESTFRAME4__msg__type_template& list_item(unsigned int list_index) const;
INTEGER_template& test__unsig__9__bit__2__padded__integer__big__endian__coded();
const INTEGER_template& test__unsig__9__bit__2__padded__integer__big__endian__coded() const;
INTEGER_template& test__sig__5__bit__integer__big__endian__coded();
const INTEGER_template& test__sig__5__bit__integer__big__endian__coded() const;
int size_of() const;
void log() const;
void log_match(const CAN__MESSAGE__TESTFRAME4__msg__type& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CAN__MESSAGE__TESTFRAME5__msg__type : public Base_Type {
  INTEGER field_test__unsig__9__bit__2__padded__integer__big__endian__coded;
  INTEGER field_test__sig__5__bit__integer__big__endian__coded;
public:
  CAN__MESSAGE__TESTFRAME5__msg__type();
  CAN__MESSAGE__TESTFRAME5__msg__type(const INTEGER& par_test__unsig__9__bit__2__padded__integer__big__endian__coded,
    const INTEGER& par_test__sig__5__bit__integer__big__endian__coded);
  CAN__MESSAGE__TESTFRAME5__msg__type(const CAN__MESSAGE__TESTFRAME5__msg__type& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__MESSAGE__TESTFRAME5__msg__type& operator=(const CAN__MESSAGE__TESTFRAME5__msg__type& other_value);
  boolean operator==(const CAN__MESSAGE__TESTFRAME5__msg__type& other_value) const;
  inline boolean operator!=(const CAN__MESSAGE__TESTFRAME5__msg__type& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline INTEGER& test__unsig__9__bit__2__padded__integer__big__endian__coded()
    {return field_test__unsig__9__bit__2__padded__integer__big__endian__coded;}
  inline const INTEGER& test__unsig__9__bit__2__padded__integer__big__endian__coded() const
    {return field_test__unsig__9__bit__2__padded__integer__big__endian__coded;}
  inline INTEGER& test__sig__5__bit__integer__big__endian__coded()
    {return field_test__sig__5__bit__integer__big__endian__coded;}
  inline const INTEGER& test__sig__5__bit__integer__big__endian__coded() const
    {return field_test__sig__5__bit__integer__big__endian__coded;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MESSAGE__TESTFRAME5__msg__type_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__MESSAGE__TESTFRAME5__msg__type_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__MESSAGE__TESTFRAME5__msg__type& other_value);
void copy_template(const CAN__MESSAGE__TESTFRAME5__msg__type_template& other_value);

public:
CAN__MESSAGE__TESTFRAME5__msg__type_template();
CAN__MESSAGE__TESTFRAME5__msg__type_template(template_sel other_value);
CAN__MESSAGE__TESTFRAME5__msg__type_template(const CAN__MESSAGE__TESTFRAME5__msg__type& other_value);
CAN__MESSAGE__TESTFRAME5__msg__type_template(const OPTIONAL<CAN__MESSAGE__TESTFRAME5__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME5__msg__type_template(const CAN__MESSAGE__TESTFRAME5__msg__type_template& other_value);
~CAN__MESSAGE__TESTFRAME5__msg__type_template();
CAN__MESSAGE__TESTFRAME5__msg__type_template& operator=(template_sel other_value);
CAN__MESSAGE__TESTFRAME5__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME5__msg__type& other_value);
CAN__MESSAGE__TESTFRAME5__msg__type_template& operator=(const OPTIONAL<CAN__MESSAGE__TESTFRAME5__msg__type>& other_value);
CAN__MESSAGE__TESTFRAME5__msg__type_template& operator=(const CAN__MESSAGE__TESTFRAME5__msg__type_template& other_value);
boolean match(const CAN__MESSAGE__TESTFRAME5__msg__type& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__MESSAGE__TESTFRAME5__msg__type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MESSAGE__TESTFRAME5__msg__type_template& list_item(unsigned int list_index) const;
INTEGER_template& test__unsig__9__bit__2__padded__integer__big__endian__coded();
const INTEGER_template& test__unsig__9__bit__2__padded__integer__big__endian__coded() const;
INTEGER_template& test__sig__5__bit__integer__big__endian__coded();
const INTEGER_template& test__sig__5__bit__integer__big__endian__coded() const;
int size_of() const;
void log() const;
void log_match(const CAN__MESSAGE__TESTFRAME5__msg__type& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CAN__MESSAGE__EXTENDEDFRAME1__msg__type : public Base_Type {
  OCTETSTRING field_test__sig__2__byte__octetstring__msb__coded;
public:
  CAN__MESSAGE__EXTENDEDFRAME1__msg__type();
  CAN__MESSAGE__EXTENDEDFRAME1__msg__type(const OCTETSTRING& par_test__sig__2__byte__octetstring__msb__coded);
  CAN__MESSAGE__EXTENDEDFRAME1__msg__type(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__MESSAGE__EXTENDEDFRAME1__msg__type& operator=(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& other_value);
  boolean operator==(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& other_value) const;
  inline boolean operator!=(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& test__sig__2__byte__octetstring__msb__coded()
    {return field_test__sig__2__byte__octetstring__msb__coded;}
  inline const OCTETSTRING& test__sig__2__byte__octetstring__msb__coded() const
    {return field_test__sig__2__byte__octetstring__msb__coded;}
  inline int size_of() const
    {return 1;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& other_value);
void copy_template(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& other_value);

public:
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template();
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template(template_sel other_value);
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& other_value);
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template(const OPTIONAL<CAN__MESSAGE__EXTENDEDFRAME1__msg__type>& other_value);
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& other_value);
~CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template();
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& operator=(template_sel other_value);
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& operator=(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& other_value);
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& operator=(const OPTIONAL<CAN__MESSAGE__EXTENDEDFRAME1__msg__type>& other_value);
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& operator=(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& other_value);
boolean match(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__MESSAGE__EXTENDEDFRAME1__msg__type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& test__sig__2__byte__octetstring__msb__coded();
const OCTETSTRING_template& test__sig__2__byte__octetstring__msb__coded() const;
int size_of() const;
void log() const;
void log_match(const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};

class CAN__MatrixPayloadUnion : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_message__MyTestframe0 = 1, ALT_message__MyTestframe1 = 2, ALT_message__MyTestframe2 = 3, ALT_message__MyTestframe3 = 4, ALT_message__MyTestframe4 = 5, ALT_message__MyTestframe5 = 6, ALT_message__extendedFrame1 = 7 };
private:
union_selection_type union_selection;
union {
CAN__MESSAGE__TESTFRAME0__msg__type *field_message__MyTestframe0;
CAN__MESSAGE__TESTFRAME1__msg__type *field_message__MyTestframe1;
CAN__MESSAGE__TESTFRAME2__msg__type *field_message__MyTestframe2;
CAN__MESSAGE__TESTFRAME3__msg__type *field_message__MyTestframe3;
CAN__MESSAGE__TESTFRAME4__msg__type *field_message__MyTestframe4;
CAN__MESSAGE__TESTFRAME5__msg__type *field_message__MyTestframe5;
CAN__MESSAGE__EXTENDEDFRAME1__msg__type *field_message__extendedFrame1;
};
void copy_value(const CAN__MatrixPayloadUnion& other_value);

public:
CAN__MatrixPayloadUnion();
CAN__MatrixPayloadUnion(const CAN__MatrixPayloadUnion& other_value);
~CAN__MatrixPayloadUnion();
CAN__MatrixPayloadUnion& operator=(const CAN__MatrixPayloadUnion& other_value);
boolean operator==(const CAN__MatrixPayloadUnion& other_value) const;
inline boolean operator!=(const CAN__MatrixPayloadUnion& other_value) const { return !(*this == other_value); }
CAN__MESSAGE__TESTFRAME0__msg__type& message__MyTestframe0();
const CAN__MESSAGE__TESTFRAME0__msg__type& message__MyTestframe0() const;
CAN__MESSAGE__TESTFRAME1__msg__type& message__MyTestframe1();
const CAN__MESSAGE__TESTFRAME1__msg__type& message__MyTestframe1() const;
CAN__MESSAGE__TESTFRAME2__msg__type& message__MyTestframe2();
const CAN__MESSAGE__TESTFRAME2__msg__type& message__MyTestframe2() const;
CAN__MESSAGE__TESTFRAME3__msg__type& message__MyTestframe3();
const CAN__MESSAGE__TESTFRAME3__msg__type& message__MyTestframe3() const;
CAN__MESSAGE__TESTFRAME4__msg__type& message__MyTestframe4();
const CAN__MESSAGE__TESTFRAME4__msg__type& message__MyTestframe4() const;
CAN__MESSAGE__TESTFRAME5__msg__type& message__MyTestframe5();
const CAN__MESSAGE__TESTFRAME5__msg__type& message__MyTestframe5() const;
CAN__MESSAGE__EXTENDEDFRAME1__msg__type& message__extendedFrame1();
const CAN__MESSAGE__EXTENDEDFRAME1__msg__type& message__extendedFrame1() const;
inline union_selection_type get_selection() const { return union_selection; }
boolean ischosen(union_selection_type checked_selection) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
  void set_implicit_omit();
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MatrixPayloadUnion_template : public Base_Template {
union {
struct {
CAN__MatrixPayloadUnion::union_selection_type union_selection;
union {
CAN__MESSAGE__TESTFRAME0__msg__type_template *field_message__MyTestframe0;
CAN__MESSAGE__TESTFRAME1__msg__type_template *field_message__MyTestframe1;
CAN__MESSAGE__TESTFRAME2__msg__type_template *field_message__MyTestframe2;
CAN__MESSAGE__TESTFRAME3__msg__type_template *field_message__MyTestframe3;
CAN__MESSAGE__TESTFRAME4__msg__type_template *field_message__MyTestframe4;
CAN__MESSAGE__TESTFRAME5__msg__type_template *field_message__MyTestframe5;
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template *field_message__extendedFrame1;
};
} single_value;
struct {
unsigned int n_values;
CAN__MatrixPayloadUnion_template *list_value;
} value_list;
};
void copy_value(const CAN__MatrixPayloadUnion& other_value);

void copy_template(const CAN__MatrixPayloadUnion_template& other_value);

public:
CAN__MatrixPayloadUnion_template();
CAN__MatrixPayloadUnion_template(template_sel other_value);
CAN__MatrixPayloadUnion_template(const CAN__MatrixPayloadUnion& other_value);
CAN__MatrixPayloadUnion_template(const OPTIONAL<CAN__MatrixPayloadUnion>& other_value);
CAN__MatrixPayloadUnion_template(const CAN__MatrixPayloadUnion_template& other_value);
~CAN__MatrixPayloadUnion_template();
void clean_up();
CAN__MatrixPayloadUnion_template& operator=(template_sel other_value);
CAN__MatrixPayloadUnion_template& operator=(const CAN__MatrixPayloadUnion& other_value);
CAN__MatrixPayloadUnion_template& operator=(const OPTIONAL<CAN__MatrixPayloadUnion>& other_value);
CAN__MatrixPayloadUnion_template& operator=(const CAN__MatrixPayloadUnion_template& other_value);
boolean match(const CAN__MatrixPayloadUnion& other_value, boolean legacy = FALSE) const;
boolean is_value() const;CAN__MatrixPayloadUnion valueof() const;
CAN__MatrixPayloadUnion_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MESSAGE__TESTFRAME0__msg__type_template& message__MyTestframe0();
const CAN__MESSAGE__TESTFRAME0__msg__type_template& message__MyTestframe0() const;
CAN__MESSAGE__TESTFRAME1__msg__type_template& message__MyTestframe1();
const CAN__MESSAGE__TESTFRAME1__msg__type_template& message__MyTestframe1() const;
CAN__MESSAGE__TESTFRAME2__msg__type_template& message__MyTestframe2();
const CAN__MESSAGE__TESTFRAME2__msg__type_template& message__MyTestframe2() const;
CAN__MESSAGE__TESTFRAME3__msg__type_template& message__MyTestframe3();
const CAN__MESSAGE__TESTFRAME3__msg__type_template& message__MyTestframe3() const;
CAN__MESSAGE__TESTFRAME4__msg__type_template& message__MyTestframe4();
const CAN__MESSAGE__TESTFRAME4__msg__type_template& message__MyTestframe4() const;
CAN__MESSAGE__TESTFRAME5__msg__type_template& message__MyTestframe5();
const CAN__MESSAGE__TESTFRAME5__msg__type_template& message__MyTestframe5() const;
CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& message__extendedFrame1();
const CAN__MESSAGE__EXTENDEDFRAME1__msg__type_template& message__extendedFrame1() const;
boolean ischosen(CAN__MatrixPayloadUnion::union_selection_type checked_selection) const;
void log() const;
void log_match(const CAN__MatrixPayloadUnion& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
};

class CAN__MatrixUnion : public Base_Type {
  OCTETSTRING field_can__id;
  CAN__MatrixPayloadUnion field_can__pdu;
public:
  CAN__MatrixUnion();
  CAN__MatrixUnion(const OCTETSTRING& par_can__id,
    const CAN__MatrixPayloadUnion& par_can__pdu);
  CAN__MatrixUnion(const CAN__MatrixUnion& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__MatrixUnion& operator=(const CAN__MatrixUnion& other_value);
  boolean operator==(const CAN__MatrixUnion& other_value) const;
  inline boolean operator!=(const CAN__MatrixUnion& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

inline boolean is_present() const { return is_bound(); }
  boolean is_value() const;

  inline OCTETSTRING& can__id()
    {return field_can__id;}
  inline const OCTETSTRING& can__id() const
    {return field_can__id;}
  inline CAN__MatrixPayloadUnion& can__pdu()
    {return field_can__pdu;}
  inline const CAN__MatrixPayloadUnion& can__pdu() const
    {return field_can__pdu;}
  inline int size_of() const
    {return 2;}
  void log() const;
  void set_param(Module_Param& param);
  void set_implicit_omit();
  void encode_text(Text_Buf& text_buf) const;
  void decode_text(Text_Buf& text_buf);
void encode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...) const;
void decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, TTCN_EncDec::coding_t, ...);
int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const;
int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t, boolean no_err=FALSE,int sel_field=-1, boolean first_call=TRUE, const RAW_Force_Omit* force_omit = NULL);
};

class CAN__MatrixUnion_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__MatrixUnion_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__MatrixUnion& other_value);
void copy_template(const CAN__MatrixUnion_template& other_value);

public:
CAN__MatrixUnion_template();
CAN__MatrixUnion_template(template_sel other_value);
CAN__MatrixUnion_template(const CAN__MatrixUnion& other_value);
CAN__MatrixUnion_template(const OPTIONAL<CAN__MatrixUnion>& other_value);
CAN__MatrixUnion_template(const CAN__MatrixUnion_template& other_value);
~CAN__MatrixUnion_template();
CAN__MatrixUnion_template& operator=(template_sel other_value);
CAN__MatrixUnion_template& operator=(const CAN__MatrixUnion& other_value);
CAN__MatrixUnion_template& operator=(const OPTIONAL<CAN__MatrixUnion>& other_value);
CAN__MatrixUnion_template& operator=(const CAN__MatrixUnion_template& other_value);
boolean match(const CAN__MatrixUnion& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__MatrixUnion valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__MatrixUnion_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& can__id();
const OCTETSTRING_template& can__id() const;
CAN__MatrixPayloadUnion_template& can__pdu();
const CAN__MatrixPayloadUnion_template& can__pdu() const;
int size_of() const;
void log() const;
void log_match(const CAN__MatrixUnion& match_value, boolean legacy = FALSE) const;
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
void set_param(Module_Param& param);
void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const;
boolean is_present(boolean legacy = FALSE) const;
boolean match_omit(boolean legacy = FALSE) const;
};


/* Global variable declarations */

extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_test__sig__11__bit__bitstring__little__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_test__sig__11__bit__bitstring__little__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_test__sig__11__bit__bitstring__little__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_test__sig__11__bit__bitstring__little__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_test__sig__5__bit__bitstring__little__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_test__sig__5__bit__bitstring__little__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_test__sig__5__bit__bitstring__little__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_test__sig__5__bit__bitstring__little__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_raw_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME0__msg__type_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_test__sig__11__bit__bitstring__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_test__sig__11__bit__bitstring__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_test__sig__11__bit__bitstring__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_test__sig__11__bit__bitstring__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_test__sig__5__bit__bitstring__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_test__sig__5__bit__bitstring__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_test__sig__5__bit__bitstring__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_test__sig__5__bit__bitstring__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_raw_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME1__msg__type_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_test__sig__11__bit__integer__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_test__sig__11__bit__integer__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_test__sig__11__bit__integer__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_test__sig__11__bit__integer__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_test__sig__5__bit__integer__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_test__sig__5__bit__integer__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_test__sig__5__bit__integer__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_test__sig__5__bit__integer__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_raw_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME2__msg__type_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_test__sig__1__byte__octetstring__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_test__sig__1__byte__octetstring__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_test__sig__1__byte__octetstring__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_test__sig__1__byte__octetstring__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_test__sig__2__byte__octetstring__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_test__sig__2__byte__octetstring__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_test__sig__2__byte__octetstring__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_test__sig__2__byte__octetstring__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_raw_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME3__msg__type_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_test__unsig__9__bit__2__padded__integer__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_test__unsig__9__bit__2__padded__integer__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_test__unsig__9__bit__2__padded__integer__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_test__unsig__9__bit__2__padded__integer__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_test__sig__5__bit__integer__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_test__sig__5__bit__integer__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_test__sig__5__bit__integer__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_test__sig__5__bit__integer__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_raw_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME4__msg__type_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_test__unsig__9__bit__2__padded__integer__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_test__unsig__9__bit__2__padded__integer__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_test__unsig__9__bit__2__padded__integer__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_test__unsig__9__bit__2__padded__integer__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_test__sig__5__bit__integer__big__endian__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_test__sig__5__bit__integer__big__endian__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_test__sig__5__bit__integer__big__endian__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_test__sig__5__bit__integer__big__endian__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_raw_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__TESTFRAME5__msg__type_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__EXTENDEDFRAME1__msg__type_test__sig__2__byte__octetstring__msb__coded_raw_;
extern const XERdescriptor_t CAN__MESSAGE__EXTENDEDFRAME1__msg__type_test__sig__2__byte__octetstring__msb__coded_xer_;
extern const TTCN_OERdescriptor_t CAN__MESSAGE__EXTENDEDFRAME1__msg__type_test__sig__2__byte__octetstring__msb__coded_oer_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__EXTENDEDFRAME1__msg__type_test__sig__2__byte__octetstring__msb__coded_descr_;
extern const TTCN_RAWdescriptor_t CAN__MESSAGE__EXTENDEDFRAME1__msg__type_raw_;
extern const TTCN_Typedescriptor_t CAN__MESSAGE__EXTENDEDFRAME1__msg__type_descr_;
extern const TTCN_RAWdescriptor_t CAN__MatrixPayloadUnion_raw_;
extern const TTCN_Typedescriptor_t CAN__MatrixPayloadUnion_descr_;
extern const XERdescriptor_t CAN__MatrixUnion_can__id_xer_;
extern const TTCN_OERdescriptor_t CAN__MatrixUnion_can__id_oer_;
extern const TTCN_Typedescriptor_t CAN__MatrixUnion_can__id_descr_;
extern const TTCN_RAWdescriptor_t CAN__MatrixUnion_can__pdu_raw_;
extern const TTCN_Typedescriptor_t CAN__MatrixUnion_can__pdu_descr_;
extern const TTCN_RAWdescriptor_t CAN__MatrixUnion_raw_;
extern const TTCN_Typedescriptor_t CAN__MatrixUnion_descr_;
extern TTCN_Module module_object;

} /* end of namespace */

#endif
