// 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 Isobus_HH
#define Isobus_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 "IsobusCMMessageTypes.hh"
#include "IsobusNMMessageTypes.hh"
#include "IsobusVTMessageTypes.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 Isobus_HH
#endif

namespace Isobus {

/* Forward declarations of classes */

class J1939;
class J1939_template;
class J1939mod;
class J1939mod_template;
class AnyIsoBusPdu;
class AnyIsoBusPdu_template;
class CAN__frame__j1939;
class CAN__frame__j1939_template;
class CAN__frame__j1939mod;
class CAN__frame__j1939mod_template;

} /* end of namespace */

#ifndef Isobus_HH
#define Isobus_HH

namespace Isobus {

/* Type definitions */

typedef BITSTRING Priority;
typedef BITSTRING_template Priority_template;

/* Class definitions */

class J1939 : public Base_Type {
  BITSTRING field_prio;
  BITSTRING field_res;
  BITSTRING field_dp;
  OCTETSTRING field_pf;
  OCTETSTRING field_ps;
  OCTETSTRING field_sa;
public:
  J1939();
  J1939(const BITSTRING& par_prio,
    const BITSTRING& par_res,
    const BITSTRING& par_dp,
    const OCTETSTRING& par_pf,
    const OCTETSTRING& par_ps,
    const OCTETSTRING& par_sa);
  J1939(const J1939& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  J1939& operator=(const J1939& other_value);
  boolean operator==(const J1939& other_value) const;
  inline boolean operator!=(const J1939& 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& prio()
    {return field_prio;}
  inline const BITSTRING& prio() const
    {return field_prio;}
  inline BITSTRING& res()
    {return field_res;}
  inline const BITSTRING& res() const
    {return field_res;}
  inline BITSTRING& dp()
    {return field_dp;}
  inline const BITSTRING& dp() const
    {return field_dp;}
  inline OCTETSTRING& pf()
    {return field_pf;}
  inline const OCTETSTRING& pf() const
    {return field_pf;}
  inline OCTETSTRING& ps()
    {return field_ps;}
  inline const OCTETSTRING& ps() const
    {return field_ps;}
  inline OCTETSTRING& sa()
    {return field_sa;}
  inline const OCTETSTRING& sa() const
    {return field_sa;}
  inline int size_of() const
    {return 6;}
  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 J1939_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
J1939_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const J1939& other_value);
void copy_template(const J1939_template& other_value);

public:
J1939_template();
J1939_template(template_sel other_value);
J1939_template(const J1939& other_value);
J1939_template(const OPTIONAL<J1939>& other_value);
J1939_template(const J1939_template& other_value);
~J1939_template();
J1939_template& operator=(template_sel other_value);
J1939_template& operator=(const J1939& other_value);
J1939_template& operator=(const OPTIONAL<J1939>& other_value);
J1939_template& operator=(const J1939_template& other_value);
boolean match(const J1939& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
J1939 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
J1939_template& list_item(unsigned int list_index) const;
BITSTRING_template& prio();
const BITSTRING_template& prio() const;
BITSTRING_template& res();
const BITSTRING_template& res() const;
BITSTRING_template& dp();
const BITSTRING_template& dp() const;
OCTETSTRING_template& pf();
const OCTETSTRING_template& pf() const;
OCTETSTRING_template& ps();
const OCTETSTRING_template& ps() const;
OCTETSTRING_template& sa();
const OCTETSTRING_template& sa() const;
int size_of() const;
void log() const;
void log_match(const J1939& 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 J1939mod : public Base_Type {
  BITSTRING field_prio;
  BITSTRING field_res;
  BITSTRING field_dp;
  OCTETSTRING field_pf;
  OCTETSTRING field_ps;
  OCTETSTRING field_sa;
  OCTETSTRING field_comp;
public:
  J1939mod();
  J1939mod(const BITSTRING& par_prio,
    const BITSTRING& par_res,
    const BITSTRING& par_dp,
    const OCTETSTRING& par_pf,
    const OCTETSTRING& par_ps,
    const OCTETSTRING& par_sa,
    const OCTETSTRING& par_comp);
  J1939mod(const J1939mod& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  J1939mod& operator=(const J1939mod& other_value);
  boolean operator==(const J1939mod& other_value) const;
  inline boolean operator!=(const J1939mod& 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& prio()
    {return field_prio;}
  inline const BITSTRING& prio() const
    {return field_prio;}
  inline BITSTRING& res()
    {return field_res;}
  inline const BITSTRING& res() const
    {return field_res;}
  inline BITSTRING& dp()
    {return field_dp;}
  inline const BITSTRING& dp() const
    {return field_dp;}
  inline OCTETSTRING& pf()
    {return field_pf;}
  inline const OCTETSTRING& pf() const
    {return field_pf;}
  inline OCTETSTRING& ps()
    {return field_ps;}
  inline const OCTETSTRING& ps() const
    {return field_ps;}
  inline OCTETSTRING& sa()
    {return field_sa;}
  inline const OCTETSTRING& sa() const
    {return field_sa;}
  inline OCTETSTRING& comp()
    {return field_comp;}
  inline const OCTETSTRING& comp() const
    {return field_comp;}
  inline int size_of() const
    {return 7;}
  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 J1939mod_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
J1939mod_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const J1939mod& other_value);
void copy_template(const J1939mod_template& other_value);

public:
J1939mod_template();
J1939mod_template(template_sel other_value);
J1939mod_template(const J1939mod& other_value);
J1939mod_template(const OPTIONAL<J1939mod>& other_value);
J1939mod_template(const J1939mod_template& other_value);
~J1939mod_template();
J1939mod_template& operator=(template_sel other_value);
J1939mod_template& operator=(const J1939mod& other_value);
J1939mod_template& operator=(const OPTIONAL<J1939mod>& other_value);
J1939mod_template& operator=(const J1939mod_template& other_value);
boolean match(const J1939mod& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
J1939mod valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
J1939mod_template& list_item(unsigned int list_index) const;
BITSTRING_template& prio();
const BITSTRING_template& prio() const;
BITSTRING_template& res();
const BITSTRING_template& res() const;
BITSTRING_template& dp();
const BITSTRING_template& dp() const;
OCTETSTRING_template& pf();
const OCTETSTRING_template& pf() const;
OCTETSTRING_template& ps();
const OCTETSTRING_template& ps() const;
OCTETSTRING_template& sa();
const OCTETSTRING_template& sa() const;
OCTETSTRING_template& comp();
const OCTETSTRING_template& comp() const;
int size_of() const;
void log() const;
void log_match(const J1939mod& 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 AnyIsoBusPdu : public Base_Type {
public:
enum union_selection_type { UNBOUND_VALUE = 0, ALT_etp__dt = 1, ALT_etp__cm = 2, ALT_vt2ecu = 3, ALT_ecu2vt = 4, ALT_requestForAddressClaimed = 5, ALT_tp__dt = 6, ALT_tp__cm = 7, ALT_networkMessage = 8, ALT_cannotClaimSourceAddress = 9, ALT_addressClaimed = 10, ALT_commandedAddress = 11 };
private:
union_selection_type union_selection;
union {
IsobusCMMessageTypes::ETP__DT *field_etp__dt;
IsobusCMMessageTypes::ETP__CM *field_etp__cm;
IsobusVTMessageTypes::VT2ECU *field_vt2ecu;
IsobusVTMessageTypes::ECU2VT *field_ecu2vt;
IsobusNMMessageTypes::RequestForAddressClaimed *field_requestForAddressClaimed;
IsobusCMMessageTypes::TP__DT *field_tp__dt;
IsobusCMMessageTypes::TP__CM *field_tp__cm;
IsobusNMMessageTypes::NetworkMessage *field_networkMessage;
IsobusNMMessageTypes::CannotClaimSourceAddress *field_cannotClaimSourceAddress;
IsobusNMMessageTypes::AddressClaimed *field_addressClaimed;
IsobusNMMessageTypes::CommandedAddress *field_commandedAddress;
};
void copy_value(const AnyIsoBusPdu& other_value);

public:
AnyIsoBusPdu();
AnyIsoBusPdu(const AnyIsoBusPdu& other_value);
~AnyIsoBusPdu();
AnyIsoBusPdu& operator=(const AnyIsoBusPdu& other_value);
boolean operator==(const AnyIsoBusPdu& other_value) const;
inline boolean operator!=(const AnyIsoBusPdu& other_value) const { return !(*this == other_value); }
IsobusCMMessageTypes::ETP__DT& etp__dt();
const IsobusCMMessageTypes::ETP__DT& etp__dt() const;
IsobusCMMessageTypes::ETP__CM& etp__cm();
const IsobusCMMessageTypes::ETP__CM& etp__cm() const;
IsobusVTMessageTypes::VT2ECU& vt2ecu();
const IsobusVTMessageTypes::VT2ECU& vt2ecu() const;
IsobusVTMessageTypes::ECU2VT& ecu2vt();
const IsobusVTMessageTypes::ECU2VT& ecu2vt() const;
IsobusNMMessageTypes::RequestForAddressClaimed& requestForAddressClaimed();
const IsobusNMMessageTypes::RequestForAddressClaimed& requestForAddressClaimed() const;
IsobusCMMessageTypes::TP__DT& tp__dt();
const IsobusCMMessageTypes::TP__DT& tp__dt() const;
IsobusCMMessageTypes::TP__CM& tp__cm();
const IsobusCMMessageTypes::TP__CM& tp__cm() const;
IsobusNMMessageTypes::NetworkMessage& networkMessage();
const IsobusNMMessageTypes::NetworkMessage& networkMessage() const;
IsobusNMMessageTypes::CannotClaimSourceAddress& cannotClaimSourceAddress();
const IsobusNMMessageTypes::CannotClaimSourceAddress& cannotClaimSourceAddress() const;
IsobusNMMessageTypes::AddressClaimed& addressClaimed();
const IsobusNMMessageTypes::AddressClaimed& addressClaimed() const;
IsobusNMMessageTypes::CommandedAddress& commandedAddress();
const IsobusNMMessageTypes::CommandedAddress& commandedAddress() 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 AnyIsoBusPdu_template : public Base_Template {
union {
struct {
AnyIsoBusPdu::union_selection_type union_selection;
union {
IsobusCMMessageTypes::ETP__DT_template *field_etp__dt;
IsobusCMMessageTypes::ETP__CM_template *field_etp__cm;
IsobusVTMessageTypes::VT2ECU_template *field_vt2ecu;
IsobusVTMessageTypes::ECU2VT_template *field_ecu2vt;
IsobusNMMessageTypes::RequestForAddressClaimed_template *field_requestForAddressClaimed;
IsobusCMMessageTypes::TP__DT_template *field_tp__dt;
IsobusCMMessageTypes::TP__CM_template *field_tp__cm;
IsobusNMMessageTypes::NetworkMessage_template *field_networkMessage;
IsobusNMMessageTypes::CannotClaimSourceAddress_template *field_cannotClaimSourceAddress;
IsobusNMMessageTypes::AddressClaimed_template *field_addressClaimed;
IsobusNMMessageTypes::CommandedAddress_template *field_commandedAddress;
};
} single_value;
struct {
unsigned int n_values;
AnyIsoBusPdu_template *list_value;
} value_list;
};
void copy_value(const AnyIsoBusPdu& other_value);

void copy_template(const AnyIsoBusPdu_template& other_value);

public:
AnyIsoBusPdu_template();
AnyIsoBusPdu_template(template_sel other_value);
AnyIsoBusPdu_template(const AnyIsoBusPdu& other_value);
AnyIsoBusPdu_template(const OPTIONAL<AnyIsoBusPdu>& other_value);
AnyIsoBusPdu_template(const AnyIsoBusPdu_template& other_value);
~AnyIsoBusPdu_template();
void clean_up();
AnyIsoBusPdu_template& operator=(template_sel other_value);
AnyIsoBusPdu_template& operator=(const AnyIsoBusPdu& other_value);
AnyIsoBusPdu_template& operator=(const OPTIONAL<AnyIsoBusPdu>& other_value);
AnyIsoBusPdu_template& operator=(const AnyIsoBusPdu_template& other_value);
boolean match(const AnyIsoBusPdu& other_value, boolean legacy = FALSE) const;
boolean is_value() const;AnyIsoBusPdu valueof() const;
AnyIsoBusPdu_template& list_item(unsigned int list_index) const;
void set_type(template_sel template_type, unsigned int list_length);
IsobusCMMessageTypes::ETP__DT_template& etp__dt();
const IsobusCMMessageTypes::ETP__DT_template& etp__dt() const;
IsobusCMMessageTypes::ETP__CM_template& etp__cm();
const IsobusCMMessageTypes::ETP__CM_template& etp__cm() const;
IsobusVTMessageTypes::VT2ECU_template& vt2ecu();
const IsobusVTMessageTypes::VT2ECU_template& vt2ecu() const;
IsobusVTMessageTypes::ECU2VT_template& ecu2vt();
const IsobusVTMessageTypes::ECU2VT_template& ecu2vt() const;
IsobusNMMessageTypes::RequestForAddressClaimed_template& requestForAddressClaimed();
const IsobusNMMessageTypes::RequestForAddressClaimed_template& requestForAddressClaimed() const;
IsobusCMMessageTypes::TP__DT_template& tp__dt();
const IsobusCMMessageTypes::TP__DT_template& tp__dt() const;
IsobusCMMessageTypes::TP__CM_template& tp__cm();
const IsobusCMMessageTypes::TP__CM_template& tp__cm() const;
IsobusNMMessageTypes::NetworkMessage_template& networkMessage();
const IsobusNMMessageTypes::NetworkMessage_template& networkMessage() const;
IsobusNMMessageTypes::CannotClaimSourceAddress_template& cannotClaimSourceAddress();
const IsobusNMMessageTypes::CannotClaimSourceAddress_template& cannotClaimSourceAddress() const;
IsobusNMMessageTypes::AddressClaimed_template& addressClaimed();
const IsobusNMMessageTypes::AddressClaimed_template& addressClaimed() const;
IsobusNMMessageTypes::CommandedAddress_template& commandedAddress();
const IsobusNMMessageTypes::CommandedAddress_template& commandedAddress() const;
boolean ischosen(AnyIsoBusPdu::union_selection_type checked_selection) const;
void log() const;
void log_match(const AnyIsoBusPdu& 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__frame__j1939 : public Base_Type {
  J1939 field_can__j1939;
  AnyIsoBusPdu field_can__pdu;
public:
  CAN__frame__j1939();
  CAN__frame__j1939(const J1939& par_can__j1939,
    const AnyIsoBusPdu& par_can__pdu);
  CAN__frame__j1939(const CAN__frame__j1939& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__frame__j1939& operator=(const CAN__frame__j1939& other_value);
  boolean operator==(const CAN__frame__j1939& other_value) const;
  inline boolean operator!=(const CAN__frame__j1939& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

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

  inline J1939& can__j1939()
    {return field_can__j1939;}
  inline const J1939& can__j1939() const
    {return field_can__j1939;}
  inline AnyIsoBusPdu& can__pdu()
    {return field_can__pdu;}
  inline const AnyIsoBusPdu& 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__frame__j1939_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__frame__j1939_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__frame__j1939& other_value);
void copy_template(const CAN__frame__j1939_template& other_value);

public:
CAN__frame__j1939_template();
CAN__frame__j1939_template(template_sel other_value);
CAN__frame__j1939_template(const CAN__frame__j1939& other_value);
CAN__frame__j1939_template(const OPTIONAL<CAN__frame__j1939>& other_value);
CAN__frame__j1939_template(const CAN__frame__j1939_template& other_value);
~CAN__frame__j1939_template();
CAN__frame__j1939_template& operator=(template_sel other_value);
CAN__frame__j1939_template& operator=(const CAN__frame__j1939& other_value);
CAN__frame__j1939_template& operator=(const OPTIONAL<CAN__frame__j1939>& other_value);
CAN__frame__j1939_template& operator=(const CAN__frame__j1939_template& other_value);
boolean match(const CAN__frame__j1939& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__frame__j1939 valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__frame__j1939_template& list_item(unsigned int list_index) const;
J1939_template& can__j1939();
const J1939_template& can__j1939() const;
AnyIsoBusPdu_template& can__pdu();
const AnyIsoBusPdu_template& can__pdu() const;
int size_of() const;
void log() const;
void log_match(const CAN__frame__j1939& 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__frame__j1939mod : public Base_Type {
  J1939mod field_can__j1939;
  AnyIsoBusPdu field_can__pdu;
public:
  CAN__frame__j1939mod();
  CAN__frame__j1939mod(const J1939mod& par_can__j1939,
    const AnyIsoBusPdu& par_can__pdu);
  CAN__frame__j1939mod(const CAN__frame__j1939mod& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__frame__j1939mod& operator=(const CAN__frame__j1939mod& other_value);
  boolean operator==(const CAN__frame__j1939mod& other_value) const;
  inline boolean operator!=(const CAN__frame__j1939mod& other_value) const
    { return !(*this == other_value); }

  boolean is_bound() const;

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

  inline J1939mod& can__j1939()
    {return field_can__j1939;}
  inline const J1939mod& can__j1939() const
    {return field_can__j1939;}
  inline AnyIsoBusPdu& can__pdu()
    {return field_can__pdu;}
  inline const AnyIsoBusPdu& 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__frame__j1939mod_template : public Base_Template {
struct single_value_struct;
union {
single_value_struct *single_value;
struct {
unsigned int n_values;
CAN__frame__j1939mod_template *list_value;
} value_list;
};

void set_specific();
void copy_value(const CAN__frame__j1939mod& other_value);
void copy_template(const CAN__frame__j1939mod_template& other_value);

public:
CAN__frame__j1939mod_template();
CAN__frame__j1939mod_template(template_sel other_value);
CAN__frame__j1939mod_template(const CAN__frame__j1939mod& other_value);
CAN__frame__j1939mod_template(const OPTIONAL<CAN__frame__j1939mod>& other_value);
CAN__frame__j1939mod_template(const CAN__frame__j1939mod_template& other_value);
~CAN__frame__j1939mod_template();
CAN__frame__j1939mod_template& operator=(template_sel other_value);
CAN__frame__j1939mod_template& operator=(const CAN__frame__j1939mod& other_value);
CAN__frame__j1939mod_template& operator=(const OPTIONAL<CAN__frame__j1939mod>& other_value);
CAN__frame__j1939mod_template& operator=(const CAN__frame__j1939mod_template& other_value);
boolean match(const CAN__frame__j1939mod& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__frame__j1939mod valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__frame__j1939mod_template& list_item(unsigned int list_index) const;
J1939mod_template& can__j1939();
const J1939mod_template& can__j1939() const;
AnyIsoBusPdu_template& can__pdu();
const AnyIsoBusPdu_template& can__pdu() const;
int size_of() const;
void log() const;
void log_match(const CAN__frame__j1939mod& 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;
};


/* Function prototypes */

extern OCTETSTRING encode__CAN__frame__j1939mod(const CAN__frame__j1939mod& pdu);
extern CAN__frame__j1939mod decode__CAN__frame__j1939mod(const OCTETSTRING& data);
extern Can::CAN__frame j1939frame2can(const CAN__frame__j1939& p__can__frame__j1939, const BITSTRING& p__priority, const OCTETSTRING& p__da, const OCTETSTRING& p__sa);
extern OCTETSTRING pdu1__j1939id2canid(const J1939& p__j1939, const BITSTRING& p__priority, const OCTETSTRING& p__da, const OCTETSTRING& p__sa);
extern OCTETSTRING j1939id2canid(const J1939& p__j1939);
extern CAN__frame__j1939 can2j1939frame(const Can::CAN__frame& p__can__frame);
extern J1939 canid2j1939(const OCTETSTRING& p__can__id);
extern OCTETSTRING f__insert__aux__hdr(const OCTETSTRING& p__os);
extern OCTETSTRING f__remove__aux__hdr(const OCTETSTRING& p__os);
extern CAN__frame__j1939 f__map__mod2frame(const CAN__frame__j1939mod& p__frame);
extern CAN__frame__j1939mod f__map__frame2mod(const CAN__frame__j1939& p__frame);
extern OCTETSTRING f__encode__CAN__frame__j1939(const CAN__frame__j1939& pdu);
extern CAN__frame__j1939 f__decode__CAN__frame__j1939(const OCTETSTRING& data);

/* Global variable declarations */

extern const OCTETSTRING& ISOBUS__PRIORITY__MASK;
extern const OCTETSTRING& ISOBUS__RESERVED__MASK;
extern const OCTETSTRING& ISOBUS__DATAPAGE__MASK;
extern const OCTETSTRING& ISOBUS__PDUFORMAT__MASK;
extern const OCTETSTRING& ISOBUS__PDUSPECIFIC__MASK;
extern const OCTETSTRING& ISOBUS__SOURCEADDRESS__MASK;
extern const TTCN_RAWdescriptor_t Priority_raw_;
extern const XERdescriptor_t Priority_xer_;
extern const TTCN_OERdescriptor_t Priority_oer_;
extern const TTCN_Typedescriptor_t Priority_descr_;
extern const TTCN_RAWdescriptor_t J1939_prio_raw_;
extern const XERdescriptor_t J1939_prio_xer_;
extern const TTCN_OERdescriptor_t J1939_prio_oer_;
extern const TTCN_Typedescriptor_t J1939_prio_descr_;
extern const TTCN_RAWdescriptor_t J1939_res_raw_;
extern const XERdescriptor_t J1939_res_xer_;
extern const TTCN_OERdescriptor_t J1939_res_oer_;
extern const TTCN_Typedescriptor_t J1939_res_descr_;
extern const TTCN_RAWdescriptor_t J1939_dp_raw_;
extern const XERdescriptor_t J1939_dp_xer_;
extern const TTCN_OERdescriptor_t J1939_dp_oer_;
extern const TTCN_Typedescriptor_t J1939_dp_descr_;
extern const TTCN_RAWdescriptor_t J1939_pf_raw_;
extern const XERdescriptor_t J1939_pf_xer_;
extern const TTCN_OERdescriptor_t J1939_pf_oer_;
extern const TTCN_Typedescriptor_t J1939_pf_descr_;
extern const TTCN_RAWdescriptor_t J1939_ps_raw_;
extern const XERdescriptor_t J1939_ps_xer_;
extern const TTCN_OERdescriptor_t J1939_ps_oer_;
extern const TTCN_Typedescriptor_t J1939_ps_descr_;
extern const TTCN_RAWdescriptor_t J1939_sa_raw_;
extern const XERdescriptor_t J1939_sa_xer_;
extern const TTCN_OERdescriptor_t J1939_sa_oer_;
extern const TTCN_Typedescriptor_t J1939_sa_descr_;
extern const TTCN_RAWdescriptor_t J1939_raw_;
extern const TTCN_Typedescriptor_t J1939_descr_;
extern const TTCN_RAWdescriptor_t J1939mod_prio_raw_;
extern const XERdescriptor_t J1939mod_prio_xer_;
extern const TTCN_OERdescriptor_t J1939mod_prio_oer_;
extern const TTCN_Typedescriptor_t J1939mod_prio_descr_;
extern const TTCN_RAWdescriptor_t J1939mod_res_raw_;
extern const XERdescriptor_t J1939mod_res_xer_;
extern const TTCN_OERdescriptor_t J1939mod_res_oer_;
extern const TTCN_Typedescriptor_t J1939mod_res_descr_;
extern const TTCN_RAWdescriptor_t J1939mod_dp_raw_;
extern const XERdescriptor_t J1939mod_dp_xer_;
extern const TTCN_OERdescriptor_t J1939mod_dp_oer_;
extern const TTCN_Typedescriptor_t J1939mod_dp_descr_;
extern const TTCN_RAWdescriptor_t J1939mod_pf_raw_;
extern const XERdescriptor_t J1939mod_pf_xer_;
extern const TTCN_OERdescriptor_t J1939mod_pf_oer_;
extern const TTCN_Typedescriptor_t J1939mod_pf_descr_;
extern const TTCN_RAWdescriptor_t J1939mod_ps_raw_;
extern const XERdescriptor_t J1939mod_ps_xer_;
extern const TTCN_OERdescriptor_t J1939mod_ps_oer_;
extern const TTCN_Typedescriptor_t J1939mod_ps_descr_;
extern const TTCN_RAWdescriptor_t J1939mod_sa_raw_;
extern const XERdescriptor_t J1939mod_sa_xer_;
extern const TTCN_OERdescriptor_t J1939mod_sa_oer_;
extern const TTCN_Typedescriptor_t J1939mod_sa_descr_;
extern const TTCN_RAWdescriptor_t J1939mod_comp_raw_;
extern const XERdescriptor_t J1939mod_comp_xer_;
extern const TTCN_OERdescriptor_t J1939mod_comp_oer_;
extern const TTCN_Typedescriptor_t J1939mod_comp_descr_;
extern const TTCN_RAWdescriptor_t J1939mod_raw_;
extern const TTCN_Typedescriptor_t J1939mod_descr_;
extern const TTCN_RAWdescriptor_t AnyIsoBusPdu_raw_;
extern const TTCN_Typedescriptor_t AnyIsoBusPdu_descr_;
extern const TTCN_RAWdescriptor_t CAN__frame__j1939_raw_;
extern const TTCN_Typedescriptor_t CAN__frame__j1939_descr_;
extern const TTCN_RAWdescriptor_t CAN__frame__j1939mod_can__pdu_raw_;
extern const TTCN_Typedescriptor_t CAN__frame__j1939mod_can__pdu_descr_;
extern const TTCN_RAWdescriptor_t CAN__frame__j1939mod_raw_;
extern const TTCN_Typedescriptor_t CAN__frame__j1939mod_descr_;
extern TTCN_Module module_object;

} /* end of namespace */

#endif
