// 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 Raw_HH
#define Raw_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"

#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 Raw_HH
#endif

namespace Raw {

/* Forward declarations of classes */

class CAN__RAW__filter;
class CAN__RAW__filter_template;
class DisableEnable__enum;
class DisableEnable__enum_template;

} /* end of namespace */

#ifndef Raw_HH
#define Raw_HH

namespace Raw {

/* Type definitions */

typedef BITSTRING CAN__RAW__err__mask;
typedef BITSTRING_template CAN__RAW__err__mask_template;
typedef DisableEnable__enum CAN__RAW__loopback__enum;
typedef DisableEnable__enum_template CAN__RAW__loopback__enum_template;
typedef DisableEnable__enum CAN__RAW__recv__own__msgs__enum;
typedef DisableEnable__enum_template CAN__RAW__recv__own__msgs__enum_template;
typedef DisableEnable__enum CAN__RAW__fd__frames__enum;
typedef DisableEnable__enum_template CAN__RAW__fd__frames__enum_template;
typedef DisableEnable__enum CAN__RAW__join__filters__enum;
typedef DisableEnable__enum_template CAN__RAW__join__filters__enum_template;

/* Class definitions */

class CAN__RAW__filter {
  OCTETSTRING field_can__id;
  OCTETSTRING field_can__mask;
public:
  CAN__RAW__filter();
  CAN__RAW__filter(const OCTETSTRING& par_can__id,
    const OCTETSTRING& par_can__mask);
  CAN__RAW__filter(const CAN__RAW__filter& other_value);
  inline boolean is_component() { return FALSE; }
  void clean_up();
const TTCN_Typedescriptor_t* get_descriptor() const;
  CAN__RAW__filter& operator=(const CAN__RAW__filter& other_value);
  boolean operator==(const CAN__RAW__filter& other_value) const;
  inline boolean operator!=(const CAN__RAW__filter& 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 OCTETSTRING& can__mask()
    {return field_can__mask;}
  inline const OCTETSTRING& can__mask() const
    {return field_can__mask;}
  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);
};

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

void set_specific();
void copy_value(const CAN__RAW__filter& other_value);
void copy_template(const CAN__RAW__filter_template& other_value);

public:
CAN__RAW__filter_template();
CAN__RAW__filter_template(template_sel other_value);
CAN__RAW__filter_template(const CAN__RAW__filter& other_value);
CAN__RAW__filter_template(const OPTIONAL<CAN__RAW__filter>& other_value);
CAN__RAW__filter_template(const CAN__RAW__filter_template& other_value);
~CAN__RAW__filter_template();
CAN__RAW__filter_template& operator=(template_sel other_value);
CAN__RAW__filter_template& operator=(const CAN__RAW__filter& other_value);
CAN__RAW__filter_template& operator=(const OPTIONAL<CAN__RAW__filter>& other_value);
CAN__RAW__filter_template& operator=(const CAN__RAW__filter_template& other_value);
boolean match(const CAN__RAW__filter& other_value, boolean legacy = FALSE) const;
boolean is_bound() const;
boolean is_value() const;
void clean_up();
CAN__RAW__filter valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
CAN__RAW__filter_template& list_item(unsigned int list_index) const;
OCTETSTRING_template& can__id();
const OCTETSTRING_template& can__id() const;
OCTETSTRING_template& can__mask();
const OCTETSTRING_template& can__mask() const;
int size_of() const;
void log() const;
void log_match(const CAN__RAW__filter& 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 DisableEnable__enum : public Base_Type { // enum
friend class DisableEnable__enum_template;
public:
enum enum_type { Disable = 0, Enable = 1, UNKNOWN_VALUE = 2, UNBOUND_VALUE = 3 };
private:
enum_type enum_value;

public:
DisableEnable__enum();
DisableEnable__enum(int other_value);
DisableEnable__enum(enum_type other_value);
DisableEnable__enum(const DisableEnable__enum& other_value);

DisableEnable__enum& operator=(int other_value);
DisableEnable__enum& operator=(enum_type other_value);
DisableEnable__enum& operator=(const DisableEnable__enum& other_value);

boolean operator==(enum_type other_value) const;
boolean operator==(const DisableEnable__enum& other_value) const;
inline boolean operator!=(enum_type other_value) const { return !(*this == other_value); }
inline boolean operator!=(const DisableEnable__enum& other_value) const { return !(*this == other_value); }
boolean operator<(enum_type other_value) const;
boolean operator<(const DisableEnable__enum& other_value) const;
boolean operator>(enum_type other_value) const;
boolean operator>(const DisableEnable__enum& other_value) const;
inline boolean operator<=(enum_type other_value) const { return !(*this > other_value); }
inline boolean operator<=(const DisableEnable__enum& other_value) const { return !(*this > other_value); }
inline boolean operator>=(enum_type other_value) const { return !(*this < other_value); }
inline boolean operator>=(const DisableEnable__enum& other_value) const { return !(*this < other_value); }

static const char *enum_to_str(enum_type enum_par);
static enum_type str_to_enum(const char *str_par);
static boolean is_valid_enum(int int_par);

static int enum2int(enum_type enum_par);
static int enum2int(const DisableEnable__enum& enum_par);
int as_int() const { return enum2int(enum_value); }
void from_int(int p_val) { *this = p_val; }
void int2enum(int int_val);
operator enum_type() const;
inline boolean is_bound() const { return enum_value != UNBOUND_VALUE; }
inline boolean is_value() const { return enum_value != UNBOUND_VALUE; }
inline void clean_up(){ enum_value = UNBOUND_VALUE; }
inline boolean is_present() const { return is_bound(); }
void log() const;
void set_param(Module_Param& param);
void encode_text(Text_Buf& text_buf) const;
void decode_text(Text_Buf& text_buf);
};

class DisableEnable__enum_template : public Base_Template {
union {
DisableEnable__enum::enum_type single_value;
struct {
unsigned int n_values;
DisableEnable__enum_template *list_value;
} value_list;
};

void copy_template(const DisableEnable__enum_template& other_value);

public:
DisableEnable__enum_template();
DisableEnable__enum_template(template_sel other_value);
DisableEnable__enum_template(int other_value);
DisableEnable__enum_template(DisableEnable__enum::enum_type other_value);
DisableEnable__enum_template(const DisableEnable__enum& other_value);
DisableEnable__enum_template(const OPTIONAL<DisableEnable__enum>& other_value);
DisableEnable__enum_template(const DisableEnable__enum_template& other_value);
~DisableEnable__enum_template();

boolean is_bound() const;
boolean is_value() const;
void clean_up();
DisableEnable__enum_template& operator=(template_sel other_value);
DisableEnable__enum_template& operator=(int other_value);
DisableEnable__enum_template& operator=(DisableEnable__enum::enum_type other_value);
DisableEnable__enum_template& operator=(const DisableEnable__enum& other_value);
DisableEnable__enum_template& operator=(const OPTIONAL<DisableEnable__enum>& other_value);
DisableEnable__enum_template& operator=(const DisableEnable__enum_template& other_value);

boolean match(DisableEnable__enum::enum_type other_value, boolean legacy = FALSE) const;
boolean match(const DisableEnable__enum& other_value, boolean legacy = FALSE) const;
DisableEnable__enum::enum_type valueof() const;
void set_type(template_sel template_type, unsigned int list_length);
DisableEnable__enum_template& list_item(unsigned int list_index);
void log() const;
void log_match(const DisableEnable__enum& 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;
};


/* Global variable declarations */

extern const XERdescriptor_t CAN__RAW__filter_can__id_xer_;
extern const TTCN_OERdescriptor_t CAN__RAW__filter_can__id_oer_;
extern const TTCN_Typedescriptor_t CAN__RAW__filter_can__id_descr_;
extern const XERdescriptor_t CAN__RAW__filter_can__mask_xer_;
extern const TTCN_OERdescriptor_t CAN__RAW__filter_can__mask_oer_;
extern const TTCN_Typedescriptor_t CAN__RAW__filter_can__mask_descr_;
extern const TTCN_Typedescriptor_t CAN__RAW__filter_descr_;
extern const OCTETSTRING& CAN__INV__FILTER;
extern const TTCN_RAWdescriptor_t CAN__RAW__err__mask_raw_;
extern const XERdescriptor_t CAN__RAW__err__mask_xer_;
extern const TTCN_OERdescriptor_t CAN__RAW__err__mask_oer_;
extern const TTCN_Typedescriptor_t CAN__RAW__err__mask_descr_;
extern const TTCN_Typedescriptor_t DisableEnable__enum_descr_;
extern const TTCN_Typedescriptor_t& CAN__RAW__loopback__enum_descr_;
extern const TTCN_Typedescriptor_t& CAN__RAW__recv__own__msgs__enum_descr_;
extern const TTCN_Typedescriptor_t& CAN__RAW__fd__frames__enum_descr_;
extern const TTCN_Typedescriptor_t& CAN__RAW__join__filters__enum_descr_;
extern TTCN_Module module_object;

} /* end of namespace */

#endif
