// This C++ source 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.

/* Including header files */

#include "Can.hh"

namespace Can {

/* Prototypes of static functions */

static void pre_init_module();
static void post_init_module();

/* Literal string constants */

static const unsigned char os_3_octets[] = { 0, 0, 7, 255 },
os_4_octets[] = { 31, 255, 255, 255 },
os_2_octets[] = { 32, 0, 0, 0 },
os_1_octets[] = { 64, 0, 0, 0 },
os_0_octets[] = { 128, 0, 0, 0 };
static const OCTETSTRING os_3(4, os_3_octets),
os_4(4, os_4_octets),
os_2(4, os_2_octets),
os_1(4, os_1_octets),
os_0(4, os_0_octets);
static const unsigned short op_128_elements[] = { 0, 256, 256, 256 },
op_129_elements[] = { 1, 256, 256, 256 },
op_130_elements[] = { 2, 256, 256, 256 },
op_131_elements[] = { 3, 256, 256, 256 },
op_132_elements[] = { 4, 256, 256, 256 },
op_133_elements[] = { 5, 256, 256, 256 },
op_134_elements[] = { 6, 256, 256, 256 },
op_135_elements[] = { 7, 256, 256, 256 },
op_136_elements[] = { 8, 256, 256, 256 },
op_137_elements[] = { 9, 256, 256, 256 },
op_138_elements[] = { 10, 256, 256, 256 },
op_139_elements[] = { 11, 256, 256, 256 },
op_140_elements[] = { 12, 256, 256, 256 },
op_141_elements[] = { 13, 256, 256, 256 },
op_142_elements[] = { 14, 256, 256, 256 },
op_143_elements[] = { 15, 256, 256, 256 },
op_144_elements[] = { 16, 256, 256, 256 },
op_145_elements[] = { 17, 256, 256, 256 },
op_146_elements[] = { 18, 256, 256, 256 },
op_147_elements[] = { 19, 256, 256, 256 },
op_148_elements[] = { 20, 256, 256, 256 },
op_149_elements[] = { 21, 256, 256, 256 },
op_150_elements[] = { 22, 256, 256, 256 },
op_151_elements[] = { 23, 256, 256, 256 },
op_152_elements[] = { 24, 256, 256, 256 },
op_153_elements[] = { 25, 256, 256, 256 },
op_154_elements[] = { 26, 256, 256, 256 },
op_155_elements[] = { 27, 256, 256, 256 },
op_156_elements[] = { 28, 256, 256, 256 },
op_157_elements[] = { 29, 256, 256, 256 },
op_158_elements[] = { 30, 256, 256, 256 },
op_159_elements[] = { 31, 256, 256, 256 },
op_160_elements[] = { 32, 256, 256, 256 },
op_161_elements[] = { 33, 256, 256, 256 },
op_162_elements[] = { 34, 256, 256, 256 },
op_163_elements[] = { 35, 256, 256, 256 },
op_164_elements[] = { 36, 256, 256, 256 },
op_165_elements[] = { 37, 256, 256, 256 },
op_166_elements[] = { 38, 256, 256, 256 },
op_167_elements[] = { 39, 256, 256, 256 },
op_168_elements[] = { 40, 256, 256, 256 },
op_169_elements[] = { 41, 256, 256, 256 },
op_170_elements[] = { 42, 256, 256, 256 },
op_171_elements[] = { 43, 256, 256, 256 },
op_172_elements[] = { 44, 256, 256, 256 },
op_173_elements[] = { 45, 256, 256, 256 },
op_174_elements[] = { 46, 256, 256, 256 },
op_175_elements[] = { 47, 256, 256, 256 },
op_176_elements[] = { 48, 256, 256, 256 },
op_177_elements[] = { 49, 256, 256, 256 },
op_178_elements[] = { 50, 256, 256, 256 },
op_179_elements[] = { 51, 256, 256, 256 },
op_180_elements[] = { 52, 256, 256, 256 },
op_181_elements[] = { 53, 256, 256, 256 },
op_182_elements[] = { 54, 256, 256, 256 },
op_183_elements[] = { 55, 256, 256, 256 },
op_184_elements[] = { 56, 256, 256, 256 },
op_185_elements[] = { 57, 256, 256, 256 },
op_186_elements[] = { 58, 256, 256, 256 },
op_187_elements[] = { 59, 256, 256, 256 },
op_188_elements[] = { 60, 256, 256, 256 },
op_189_elements[] = { 61, 256, 256, 256 },
op_190_elements[] = { 62, 256, 256, 256 },
op_191_elements[] = { 63, 256, 256, 256 },
op_192_elements[] = { 64, 256, 256, 256 },
op_193_elements[] = { 65, 256, 256, 256 },
op_194_elements[] = { 66, 256, 256, 256 },
op_195_elements[] = { 67, 256, 256, 256 },
op_196_elements[] = { 68, 256, 256, 256 },
op_197_elements[] = { 69, 256, 256, 256 },
op_198_elements[] = { 70, 256, 256, 256 },
op_199_elements[] = { 71, 256, 256, 256 },
op_200_elements[] = { 72, 256, 256, 256 },
op_201_elements[] = { 73, 256, 256, 256 },
op_202_elements[] = { 74, 256, 256, 256 },
op_203_elements[] = { 75, 256, 256, 256 },
op_204_elements[] = { 76, 256, 256, 256 },
op_205_elements[] = { 77, 256, 256, 256 },
op_206_elements[] = { 78, 256, 256, 256 },
op_207_elements[] = { 79, 256, 256, 256 },
op_208_elements[] = { 80, 256, 256, 256 },
op_209_elements[] = { 81, 256, 256, 256 },
op_210_elements[] = { 82, 256, 256, 256 },
op_211_elements[] = { 83, 256, 256, 256 },
op_212_elements[] = { 84, 256, 256, 256 },
op_213_elements[] = { 85, 256, 256, 256 },
op_214_elements[] = { 86, 256, 256, 256 },
op_215_elements[] = { 87, 256, 256, 256 },
op_216_elements[] = { 88, 256, 256, 256 },
op_217_elements[] = { 89, 256, 256, 256 },
op_218_elements[] = { 90, 256, 256, 256 },
op_219_elements[] = { 91, 256, 256, 256 },
op_220_elements[] = { 92, 256, 256, 256 },
op_221_elements[] = { 93, 256, 256, 256 },
op_222_elements[] = { 94, 256, 256, 256 },
op_223_elements[] = { 95, 256, 256, 256 },
op_224_elements[] = { 96, 256, 256, 256 },
op_225_elements[] = { 97, 256, 256, 256 },
op_226_elements[] = { 98, 256, 256, 256 },
op_227_elements[] = { 99, 256, 256, 256 },
op_228_elements[] = { 100, 256, 256, 256 },
op_229_elements[] = { 101, 256, 256, 256 },
op_230_elements[] = { 102, 256, 256, 256 },
op_231_elements[] = { 103, 256, 256, 256 },
op_232_elements[] = { 104, 256, 256, 256 },
op_233_elements[] = { 105, 256, 256, 256 },
op_234_elements[] = { 106, 256, 256, 256 },
op_235_elements[] = { 107, 256, 256, 256 },
op_236_elements[] = { 108, 256, 256, 256 },
op_237_elements[] = { 109, 256, 256, 256 },
op_238_elements[] = { 110, 256, 256, 256 },
op_239_elements[] = { 111, 256, 256, 256 },
op_240_elements[] = { 112, 256, 256, 256 },
op_241_elements[] = { 113, 256, 256, 256 },
op_242_elements[] = { 114, 256, 256, 256 },
op_243_elements[] = { 115, 256, 256, 256 },
op_244_elements[] = { 116, 256, 256, 256 },
op_245_elements[] = { 117, 256, 256, 256 },
op_246_elements[] = { 118, 256, 256, 256 },
op_247_elements[] = { 119, 256, 256, 256 },
op_248_elements[] = { 120, 256, 256, 256 },
op_249_elements[] = { 121, 256, 256, 256 },
op_250_elements[] = { 122, 256, 256, 256 },
op_251_elements[] = { 123, 256, 256, 256 },
op_252_elements[] = { 124, 256, 256, 256 },
op_253_elements[] = { 125, 256, 256, 256 },
op_254_elements[] = { 126, 256, 256, 256 },
op_255_elements[] = { 127, 256, 256, 256 },
op_0_elements[] = { 128, 256, 256, 256 },
op_1_elements[] = { 129, 256, 256, 256 },
op_2_elements[] = { 130, 256, 256, 256 },
op_3_elements[] = { 131, 256, 256, 256 },
op_4_elements[] = { 132, 256, 256, 256 },
op_5_elements[] = { 133, 256, 256, 256 },
op_6_elements[] = { 134, 256, 256, 256 },
op_7_elements[] = { 135, 256, 256, 256 },
op_8_elements[] = { 136, 256, 256, 256 },
op_9_elements[] = { 137, 256, 256, 256 },
op_10_elements[] = { 138, 256, 256, 256 },
op_11_elements[] = { 139, 256, 256, 256 },
op_12_elements[] = { 140, 256, 256, 256 },
op_13_elements[] = { 141, 256, 256, 256 },
op_14_elements[] = { 142, 256, 256, 256 },
op_15_elements[] = { 143, 256, 256, 256 },
op_16_elements[] = { 144, 256, 256, 256 },
op_17_elements[] = { 145, 256, 256, 256 },
op_18_elements[] = { 146, 256, 256, 256 },
op_19_elements[] = { 147, 256, 256, 256 },
op_20_elements[] = { 148, 256, 256, 256 },
op_21_elements[] = { 149, 256, 256, 256 },
op_22_elements[] = { 150, 256, 256, 256 },
op_23_elements[] = { 151, 256, 256, 256 },
op_24_elements[] = { 152, 256, 256, 256 },
op_25_elements[] = { 153, 256, 256, 256 },
op_26_elements[] = { 154, 256, 256, 256 },
op_27_elements[] = { 155, 256, 256, 256 },
op_28_elements[] = { 156, 256, 256, 256 },
op_29_elements[] = { 157, 256, 256, 256 },
op_30_elements[] = { 158, 256, 256, 256 },
op_31_elements[] = { 159, 256, 256, 256 },
op_32_elements[] = { 160, 256, 256, 256 },
op_33_elements[] = { 161, 256, 256, 256 },
op_34_elements[] = { 162, 256, 256, 256 },
op_35_elements[] = { 163, 256, 256, 256 },
op_36_elements[] = { 164, 256, 256, 256 },
op_37_elements[] = { 165, 256, 256, 256 },
op_38_elements[] = { 166, 256, 256, 256 },
op_39_elements[] = { 167, 256, 256, 256 },
op_40_elements[] = { 168, 256, 256, 256 },
op_41_elements[] = { 169, 256, 256, 256 },
op_42_elements[] = { 170, 256, 256, 256 },
op_43_elements[] = { 171, 256, 256, 256 },
op_44_elements[] = { 172, 256, 256, 256 },
op_45_elements[] = { 173, 256, 256, 256 },
op_46_elements[] = { 174, 256, 256, 256 },
op_47_elements[] = { 175, 256, 256, 256 },
op_48_elements[] = { 176, 256, 256, 256 },
op_49_elements[] = { 177, 256, 256, 256 },
op_50_elements[] = { 178, 256, 256, 256 },
op_51_elements[] = { 179, 256, 256, 256 },
op_52_elements[] = { 180, 256, 256, 256 },
op_53_elements[] = { 181, 256, 256, 256 },
op_54_elements[] = { 182, 256, 256, 256 },
op_55_elements[] = { 183, 256, 256, 256 },
op_56_elements[] = { 184, 256, 256, 256 },
op_57_elements[] = { 185, 256, 256, 256 },
op_58_elements[] = { 186, 256, 256, 256 },
op_59_elements[] = { 187, 256, 256, 256 },
op_60_elements[] = { 188, 256, 256, 256 },
op_61_elements[] = { 189, 256, 256, 256 },
op_62_elements[] = { 190, 256, 256, 256 },
op_63_elements[] = { 191, 256, 256, 256 },
op_64_elements[] = { 192, 256, 256, 256 },
op_65_elements[] = { 193, 256, 256, 256 },
op_66_elements[] = { 194, 256, 256, 256 },
op_67_elements[] = { 195, 256, 256, 256 },
op_68_elements[] = { 196, 256, 256, 256 },
op_69_elements[] = { 197, 256, 256, 256 },
op_70_elements[] = { 198, 256, 256, 256 },
op_71_elements[] = { 199, 256, 256, 256 },
op_72_elements[] = { 200, 256, 256, 256 },
op_73_elements[] = { 201, 256, 256, 256 },
op_74_elements[] = { 202, 256, 256, 256 },
op_75_elements[] = { 203, 256, 256, 256 },
op_76_elements[] = { 204, 256, 256, 256 },
op_77_elements[] = { 205, 256, 256, 256 },
op_78_elements[] = { 206, 256, 256, 256 },
op_79_elements[] = { 207, 256, 256, 256 },
op_80_elements[] = { 208, 256, 256, 256 },
op_81_elements[] = { 209, 256, 256, 256 },
op_82_elements[] = { 210, 256, 256, 256 },
op_83_elements[] = { 211, 256, 256, 256 },
op_84_elements[] = { 212, 256, 256, 256 },
op_85_elements[] = { 213, 256, 256, 256 },
op_86_elements[] = { 214, 256, 256, 256 },
op_87_elements[] = { 215, 256, 256, 256 },
op_88_elements[] = { 216, 256, 256, 256 },
op_89_elements[] = { 217, 256, 256, 256 },
op_90_elements[] = { 218, 256, 256, 256 },
op_91_elements[] = { 219, 256, 256, 256 },
op_92_elements[] = { 220, 256, 256, 256 },
op_93_elements[] = { 221, 256, 256, 256 },
op_94_elements[] = { 222, 256, 256, 256 },
op_95_elements[] = { 223, 256, 256, 256 },
op_96_elements[] = { 224, 256, 256, 256 },
op_97_elements[] = { 225, 256, 256, 256 },
op_98_elements[] = { 226, 256, 256, 256 },
op_99_elements[] = { 227, 256, 256, 256 },
op_100_elements[] = { 228, 256, 256, 256 },
op_101_elements[] = { 229, 256, 256, 256 },
op_102_elements[] = { 230, 256, 256, 256 },
op_103_elements[] = { 231, 256, 256, 256 },
op_104_elements[] = { 232, 256, 256, 256 },
op_105_elements[] = { 233, 256, 256, 256 },
op_106_elements[] = { 234, 256, 256, 256 },
op_107_elements[] = { 235, 256, 256, 256 },
op_108_elements[] = { 236, 256, 256, 256 },
op_109_elements[] = { 237, 256, 256, 256 },
op_110_elements[] = { 238, 256, 256, 256 },
op_111_elements[] = { 239, 256, 256, 256 },
op_112_elements[] = { 240, 256, 256, 256 },
op_113_elements[] = { 241, 256, 256, 256 },
op_114_elements[] = { 242, 256, 256, 256 },
op_115_elements[] = { 243, 256, 256, 256 },
op_116_elements[] = { 244, 256, 256, 256 },
op_117_elements[] = { 245, 256, 256, 256 },
op_118_elements[] = { 246, 256, 256, 256 },
op_119_elements[] = { 247, 256, 256, 256 },
op_120_elements[] = { 248, 256, 256, 256 },
op_121_elements[] = { 249, 256, 256, 256 },
op_122_elements[] = { 250, 256, 256, 256 },
op_123_elements[] = { 251, 256, 256, 256 },
op_124_elements[] = { 252, 256, 256, 256 },
op_125_elements[] = { 253, 256, 256, 256 },
op_126_elements[] = { 254, 256, 256, 256 },
op_127_elements[] = { 255, 256, 256, 256 };
static const OCTETSTRING_template op_128(4, op_128_elements),
op_129(4, op_129_elements),
op_130(4, op_130_elements),
op_131(4, op_131_elements),
op_132(4, op_132_elements),
op_133(4, op_133_elements),
op_134(4, op_134_elements),
op_135(4, op_135_elements),
op_136(4, op_136_elements),
op_137(4, op_137_elements),
op_138(4, op_138_elements),
op_139(4, op_139_elements),
op_140(4, op_140_elements),
op_141(4, op_141_elements),
op_142(4, op_142_elements),
op_143(4, op_143_elements),
op_144(4, op_144_elements),
op_145(4, op_145_elements),
op_146(4, op_146_elements),
op_147(4, op_147_elements),
op_148(4, op_148_elements),
op_149(4, op_149_elements),
op_150(4, op_150_elements),
op_151(4, op_151_elements),
op_152(4, op_152_elements),
op_153(4, op_153_elements),
op_154(4, op_154_elements),
op_155(4, op_155_elements),
op_156(4, op_156_elements),
op_157(4, op_157_elements),
op_158(4, op_158_elements),
op_159(4, op_159_elements),
op_160(4, op_160_elements),
op_161(4, op_161_elements),
op_162(4, op_162_elements),
op_163(4, op_163_elements),
op_164(4, op_164_elements),
op_165(4, op_165_elements),
op_166(4, op_166_elements),
op_167(4, op_167_elements),
op_168(4, op_168_elements),
op_169(4, op_169_elements),
op_170(4, op_170_elements),
op_171(4, op_171_elements),
op_172(4, op_172_elements),
op_173(4, op_173_elements),
op_174(4, op_174_elements),
op_175(4, op_175_elements),
op_176(4, op_176_elements),
op_177(4, op_177_elements),
op_178(4, op_178_elements),
op_179(4, op_179_elements),
op_180(4, op_180_elements),
op_181(4, op_181_elements),
op_182(4, op_182_elements),
op_183(4, op_183_elements),
op_184(4, op_184_elements),
op_185(4, op_185_elements),
op_186(4, op_186_elements),
op_187(4, op_187_elements),
op_188(4, op_188_elements),
op_189(4, op_189_elements),
op_190(4, op_190_elements),
op_191(4, op_191_elements),
op_192(4, op_192_elements),
op_193(4, op_193_elements),
op_194(4, op_194_elements),
op_195(4, op_195_elements),
op_196(4, op_196_elements),
op_197(4, op_197_elements),
op_198(4, op_198_elements),
op_199(4, op_199_elements),
op_200(4, op_200_elements),
op_201(4, op_201_elements),
op_202(4, op_202_elements),
op_203(4, op_203_elements),
op_204(4, op_204_elements),
op_205(4, op_205_elements),
op_206(4, op_206_elements),
op_207(4, op_207_elements),
op_208(4, op_208_elements),
op_209(4, op_209_elements),
op_210(4, op_210_elements),
op_211(4, op_211_elements),
op_212(4, op_212_elements),
op_213(4, op_213_elements),
op_214(4, op_214_elements),
op_215(4, op_215_elements),
op_216(4, op_216_elements),
op_217(4, op_217_elements),
op_218(4, op_218_elements),
op_219(4, op_219_elements),
op_220(4, op_220_elements),
op_221(4, op_221_elements),
op_222(4, op_222_elements),
op_223(4, op_223_elements),
op_224(4, op_224_elements),
op_225(4, op_225_elements),
op_226(4, op_226_elements),
op_227(4, op_227_elements),
op_228(4, op_228_elements),
op_229(4, op_229_elements),
op_230(4, op_230_elements),
op_231(4, op_231_elements),
op_232(4, op_232_elements),
op_233(4, op_233_elements),
op_234(4, op_234_elements),
op_235(4, op_235_elements),
op_236(4, op_236_elements),
op_237(4, op_237_elements),
op_238(4, op_238_elements),
op_239(4, op_239_elements),
op_240(4, op_240_elements),
op_241(4, op_241_elements),
op_242(4, op_242_elements),
op_243(4, op_243_elements),
op_244(4, op_244_elements),
op_245(4, op_245_elements),
op_246(4, op_246_elements),
op_247(4, op_247_elements),
op_248(4, op_248_elements),
op_249(4, op_249_elements),
op_250(4, op_250_elements),
op_251(4, op_251_elements),
op_252(4, op_252_elements),
op_253(4, op_253_elements),
op_254(4, op_254_elements),
op_255(4, op_255_elements),
op_0(4, op_0_elements),
op_1(4, op_1_elements),
op_2(4, op_2_elements),
op_3(4, op_3_elements),
op_4(4, op_4_elements),
op_5(4, op_5_elements),
op_6(4, op_6_elements),
op_7(4, op_7_elements),
op_8(4, op_8_elements),
op_9(4, op_9_elements),
op_10(4, op_10_elements),
op_11(4, op_11_elements),
op_12(4, op_12_elements),
op_13(4, op_13_elements),
op_14(4, op_14_elements),
op_15(4, op_15_elements),
op_16(4, op_16_elements),
op_17(4, op_17_elements),
op_18(4, op_18_elements),
op_19(4, op_19_elements),
op_20(4, op_20_elements),
op_21(4, op_21_elements),
op_22(4, op_22_elements),
op_23(4, op_23_elements),
op_24(4, op_24_elements),
op_25(4, op_25_elements),
op_26(4, op_26_elements),
op_27(4, op_27_elements),
op_28(4, op_28_elements),
op_29(4, op_29_elements),
op_30(4, op_30_elements),
op_31(4, op_31_elements),
op_32(4, op_32_elements),
op_33(4, op_33_elements),
op_34(4, op_34_elements),
op_35(4, op_35_elements),
op_36(4, op_36_elements),
op_37(4, op_37_elements),
op_38(4, op_38_elements),
op_39(4, op_39_elements),
op_40(4, op_40_elements),
op_41(4, op_41_elements),
op_42(4, op_42_elements),
op_43(4, op_43_elements),
op_44(4, op_44_elements),
op_45(4, op_45_elements),
op_46(4, op_46_elements),
op_47(4, op_47_elements),
op_48(4, op_48_elements),
op_49(4, op_49_elements),
op_50(4, op_50_elements),
op_51(4, op_51_elements),
op_52(4, op_52_elements),
op_53(4, op_53_elements),
op_54(4, op_54_elements),
op_55(4, op_55_elements),
op_56(4, op_56_elements),
op_57(4, op_57_elements),
op_58(4, op_58_elements),
op_59(4, op_59_elements),
op_60(4, op_60_elements),
op_61(4, op_61_elements),
op_62(4, op_62_elements),
op_63(4, op_63_elements),
op_64(4, op_64_elements),
op_65(4, op_65_elements),
op_66(4, op_66_elements),
op_67(4, op_67_elements),
op_68(4, op_68_elements),
op_69(4, op_69_elements),
op_70(4, op_70_elements),
op_71(4, op_71_elements),
op_72(4, op_72_elements),
op_73(4, op_73_elements),
op_74(4, op_74_elements),
op_75(4, op_75_elements),
op_76(4, op_76_elements),
op_77(4, op_77_elements),
op_78(4, op_78_elements),
op_79(4, op_79_elements),
op_80(4, op_80_elements),
op_81(4, op_81_elements),
op_82(4, op_82_elements),
op_83(4, op_83_elements),
op_84(4, op_84_elements),
op_85(4, op_85_elements),
op_86(4, op_86_elements),
op_87(4, op_87_elements),
op_88(4, op_88_elements),
op_89(4, op_89_elements),
op_90(4, op_90_elements),
op_91(4, op_91_elements),
op_92(4, op_92_elements),
op_93(4, op_93_elements),
op_94(4, op_94_elements),
op_95(4, op_95_elements),
op_96(4, op_96_elements),
op_97(4, op_97_elements),
op_98(4, op_98_elements),
op_99(4, op_99_elements),
op_100(4, op_100_elements),
op_101(4, op_101_elements),
op_102(4, op_102_elements),
op_103(4, op_103_elements),
op_104(4, op_104_elements),
op_105(4, op_105_elements),
op_106(4, op_106_elements),
op_107(4, op_107_elements),
op_108(4, op_108_elements),
op_109(4, op_109_elements),
op_110(4, op_110_elements),
op_111(4, op_111_elements),
op_112(4, op_112_elements),
op_113(4, op_113_elements),
op_114(4, op_114_elements),
op_115(4, op_115_elements),
op_116(4, op_116_elements),
op_117(4, op_117_elements),
op_118(4, op_118_elements),
op_119(4, op_119_elements),
op_120(4, op_120_elements),
op_121(4, op_121_elements),
op_122(4, op_122_elements),
op_123(4, op_123_elements),
op_124(4, op_124_elements),
op_125(4, op_125_elements),
op_126(4, op_126_elements),
op_127(4, op_127_elements);
static const unsigned char module_checksum[] = { 0x53, 0x65, 0xa1, 0xba, 0x1c, 0x6d, 0x2a, 0xa6, 0xcc, 0xb6, 0x37, 0x4b, 0xb9, 0x1b, 0xae, 0xe1 };

/* Global variable definitions */

static OCTETSTRING const_CAN__EFF__FLAG;
const OCTETSTRING& CAN__EFF__FLAG = const_CAN__EFF__FLAG;
static OCTETSTRING const_CAN__RTR__FLAG;
const OCTETSTRING& CAN__RTR__FLAG = const_CAN__RTR__FLAG;
static OCTETSTRING const_CAN__ERR__FLAG;
const OCTETSTRING& CAN__ERR__FLAG = const_CAN__ERR__FLAG;
static OCTETSTRING const_CAN__SFF__MASK;
const OCTETSTRING& CAN__SFF__MASK = const_CAN__SFF__MASK;
static OCTETSTRING const_CAN__EFF__MASK;
const OCTETSTRING& CAN__EFF__MASK = const_CAN__EFF__MASK;
static OCTETSTRING const_CAN__ERR__MASK;
const OCTETSTRING& CAN__ERR__MASK = const_CAN__ERR__MASK;
static OCTETSTRING_template template_t__CAN__EFF__FLAG;
const OCTETSTRING_template& t__CAN__EFF__FLAG = template_t__CAN__EFF__FLAG;
static OCTETSTRING_template template_t__CAN__SFF__FLAG;
const OCTETSTRING_template& t__CAN__SFF__FLAG = template_t__CAN__SFF__FLAG;
static OCTETSTRING_template template_t__CAN__RTR__FLAG;
const OCTETSTRING_template& t__CAN__RTR__FLAG = template_t__CAN__RTR__FLAG;
static OCTETSTRING_template template_t__CAN__ERR__FLAG;
const OCTETSTRING_template& t__CAN__ERR__FLAG = template_t__CAN__ERR__FLAG;
// No XER for AdresseFamily__enum
const TTCN_Typedescriptor_t AdresseFamily__enum_descr_ = { "@Can.AdresseFamily_enum", NULL, NULL, NULL, NULL, &ENUMERATED_json_, NULL, NULL, TTCN_Typedescriptor_t::DONTCARE };
static INTEGER const_AF__CAN;
const INTEGER& AF__CAN = const_AF__CAN;
// No XER for ProtocolFamily__enum
const TTCN_Typedescriptor_t ProtocolFamily__enum_descr_ = { "@Can.ProtocolFamily_enum", NULL, NULL, NULL, NULL, &ENUMERATED_json_, NULL, NULL, TTCN_Typedescriptor_t::DONTCARE };
// No XER for PF__CAN__protocols__enum
const TTCN_Typedescriptor_t PF__CAN__protocols__enum_descr_ = { "@Can.PF_CAN_protocols_enum", NULL, NULL, NULL, NULL, &ENUMERATED_json_, NULL, NULL, TTCN_Typedescriptor_t::DONTCARE };
static INTEGER const_CAN__MAX__DLEN;
const INTEGER& CAN__MAX__DLEN = const_CAN__MAX__DLEN;
static INTEGER const_CANFD__MAX__DLEN;
const INTEGER& CANFD__MAX__DLEN = const_CANFD__MAX__DLEN;
const TTCN_RAWdescriptor_t CAN__id_raw_ = {32,SG_NO,ORDER_LSB,ORDER_MSB,ORDER_LSB,ORDER_LSB,EXT_BIT_NO,ORDER_LSB,ORDER_LSB,TOP_BIT_INHERITED,0,0,0,8,0,NULL,-1,CharCoding::UNKNOWN,NULL,false};
const XERdescriptor_t       CAN__id_xer_ = { {"CAN_id>\n", "CAN_id>\n"}, {8, 8}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const int CAN__id_oer_ext_arr_[0] = {};
const int CAN__id_oer_p_[0] = {};
const TTCN_OERdescriptor_t CAN__id_oer_ = { -1, TRUE, 4, FALSE, 0, 0, CAN__id_oer_ext_arr_, 0, CAN__id_oer_p_};
const TTCN_Typedescriptor_t CAN__id_descr_ = { "@Can.CAN_id", &OCTETSTRING_ber_, &CAN__id_raw_, &OCTETSTRING_text_, &CAN__id_xer_, &OCTETSTRING_json_, &CAN__id_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const TTCN_RAWdescriptor_t CAN__flags_raw_ = {8,SG_NO,ORDER_LSB,ORDER_LSB,ORDER_LSB,ORDER_LSB,EXT_BIT_NO,ORDER_LSB,ORDER_LSB,TOP_BIT_INHERITED,0,0,0,8,0,NULL,-1,CharCoding::UNKNOWN,NULL,false};
const XERdescriptor_t       CAN__flags_xer_ = { {"CAN_flags>\n", "CAN_flags>\n"}, {11, 11}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const TTCN_OERdescriptor_t CAN__flags_oer_ = { -1, FALSE, -1, FALSE, 0, 0, NULL, 0, NULL };
const TTCN_Typedescriptor_t CAN__flags_descr_ = { "@Can.CAN_flags", &BITSTRING_ber_, &CAN__flags_raw_, NULL, &CAN__flags_xer_, &BITSTRING_json_, &CAN__flags_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const XERdescriptor_t       CAN__PDU_xer_ = { {"CAN_PDU>\n", "CAN_PDU>\n"}, {9, 9}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const int CAN__PDU_oer_ext_arr_[0] = {};
const int CAN__PDU_oer_p_[0] = {};
const TTCN_OERdescriptor_t CAN__PDU_oer_ = { -1, TRUE, -1, FALSE, 0, 0, CAN__PDU_oer_ext_arr_, 0, CAN__PDU_oer_p_};
const TTCN_Typedescriptor_t CAN__PDU_descr_ = { "@Can.CAN_PDU", &OCTETSTRING_ber_, &OCTETSTRING_raw_, &OCTETSTRING_text_, &CAN__PDU_xer_, &OCTETSTRING_json_, &CAN__PDU_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const XERdescriptor_t       CAN__frame_can__id_xer_ = { {"can_id>\n", "can_id>\n"}, {8, 8}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const int CAN__frame_can__id_oer_ext_arr_[0] = {};
const int CAN__frame_can__id_oer_p_[0] = {};
const TTCN_OERdescriptor_t CAN__frame_can__id_oer_ = { -1, TRUE, 4, FALSE, 0, 0, CAN__frame_can__id_oer_ext_arr_, 0, CAN__frame_can__id_oer_p_};
const TTCN_Typedescriptor_t CAN__frame_can__id_descr_ = { "@Can.CAN_frame.can_id", &OCTETSTRING_ber_, &CAN__id_raw_, &OCTETSTRING_text_, &CAN__frame_can__id_xer_, &OCTETSTRING_json_, &CAN__frame_can__id_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const XERdescriptor_t       CAN__frame_can__pdu_xer_ = { {"can_pdu>\n", "can_pdu>\n"}, {9, 9}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const int CAN__frame_can__pdu_oer_ext_arr_[0] = {};
const int CAN__frame_can__pdu_oer_p_[0] = {};
const TTCN_OERdescriptor_t CAN__frame_can__pdu_oer_ = { -1, TRUE, -1, FALSE, 0, 0, CAN__frame_can__pdu_oer_ext_arr_, 0, CAN__frame_can__pdu_oer_p_};
const TTCN_Typedescriptor_t CAN__frame_can__pdu_descr_ = { "@Can.CAN_frame.can_pdu", &OCTETSTRING_ber_, &OCTETSTRING_raw_, &OCTETSTRING_text_, &CAN__frame_can__pdu_xer_, &OCTETSTRING_json_, &CAN__frame_can__pdu_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
// No XER for CAN__frame
const TTCN_Typedescriptor_t CAN__frame_descr_ = { "@Can.CAN_frame", NULL, NULL, NULL, NULL, NULL, NULL, NULL, TTCN_Typedescriptor_t::DONTCARE };
const XERdescriptor_t       CANFD__frame_can__id_xer_ = { {"can_id>\n", "can_id>\n"}, {8, 8}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const int CANFD__frame_can__id_oer_ext_arr_[0] = {};
const int CANFD__frame_can__id_oer_p_[0] = {};
const TTCN_OERdescriptor_t CANFD__frame_can__id_oer_ = { -1, TRUE, 4, FALSE, 0, 0, CANFD__frame_can__id_oer_ext_arr_, 0, CANFD__frame_can__id_oer_p_};
const TTCN_Typedescriptor_t CANFD__frame_can__id_descr_ = { "@Can.CANFD_frame.can_id", &OCTETSTRING_ber_, &CAN__id_raw_, &OCTETSTRING_text_, &CANFD__frame_can__id_xer_, &OCTETSTRING_json_, &CANFD__frame_can__id_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const XERdescriptor_t       CANFD__frame_can__flags_xer_ = { {"can_flags>\n", "can_flags>\n"}, {11, 11}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const TTCN_OERdescriptor_t CANFD__frame_can__flags_oer_ = { -1, FALSE, -1, FALSE, 0, 0, NULL, 0, NULL };
const TTCN_Typedescriptor_t CANFD__frame_can__flags_descr_ = { "@Can.CANFD_frame.can_flags", &BITSTRING_ber_, &CAN__flags_raw_, NULL, &CANFD__frame_can__flags_xer_, &BITSTRING_json_, &CANFD__frame_can__flags_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
const XERdescriptor_t       CANFD__frame_can__pdu_xer_ = { {"can_pdu>\n", "can_pdu>\n"}, {9, 9}, 0 |FORM_UNQUALIFIED, WHITESPACE_PRESERVE,  NULL, &module_object, -1, 0, NULL, NULL, -1, XSD_NONE };
const int CANFD__frame_can__pdu_oer_ext_arr_[0] = {};
const int CANFD__frame_can__pdu_oer_p_[0] = {};
const TTCN_OERdescriptor_t CANFD__frame_can__pdu_oer_ = { -1, TRUE, -1, FALSE, 0, 0, CANFD__frame_can__pdu_oer_ext_arr_, 0, CANFD__frame_can__pdu_oer_p_};
const TTCN_Typedescriptor_t CANFD__frame_can__pdu_descr_ = { "@Can.CANFD_frame.can_pdu", &OCTETSTRING_ber_, &OCTETSTRING_raw_, &OCTETSTRING_text_, &CANFD__frame_can__pdu_xer_, &OCTETSTRING_json_, &CANFD__frame_can__pdu_oer_, NULL, TTCN_Typedescriptor_t::DONTCARE };
// No XER for CANFD__frame
const TTCN_Typedescriptor_t CANFD__frame_descr_ = { "@Can.CANFD_frame", NULL, NULL, NULL, NULL, NULL, NULL, NULL, TTCN_Typedescriptor_t::DONTCARE };
TTCN_Module module_object("Can", __DATE__, __TIME__, module_checksum, pre_init_module, NULL, 0U, 4294967295U, 4294967295U, 4294967295U, NULL, 0LU, 0, post_init_module, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

static const RuntimeVersionChecker ver_checker(  current_runtime_version.requires_major_version_6,
  current_runtime_version.requires_minor_version_6,
  current_runtime_version.requires_patch_level_0,  current_runtime_version.requires_runtime_1);

/* Member functions of C++ classes */

AdresseFamily__enum::AdresseFamily__enum()
{
enum_value = UNBOUND_VALUE;
}

AdresseFamily__enum::AdresseFamily__enum(int other_value)
{
if (!is_valid_enum(other_value)) TTCN_error("Initializing a variable of enumerated type @Can.AdresseFamily_enum with invalid numeric value %d.", other_value);
enum_value = (enum_type)other_value;
}

AdresseFamily__enum::AdresseFamily__enum(enum_type other_value)
{
enum_value = other_value;
}

AdresseFamily__enum::AdresseFamily__enum(const AdresseFamily__enum& other_value)
: Base_Type()
{
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("Copying an unbound value of enumerated type @Can.AdresseFamily_enum.");
enum_value = other_value.enum_value;
}

AdresseFamily__enum& AdresseFamily__enum::operator=(int other_value)
{
if (!is_valid_enum(other_value)) TTCN_error("Assigning unknown numeric value %d to a variable of enumerated type @Can.AdresseFamily_enum.", other_value);
enum_value = (enum_type)other_value;
return *this;
}

AdresseFamily__enum& AdresseFamily__enum::operator=(enum_type other_value)
{
enum_value = other_value;
return *this;
}

AdresseFamily__enum& AdresseFamily__enum::operator=(const AdresseFamily__enum& other_value)
{
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("Assignment of an unbound value of enumerated type @Can.AdresseFamily_enum.");
enum_value = other_value.enum_value;
return *this;
}

boolean AdresseFamily__enum::operator==(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
return enum_value == other_value;
}

boolean AdresseFamily__enum::operator==(const AdresseFamily__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
return enum_value == other_value.enum_value;
}

boolean AdresseFamily__enum::operator<(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
return enum_value < other_value;
}

boolean AdresseFamily__enum::operator<(const AdresseFamily__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
return enum_value < other_value.enum_value;
}

boolean AdresseFamily__enum::operator>(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
return enum_value > other_value;
}

boolean AdresseFamily__enum::operator>(const AdresseFamily__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.AdresseFamily_enum.");
return enum_value > other_value.enum_value;
}

const char *AdresseFamily__enum::enum_to_str(enum_type enum_par)
{
switch (enum_par) {
case PF__CAN: return "PF_CAN";
default: return "<unknown>";
}
}

AdresseFamily__enum::enum_type AdresseFamily__enum::str_to_enum(const char *str_par)
{
if (!strcmp(str_par, "PF_CAN")) return PF__CAN;
else return UNKNOWN_VALUE;
}

boolean AdresseFamily__enum::is_valid_enum(int int_par)
{
switch (int_par) {
case 29:
return TRUE;
default:
return FALSE;
}
}

int AdresseFamily__enum::enum2int(enum_type enum_par)
{
if (enum_par==UNBOUND_VALUE || enum_par==UNKNOWN_VALUE) TTCN_error("The argument of function enum2int() is an %s value of enumerated type @Can.AdresseFamily_enum.", enum_par==UNBOUND_VALUE?"unbound":"invalid");
return enum_par;
}

int AdresseFamily__enum::enum2int(const AdresseFamily__enum& enum_par)
{
if (enum_par.enum_value==UNBOUND_VALUE || enum_par.enum_value==UNKNOWN_VALUE) TTCN_error("The argument of function enum2int() is an %s value of enumerated type @Can.AdresseFamily_enum.", enum_par==UNBOUND_VALUE?"unbound":"invalid");
return enum_par.enum_value;
}

void AdresseFamily__enum::int2enum(int int_val)
{
if (!is_valid_enum(int_val)) TTCN_error("Assigning invalid numeric value %d to a variable of enumerated type @Can.AdresseFamily_enum.", int_val);
enum_value = (enum_type)int_val;
}

AdresseFamily__enum::operator AdresseFamily__enum::enum_type() const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("Using the value of an unbound variable of enumerated type @Can.AdresseFamily_enum.");
return enum_value;
}

void AdresseFamily__enum::log() const
{
if (enum_value != UNBOUND_VALUE) TTCN_Logger::log_event_enum(enum_to_str(enum_value), enum_value);
else TTCN_Logger::log_event_unbound();
}

void AdresseFamily__enum::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_VALUE, "enumerated value");
  if (param.get_type()!=Module_Param::MP_Enumerated) param.type_error("enumerated value", "@Can.AdresseFamily_enum");
  enum_value = str_to_enum(param.get_enumerated());
  if (!is_valid_enum(enum_value)) {
    param.error("Invalid enumerated value for type @Can.AdresseFamily_enum.");
  }
}

void AdresseFamily__enum::encode_text(Text_Buf& text_buf) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("Text encoder: Encoding an unbound value of enumerated type @Can.AdresseFamily_enum.");
text_buf.push_int(enum_value);
}

void AdresseFamily__enum::decode_text(Text_Buf& text_buf)
{
enum_value = (enum_type)text_buf.pull_int().get_val();
if (!is_valid_enum(enum_value)) TTCN_error("Text decoder: Unknown numeric value %d was received for enumerated type @Can.AdresseFamily_enum.", enum_value);
}

void AdresseFamily__enum_template::copy_template(const AdresseFamily__enum_template& other_value)
{
set_selection(other_value);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value = other_value.single_value;
break;
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = other_value.value_list.n_values;
value_list.list_value = new AdresseFamily__enum_template[value_list.n_values];
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].copy_template(other_value.value_list.list_value[list_count]);
break;
default:
TTCN_error("Copying an uninitialized/unsupported template of enumerated type @Can.AdresseFamily_enum.");
}
}

AdresseFamily__enum_template::AdresseFamily__enum_template()
{
}

AdresseFamily__enum_template::AdresseFamily__enum_template(template_sel other_value)
 : Base_Template(other_value)
{
check_single_selection(other_value);
}

AdresseFamily__enum_template::AdresseFamily__enum_template(int other_value)
 : Base_Template(SPECIFIC_VALUE)
{
if (!AdresseFamily__enum::is_valid_enum(other_value)) TTCN_error("Initializing a template of enumerated type @Can.AdresseFamily_enum with unknown numeric value %d.", other_value);
single_value = (AdresseFamily__enum::enum_type)other_value;
}

AdresseFamily__enum_template::AdresseFamily__enum_template(AdresseFamily__enum::enum_type other_value)
 : Base_Template(SPECIFIC_VALUE)
{
single_value = other_value;
}

AdresseFamily__enum_template::AdresseFamily__enum_template(const AdresseFamily__enum& other_value)
 : Base_Template(SPECIFIC_VALUE)
{
if (other_value.enum_value == AdresseFamily__enum::UNBOUND_VALUE) TTCN_error("Creating a template from an unbound value of enumerated type @Can.AdresseFamily_enum.");
single_value = other_value.enum_value;
}

AdresseFamily__enum_template::AdresseFamily__enum_template(const OPTIONAL<AdresseFamily__enum>& other_value)
{
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
set_selection(SPECIFIC_VALUE);
single_value = (AdresseFamily__enum::enum_type)(const AdresseFamily__enum&)other_value;
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Creating a template of enumerated type @Can.AdresseFamily_enum from an unbound optional field.");
}
}

AdresseFamily__enum_template::AdresseFamily__enum_template(const AdresseFamily__enum_template& other_value)
 : Base_Template()
{
copy_template(other_value);
}

AdresseFamily__enum_template::~AdresseFamily__enum_template()
{
clean_up();
}

boolean AdresseFamily__enum_template::is_bound() const
{
if (template_selection == UNINITIALIZED_TEMPLATE && !is_ifpresent) return FALSE;
return TRUE;
}

boolean AdresseFamily__enum_template::is_value() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent) return FALSE;
return single_value != AdresseFamily__enum::UNBOUND_VALUE;
}

void AdresseFamily__enum_template::clean_up()
{
if (template_selection == VALUE_LIST || template_selection == COMPLEMENTED_LIST) delete [] value_list.list_value;
template_selection = UNINITIALIZED_TEMPLATE;
}

AdresseFamily__enum_template& AdresseFamily__enum_template::operator=(template_sel other_value)
{
check_single_selection(other_value);
clean_up();
set_selection(other_value);
return *this;
}

AdresseFamily__enum_template& AdresseFamily__enum_template::operator=(int other_value)
{
if (!AdresseFamily__enum::is_valid_enum(other_value)) TTCN_warning("Assigning unknown numeric value %d to a template of enumerated type @Can.AdresseFamily_enum.", other_value);
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = (AdresseFamily__enum::enum_type)other_value;
return *this;
}

AdresseFamily__enum_template& AdresseFamily__enum_template::operator=(AdresseFamily__enum::enum_type other_value)
{
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = other_value;
return *this;
}

AdresseFamily__enum_template& AdresseFamily__enum_template::operator=(const AdresseFamily__enum& other_value)
{
if (other_value.enum_value == AdresseFamily__enum::UNBOUND_VALUE) TTCN_error("Assignment of an unbound value of enumerated type @Can.AdresseFamily_enum to a template.");
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = other_value.enum_value;
return *this;
}

AdresseFamily__enum_template& AdresseFamily__enum_template::operator=(const OPTIONAL<AdresseFamily__enum>& other_value)
{
clean_up();
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
set_selection(SPECIFIC_VALUE);
single_value = (AdresseFamily__enum::enum_type)(const AdresseFamily__enum&)other_value;
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Assignment of an unbound optional field to a template of enumerated type @Can.AdresseFamily_enum.");
}
return *this;
}

AdresseFamily__enum_template& AdresseFamily__enum_template::operator=(const AdresseFamily__enum_template& other_value)
{
if (&other_value != this) {
clean_up();
copy_template(other_value);
}
return *this;
}

boolean AdresseFamily__enum_template::match(AdresseFamily__enum::enum_type other_value, boolean) const
{
switch (template_selection) {
case SPECIFIC_VALUE:
return single_value == other_value;
case OMIT_VALUE:
return FALSE;
case ANY_VALUE:
case ANY_OR_OMIT:
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
if (value_list.list_value[list_count].match(other_value)) return template_selection == VALUE_LIST;
return template_selection == COMPLEMENTED_LIST;
default:
TTCN_error("Matching an uninitialized/unsupported template of enumerated type @Can.AdresseFamily_enum.");
}
return FALSE;
}

boolean AdresseFamily__enum_template::match(const AdresseFamily__enum& other_value, boolean) const
{
if (other_value.enum_value == AdresseFamily__enum::UNBOUND_VALUE) TTCN_error("Matching a template of enumerated type @Can.AdresseFamily_enum with an unbound value.");
return match(other_value.enum_value);
}

AdresseFamily__enum::enum_type AdresseFamily__enum_template::valueof() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent) TTCN_error("Performing a valueof or send operation on a non-specific template of enumerated type @Can.AdresseFamily_enum.");
return single_value;
}

void AdresseFamily__enum_template::set_type(template_sel template_type, unsigned int list_length)
{
if (template_type != VALUE_LIST && template_type != COMPLEMENTED_LIST) TTCN_error("Setting an invalid list type for a template of enumerated type @Can.AdresseFamily_enum.");
clean_up();
set_selection(template_type);
value_list.n_values = list_length;
value_list.list_value = new AdresseFamily__enum_template[list_length];
}

AdresseFamily__enum_template& AdresseFamily__enum_template::list_item(unsigned int list_index)
{
if (template_selection != VALUE_LIST && template_selection != COMPLEMENTED_LIST) TTCN_error("Accessing a list element in a non-list template of enumerated type @Can.AdresseFamily_enum.");
if (list_index >= value_list.n_values) TTCN_error("Index overflow in a value list template of enumerated type @Can.AdresseFamily_enum.");
return value_list.list_value[list_index];
}

void AdresseFamily__enum_template::log() const
{
switch (template_selection) {
case SPECIFIC_VALUE:
TTCN_Logger::log_event_enum(AdresseFamily__enum::enum_to_str(single_value), single_value);
break;
case COMPLEMENTED_LIST:
TTCN_Logger::log_event_str("complement");
case VALUE_LIST:
TTCN_Logger::log_char('(');
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++) {
if (elem_count > 0) TTCN_Logger::log_event_str(", ");
value_list.list_value[elem_count].log();
}
TTCN_Logger::log_char(')');
break;
default:
log_generic();
}
log_ifpresent();
}

void AdresseFamily__enum_template::log_match(const AdresseFamily__enum& match_value, boolean) const
{
match_value.log();
TTCN_Logger::log_event_str(" with ");
log();
if (match(match_value)) TTCN_Logger::log_event_str(" matched");
else TTCN_Logger::log_event_str(" unmatched");
}

void AdresseFamily__enum_template::encode_text(Text_Buf& text_buf) const
{
encode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
text_buf.push_int(single_value);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
text_buf.push_int(value_list.n_values);
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++)
value_list.list_value[elem_count].encode_text(text_buf);
break;
default:
TTCN_error("Text encoder: Encoding an uninitialized/unsupported template of enumerated type @Can.AdresseFamily_enum.");
}
}

void AdresseFamily__enum_template::decode_text(Text_Buf& text_buf)
{
clean_up();
decode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value = (AdresseFamily__enum::enum_type)text_buf.pull_int().get_val();
if (!AdresseFamily__enum::is_valid_enum(single_value)) TTCN_error("Text decoder: Unknown numeric value %d was received for a template of enumerated type @Can.AdresseFamily_enum.", single_value);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = text_buf.pull_int().get_val();
value_list.list_value = new AdresseFamily__enum_template[value_list.n_values];
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++)
value_list.list_value[elem_count].decode_text(text_buf);
break;
default:
TTCN_error("Text decoder: An unknown/unsupported selection was received for a template of enumerated type @Can.AdresseFamily_enum.");
}
}

boolean AdresseFamily__enum_template::is_present(boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return FALSE;
return !match_omit(legacy);
}

boolean AdresseFamily__enum_template::match_omit(boolean legacy) const
{
if (is_ifpresent) return TRUE;
switch (template_selection) {
case OMIT_VALUE:
case ANY_OR_OMIT:
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
if (legacy) {
for (unsigned int i=0; i<value_list.n_values; i++)
if (value_list.list_value[i].match_omit())
return template_selection==VALUE_LIST;
return template_selection==COMPLEMENTED_LIST;
} // else fall through
default:
return FALSE;
}
return FALSE;
}

void AdresseFamily__enum_template::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_TEMPLATE, "enumerated template");
  Module_Param_Ptr m_p = &param;
  switch (m_p->get_type()) {
  case Module_Param::MP_Omit:
    *this = OMIT_VALUE;
    break;
  case Module_Param::MP_Any:
    *this = ANY_VALUE;
    break;
  case Module_Param::MP_AnyOrNone:
    *this = ANY_OR_OMIT;
    break;
  case Module_Param::MP_List_Template:
  case Module_Param::MP_ComplementList_Template: {
    AdresseFamily__enum_template new_temp;
    new_temp.set_type(m_p->get_type()==Module_Param::MP_List_Template ? VALUE_LIST : COMPLEMENTED_LIST, m_p->get_size());
    for (size_t p_i=0; p_i<m_p->get_size(); p_i++) {
      new_temp.list_item(p_i).set_param(*m_p->get_elem(p_i));
    }
    *this = new_temp;
    break; }
  case Module_Param::MP_Enumerated: {
    AdresseFamily__enum::enum_type enum_val = AdresseFamily__enum::str_to_enum(m_p->get_enumerated());
    if (!AdresseFamily__enum::is_valid_enum(enum_val)) {
      param.error("Invalid enumerated value for type @Can.AdresseFamily_enum.");
    }
    *this = enum_val;
  } break;
  default:
    param.type_error("enumerated template", "@Can.AdresseFamily_enum");
  }
  is_ifpresent = param.get_ifpresent();
}

void AdresseFamily__enum_template::check_restriction(template_res t_res, const char* t_name,
boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return;
switch ((t_name&&(t_res==TR_VALUE))?TR_OMIT:t_res) {
case TR_VALUE:
if (!is_ifpresent && template_selection==SPECIFIC_VALUE) return;
break;
case TR_OMIT:
if (!is_ifpresent && (template_selection==OMIT_VALUE || template_selection==SPECIFIC_VALUE)) return;
break;
case TR_PRESENT:
if (!match_omit(legacy)) return;
break;
default:
return;
}
TTCN_error("Restriction `%s' on template of type %s violated.", get_res_name(t_res), t_name ? t_name : "@Can.AdresseFamily_enum");
}

ProtocolFamily__enum::ProtocolFamily__enum()
{
enum_value = UNBOUND_VALUE;
}

ProtocolFamily__enum::ProtocolFamily__enum(int other_value)
{
if (!is_valid_enum(other_value)) TTCN_error("Initializing a variable of enumerated type @Can.ProtocolFamily_enum with invalid numeric value %d.", other_value);
enum_value = (enum_type)other_value;
}

ProtocolFamily__enum::ProtocolFamily__enum(enum_type other_value)
{
enum_value = other_value;
}

ProtocolFamily__enum::ProtocolFamily__enum(const ProtocolFamily__enum& other_value)
: Base_Type()
{
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("Copying an unbound value of enumerated type @Can.ProtocolFamily_enum.");
enum_value = other_value.enum_value;
}

ProtocolFamily__enum& ProtocolFamily__enum::operator=(int other_value)
{
if (!is_valid_enum(other_value)) TTCN_error("Assigning unknown numeric value %d to a variable of enumerated type @Can.ProtocolFamily_enum.", other_value);
enum_value = (enum_type)other_value;
return *this;
}

ProtocolFamily__enum& ProtocolFamily__enum::operator=(enum_type other_value)
{
enum_value = other_value;
return *this;
}

ProtocolFamily__enum& ProtocolFamily__enum::operator=(const ProtocolFamily__enum& other_value)
{
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("Assignment of an unbound value of enumerated type @Can.ProtocolFamily_enum.");
enum_value = other_value.enum_value;
return *this;
}

boolean ProtocolFamily__enum::operator==(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
return enum_value == other_value;
}

boolean ProtocolFamily__enum::operator==(const ProtocolFamily__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
return enum_value == other_value.enum_value;
}

boolean ProtocolFamily__enum::operator<(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
return enum_value < other_value;
}

boolean ProtocolFamily__enum::operator<(const ProtocolFamily__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
return enum_value < other_value.enum_value;
}

boolean ProtocolFamily__enum::operator>(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
return enum_value > other_value;
}

boolean ProtocolFamily__enum::operator>(const ProtocolFamily__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.ProtocolFamily_enum.");
return enum_value > other_value.enum_value;
}

const char *ProtocolFamily__enum::enum_to_str(enum_type enum_par)
{
switch (enum_par) {
case SOCK__DGRAM: return "SOCK_DGRAM";
case SOCK__RAW: return "SOCK_RAW";
default: return "<unknown>";
}
}

ProtocolFamily__enum::enum_type ProtocolFamily__enum::str_to_enum(const char *str_par)
{
if (!strcmp(str_par, "SOCK_DGRAM")) return SOCK__DGRAM;
else if (!strcmp(str_par, "SOCK_RAW")) return SOCK__RAW;
else return UNKNOWN_VALUE;
}

boolean ProtocolFamily__enum::is_valid_enum(int int_par)
{
switch (int_par) {
case 2:
case 3:
return TRUE;
default:
return FALSE;
}
}

int ProtocolFamily__enum::enum2int(enum_type enum_par)
{
if (enum_par==UNBOUND_VALUE || enum_par==UNKNOWN_VALUE) TTCN_error("The argument of function enum2int() is an %s value of enumerated type @Can.ProtocolFamily_enum.", enum_par==UNBOUND_VALUE?"unbound":"invalid");
return enum_par;
}

int ProtocolFamily__enum::enum2int(const ProtocolFamily__enum& enum_par)
{
if (enum_par.enum_value==UNBOUND_VALUE || enum_par.enum_value==UNKNOWN_VALUE) TTCN_error("The argument of function enum2int() is an %s value of enumerated type @Can.ProtocolFamily_enum.", enum_par==UNBOUND_VALUE?"unbound":"invalid");
return enum_par.enum_value;
}

void ProtocolFamily__enum::int2enum(int int_val)
{
if (!is_valid_enum(int_val)) TTCN_error("Assigning invalid numeric value %d to a variable of enumerated type @Can.ProtocolFamily_enum.", int_val);
enum_value = (enum_type)int_val;
}

ProtocolFamily__enum::operator ProtocolFamily__enum::enum_type() const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("Using the value of an unbound variable of enumerated type @Can.ProtocolFamily_enum.");
return enum_value;
}

void ProtocolFamily__enum::log() const
{
if (enum_value != UNBOUND_VALUE) TTCN_Logger::log_event_enum(enum_to_str(enum_value), enum_value);
else TTCN_Logger::log_event_unbound();
}

void ProtocolFamily__enum::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_VALUE, "enumerated value");
  if (param.get_type()!=Module_Param::MP_Enumerated) param.type_error("enumerated value", "@Can.ProtocolFamily_enum");
  enum_value = str_to_enum(param.get_enumerated());
  if (!is_valid_enum(enum_value)) {
    param.error("Invalid enumerated value for type @Can.ProtocolFamily_enum.");
  }
}

void ProtocolFamily__enum::encode_text(Text_Buf& text_buf) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("Text encoder: Encoding an unbound value of enumerated type @Can.ProtocolFamily_enum.");
text_buf.push_int(enum_value);
}

void ProtocolFamily__enum::decode_text(Text_Buf& text_buf)
{
enum_value = (enum_type)text_buf.pull_int().get_val();
if (!is_valid_enum(enum_value)) TTCN_error("Text decoder: Unknown numeric value %d was received for enumerated type @Can.ProtocolFamily_enum.", enum_value);
}

void ProtocolFamily__enum_template::copy_template(const ProtocolFamily__enum_template& other_value)
{
set_selection(other_value);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value = other_value.single_value;
break;
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = other_value.value_list.n_values;
value_list.list_value = new ProtocolFamily__enum_template[value_list.n_values];
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].copy_template(other_value.value_list.list_value[list_count]);
break;
default:
TTCN_error("Copying an uninitialized/unsupported template of enumerated type @Can.ProtocolFamily_enum.");
}
}

ProtocolFamily__enum_template::ProtocolFamily__enum_template()
{
}

ProtocolFamily__enum_template::ProtocolFamily__enum_template(template_sel other_value)
 : Base_Template(other_value)
{
check_single_selection(other_value);
}

ProtocolFamily__enum_template::ProtocolFamily__enum_template(int other_value)
 : Base_Template(SPECIFIC_VALUE)
{
if (!ProtocolFamily__enum::is_valid_enum(other_value)) TTCN_error("Initializing a template of enumerated type @Can.ProtocolFamily_enum with unknown numeric value %d.", other_value);
single_value = (ProtocolFamily__enum::enum_type)other_value;
}

ProtocolFamily__enum_template::ProtocolFamily__enum_template(ProtocolFamily__enum::enum_type other_value)
 : Base_Template(SPECIFIC_VALUE)
{
single_value = other_value;
}

ProtocolFamily__enum_template::ProtocolFamily__enum_template(const ProtocolFamily__enum& other_value)
 : Base_Template(SPECIFIC_VALUE)
{
if (other_value.enum_value == ProtocolFamily__enum::UNBOUND_VALUE) TTCN_error("Creating a template from an unbound value of enumerated type @Can.ProtocolFamily_enum.");
single_value = other_value.enum_value;
}

ProtocolFamily__enum_template::ProtocolFamily__enum_template(const OPTIONAL<ProtocolFamily__enum>& other_value)
{
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
set_selection(SPECIFIC_VALUE);
single_value = (ProtocolFamily__enum::enum_type)(const ProtocolFamily__enum&)other_value;
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Creating a template of enumerated type @Can.ProtocolFamily_enum from an unbound optional field.");
}
}

ProtocolFamily__enum_template::ProtocolFamily__enum_template(const ProtocolFamily__enum_template& other_value)
 : Base_Template()
{
copy_template(other_value);
}

ProtocolFamily__enum_template::~ProtocolFamily__enum_template()
{
clean_up();
}

boolean ProtocolFamily__enum_template::is_bound() const
{
if (template_selection == UNINITIALIZED_TEMPLATE && !is_ifpresent) return FALSE;
return TRUE;
}

boolean ProtocolFamily__enum_template::is_value() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent) return FALSE;
return single_value != ProtocolFamily__enum::UNBOUND_VALUE;
}

void ProtocolFamily__enum_template::clean_up()
{
if (template_selection == VALUE_LIST || template_selection == COMPLEMENTED_LIST) delete [] value_list.list_value;
template_selection = UNINITIALIZED_TEMPLATE;
}

ProtocolFamily__enum_template& ProtocolFamily__enum_template::operator=(template_sel other_value)
{
check_single_selection(other_value);
clean_up();
set_selection(other_value);
return *this;
}

ProtocolFamily__enum_template& ProtocolFamily__enum_template::operator=(int other_value)
{
if (!ProtocolFamily__enum::is_valid_enum(other_value)) TTCN_warning("Assigning unknown numeric value %d to a template of enumerated type @Can.ProtocolFamily_enum.", other_value);
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = (ProtocolFamily__enum::enum_type)other_value;
return *this;
}

ProtocolFamily__enum_template& ProtocolFamily__enum_template::operator=(ProtocolFamily__enum::enum_type other_value)
{
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = other_value;
return *this;
}

ProtocolFamily__enum_template& ProtocolFamily__enum_template::operator=(const ProtocolFamily__enum& other_value)
{
if (other_value.enum_value == ProtocolFamily__enum::UNBOUND_VALUE) TTCN_error("Assignment of an unbound value of enumerated type @Can.ProtocolFamily_enum to a template.");
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = other_value.enum_value;
return *this;
}

ProtocolFamily__enum_template& ProtocolFamily__enum_template::operator=(const OPTIONAL<ProtocolFamily__enum>& other_value)
{
clean_up();
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
set_selection(SPECIFIC_VALUE);
single_value = (ProtocolFamily__enum::enum_type)(const ProtocolFamily__enum&)other_value;
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Assignment of an unbound optional field to a template of enumerated type @Can.ProtocolFamily_enum.");
}
return *this;
}

ProtocolFamily__enum_template& ProtocolFamily__enum_template::operator=(const ProtocolFamily__enum_template& other_value)
{
if (&other_value != this) {
clean_up();
copy_template(other_value);
}
return *this;
}

boolean ProtocolFamily__enum_template::match(ProtocolFamily__enum::enum_type other_value, boolean) const
{
switch (template_selection) {
case SPECIFIC_VALUE:
return single_value == other_value;
case OMIT_VALUE:
return FALSE;
case ANY_VALUE:
case ANY_OR_OMIT:
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
if (value_list.list_value[list_count].match(other_value)) return template_selection == VALUE_LIST;
return template_selection == COMPLEMENTED_LIST;
default:
TTCN_error("Matching an uninitialized/unsupported template of enumerated type @Can.ProtocolFamily_enum.");
}
return FALSE;
}

boolean ProtocolFamily__enum_template::match(const ProtocolFamily__enum& other_value, boolean) const
{
if (other_value.enum_value == ProtocolFamily__enum::UNBOUND_VALUE) TTCN_error("Matching a template of enumerated type @Can.ProtocolFamily_enum with an unbound value.");
return match(other_value.enum_value);
}

ProtocolFamily__enum::enum_type ProtocolFamily__enum_template::valueof() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent) TTCN_error("Performing a valueof or send operation on a non-specific template of enumerated type @Can.ProtocolFamily_enum.");
return single_value;
}

void ProtocolFamily__enum_template::set_type(template_sel template_type, unsigned int list_length)
{
if (template_type != VALUE_LIST && template_type != COMPLEMENTED_LIST) TTCN_error("Setting an invalid list type for a template of enumerated type @Can.ProtocolFamily_enum.");
clean_up();
set_selection(template_type);
value_list.n_values = list_length;
value_list.list_value = new ProtocolFamily__enum_template[list_length];
}

ProtocolFamily__enum_template& ProtocolFamily__enum_template::list_item(unsigned int list_index)
{
if (template_selection != VALUE_LIST && template_selection != COMPLEMENTED_LIST) TTCN_error("Accessing a list element in a non-list template of enumerated type @Can.ProtocolFamily_enum.");
if (list_index >= value_list.n_values) TTCN_error("Index overflow in a value list template of enumerated type @Can.ProtocolFamily_enum.");
return value_list.list_value[list_index];
}

void ProtocolFamily__enum_template::log() const
{
switch (template_selection) {
case SPECIFIC_VALUE:
TTCN_Logger::log_event_enum(ProtocolFamily__enum::enum_to_str(single_value), single_value);
break;
case COMPLEMENTED_LIST:
TTCN_Logger::log_event_str("complement");
case VALUE_LIST:
TTCN_Logger::log_char('(');
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++) {
if (elem_count > 0) TTCN_Logger::log_event_str(", ");
value_list.list_value[elem_count].log();
}
TTCN_Logger::log_char(')');
break;
default:
log_generic();
}
log_ifpresent();
}

void ProtocolFamily__enum_template::log_match(const ProtocolFamily__enum& match_value, boolean) const
{
match_value.log();
TTCN_Logger::log_event_str(" with ");
log();
if (match(match_value)) TTCN_Logger::log_event_str(" matched");
else TTCN_Logger::log_event_str(" unmatched");
}

void ProtocolFamily__enum_template::encode_text(Text_Buf& text_buf) const
{
encode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
text_buf.push_int(single_value);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
text_buf.push_int(value_list.n_values);
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++)
value_list.list_value[elem_count].encode_text(text_buf);
break;
default:
TTCN_error("Text encoder: Encoding an uninitialized/unsupported template of enumerated type @Can.ProtocolFamily_enum.");
}
}

void ProtocolFamily__enum_template::decode_text(Text_Buf& text_buf)
{
clean_up();
decode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value = (ProtocolFamily__enum::enum_type)text_buf.pull_int().get_val();
if (!ProtocolFamily__enum::is_valid_enum(single_value)) TTCN_error("Text decoder: Unknown numeric value %d was received for a template of enumerated type @Can.ProtocolFamily_enum.", single_value);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = text_buf.pull_int().get_val();
value_list.list_value = new ProtocolFamily__enum_template[value_list.n_values];
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++)
value_list.list_value[elem_count].decode_text(text_buf);
break;
default:
TTCN_error("Text decoder: An unknown/unsupported selection was received for a template of enumerated type @Can.ProtocolFamily_enum.");
}
}

boolean ProtocolFamily__enum_template::is_present(boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return FALSE;
return !match_omit(legacy);
}

boolean ProtocolFamily__enum_template::match_omit(boolean legacy) const
{
if (is_ifpresent) return TRUE;
switch (template_selection) {
case OMIT_VALUE:
case ANY_OR_OMIT:
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
if (legacy) {
for (unsigned int i=0; i<value_list.n_values; i++)
if (value_list.list_value[i].match_omit())
return template_selection==VALUE_LIST;
return template_selection==COMPLEMENTED_LIST;
} // else fall through
default:
return FALSE;
}
return FALSE;
}

void ProtocolFamily__enum_template::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_TEMPLATE, "enumerated template");
  Module_Param_Ptr m_p = &param;
  switch (m_p->get_type()) {
  case Module_Param::MP_Omit:
    *this = OMIT_VALUE;
    break;
  case Module_Param::MP_Any:
    *this = ANY_VALUE;
    break;
  case Module_Param::MP_AnyOrNone:
    *this = ANY_OR_OMIT;
    break;
  case Module_Param::MP_List_Template:
  case Module_Param::MP_ComplementList_Template: {
    ProtocolFamily__enum_template new_temp;
    new_temp.set_type(m_p->get_type()==Module_Param::MP_List_Template ? VALUE_LIST : COMPLEMENTED_LIST, m_p->get_size());
    for (size_t p_i=0; p_i<m_p->get_size(); p_i++) {
      new_temp.list_item(p_i).set_param(*m_p->get_elem(p_i));
    }
    *this = new_temp;
    break; }
  case Module_Param::MP_Enumerated: {
    ProtocolFamily__enum::enum_type enum_val = ProtocolFamily__enum::str_to_enum(m_p->get_enumerated());
    if (!ProtocolFamily__enum::is_valid_enum(enum_val)) {
      param.error("Invalid enumerated value for type @Can.ProtocolFamily_enum.");
    }
    *this = enum_val;
  } break;
  default:
    param.type_error("enumerated template", "@Can.ProtocolFamily_enum");
  }
  is_ifpresent = param.get_ifpresent();
}

void ProtocolFamily__enum_template::check_restriction(template_res t_res, const char* t_name,
boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return;
switch ((t_name&&(t_res==TR_VALUE))?TR_OMIT:t_res) {
case TR_VALUE:
if (!is_ifpresent && template_selection==SPECIFIC_VALUE) return;
break;
case TR_OMIT:
if (!is_ifpresent && (template_selection==OMIT_VALUE || template_selection==SPECIFIC_VALUE)) return;
break;
case TR_PRESENT:
if (!match_omit(legacy)) return;
break;
default:
return;
}
TTCN_error("Restriction `%s' on template of type %s violated.", get_res_name(t_res), t_name ? t_name : "@Can.ProtocolFamily_enum");
}

PF__CAN__protocols__enum::PF__CAN__protocols__enum()
{
enum_value = UNBOUND_VALUE;
}

PF__CAN__protocols__enum::PF__CAN__protocols__enum(int other_value)
{
if (!is_valid_enum(other_value)) TTCN_error("Initializing a variable of enumerated type @Can.PF_CAN_protocols_enum with invalid numeric value %d.", other_value);
enum_value = (enum_type)other_value;
}

PF__CAN__protocols__enum::PF__CAN__protocols__enum(enum_type other_value)
{
enum_value = other_value;
}

PF__CAN__protocols__enum::PF__CAN__protocols__enum(const PF__CAN__protocols__enum& other_value)
: Base_Type()
{
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("Copying an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
enum_value = other_value.enum_value;
}

PF__CAN__protocols__enum& PF__CAN__protocols__enum::operator=(int other_value)
{
if (!is_valid_enum(other_value)) TTCN_error("Assigning unknown numeric value %d to a variable of enumerated type @Can.PF_CAN_protocols_enum.", other_value);
enum_value = (enum_type)other_value;
return *this;
}

PF__CAN__protocols__enum& PF__CAN__protocols__enum::operator=(enum_type other_value)
{
enum_value = other_value;
return *this;
}

PF__CAN__protocols__enum& PF__CAN__protocols__enum::operator=(const PF__CAN__protocols__enum& other_value)
{
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("Assignment of an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
enum_value = other_value.enum_value;
return *this;
}

boolean PF__CAN__protocols__enum::operator==(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
return enum_value == other_value;
}

boolean PF__CAN__protocols__enum::operator==(const PF__CAN__protocols__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
return enum_value == other_value.enum_value;
}

boolean PF__CAN__protocols__enum::operator<(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
return enum_value < other_value;
}

boolean PF__CAN__protocols__enum::operator<(const PF__CAN__protocols__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
return enum_value < other_value.enum_value;
}

boolean PF__CAN__protocols__enum::operator>(enum_type other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
return enum_value > other_value;
}

boolean PF__CAN__protocols__enum::operator>(const PF__CAN__protocols__enum& other_value) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("The left operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
if (other_value.enum_value == UNBOUND_VALUE) TTCN_error("The right operand of comparison is an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
return enum_value > other_value.enum_value;
}

const char *PF__CAN__protocols__enum::enum_to_str(enum_type enum_par)
{
switch (enum_par) {
case CAN__RAW: return "CAN_RAW";
case CAN__BCM: return "CAN_BCM";
case CAN__TP16: return "CAN_TP16";
case CAN__TP20: return "CAN_TP20";
case CAN__MCNET: return "CAN_MCNET";
case CAN__ISOTP: return "CAN_ISOTP";
case CAN__NPROTO: return "CAN_NPROTO";
default: return "<unknown>";
}
}

PF__CAN__protocols__enum::enum_type PF__CAN__protocols__enum::str_to_enum(const char *str_par)
{
if (!strcmp(str_par, "CAN_RAW")) return CAN__RAW;
else if (!strcmp(str_par, "CAN_BCM")) return CAN__BCM;
else if (!strcmp(str_par, "CAN_TP16")) return CAN__TP16;
else if (!strcmp(str_par, "CAN_TP20")) return CAN__TP20;
else if (!strcmp(str_par, "CAN_MCNET")) return CAN__MCNET;
else if (!strcmp(str_par, "CAN_ISOTP")) return CAN__ISOTP;
else if (!strcmp(str_par, "CAN_NPROTO")) return CAN__NPROTO;
else return UNKNOWN_VALUE;
}

boolean PF__CAN__protocols__enum::is_valid_enum(int int_par)
{
switch (int_par) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
return TRUE;
default:
return FALSE;
}
}

int PF__CAN__protocols__enum::enum2int(enum_type enum_par)
{
if (enum_par==UNBOUND_VALUE || enum_par==UNKNOWN_VALUE) TTCN_error("The argument of function enum2int() is an %s value of enumerated type @Can.PF_CAN_protocols_enum.", enum_par==UNBOUND_VALUE?"unbound":"invalid");
return enum_par;
}

int PF__CAN__protocols__enum::enum2int(const PF__CAN__protocols__enum& enum_par)
{
if (enum_par.enum_value==UNBOUND_VALUE || enum_par.enum_value==UNKNOWN_VALUE) TTCN_error("The argument of function enum2int() is an %s value of enumerated type @Can.PF_CAN_protocols_enum.", enum_par==UNBOUND_VALUE?"unbound":"invalid");
return enum_par.enum_value;
}

void PF__CAN__protocols__enum::int2enum(int int_val)
{
if (!is_valid_enum(int_val)) TTCN_error("Assigning invalid numeric value %d to a variable of enumerated type @Can.PF_CAN_protocols_enum.", int_val);
enum_value = (enum_type)int_val;
}

PF__CAN__protocols__enum::operator PF__CAN__protocols__enum::enum_type() const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("Using the value of an unbound variable of enumerated type @Can.PF_CAN_protocols_enum.");
return enum_value;
}

void PF__CAN__protocols__enum::log() const
{
if (enum_value != UNBOUND_VALUE) TTCN_Logger::log_event_enum(enum_to_str(enum_value), enum_value);
else TTCN_Logger::log_event_unbound();
}

void PF__CAN__protocols__enum::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_VALUE, "enumerated value");
  if (param.get_type()!=Module_Param::MP_Enumerated) param.type_error("enumerated value", "@Can.PF_CAN_protocols_enum");
  enum_value = str_to_enum(param.get_enumerated());
  if (!is_valid_enum(enum_value)) {
    param.error("Invalid enumerated value for type @Can.PF_CAN_protocols_enum.");
  }
}

void PF__CAN__protocols__enum::encode_text(Text_Buf& text_buf) const
{
if (enum_value == UNBOUND_VALUE) TTCN_error("Text encoder: Encoding an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
text_buf.push_int(enum_value);
}

void PF__CAN__protocols__enum::decode_text(Text_Buf& text_buf)
{
enum_value = (enum_type)text_buf.pull_int().get_val();
if (!is_valid_enum(enum_value)) TTCN_error("Text decoder: Unknown numeric value %d was received for enumerated type @Can.PF_CAN_protocols_enum.", enum_value);
}

void PF__CAN__protocols__enum_template::copy_template(const PF__CAN__protocols__enum_template& other_value)
{
set_selection(other_value);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value = other_value.single_value;
break;
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = other_value.value_list.n_values;
value_list.list_value = new PF__CAN__protocols__enum_template[value_list.n_values];
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].copy_template(other_value.value_list.list_value[list_count]);
break;
default:
TTCN_error("Copying an uninitialized/unsupported template of enumerated type @Can.PF_CAN_protocols_enum.");
}
}

PF__CAN__protocols__enum_template::PF__CAN__protocols__enum_template()
{
}

PF__CAN__protocols__enum_template::PF__CAN__protocols__enum_template(template_sel other_value)
 : Base_Template(other_value)
{
check_single_selection(other_value);
}

PF__CAN__protocols__enum_template::PF__CAN__protocols__enum_template(int other_value)
 : Base_Template(SPECIFIC_VALUE)
{
if (!PF__CAN__protocols__enum::is_valid_enum(other_value)) TTCN_error("Initializing a template of enumerated type @Can.PF_CAN_protocols_enum with unknown numeric value %d.", other_value);
single_value = (PF__CAN__protocols__enum::enum_type)other_value;
}

PF__CAN__protocols__enum_template::PF__CAN__protocols__enum_template(PF__CAN__protocols__enum::enum_type other_value)
 : Base_Template(SPECIFIC_VALUE)
{
single_value = other_value;
}

PF__CAN__protocols__enum_template::PF__CAN__protocols__enum_template(const PF__CAN__protocols__enum& other_value)
 : Base_Template(SPECIFIC_VALUE)
{
if (other_value.enum_value == PF__CAN__protocols__enum::UNBOUND_VALUE) TTCN_error("Creating a template from an unbound value of enumerated type @Can.PF_CAN_protocols_enum.");
single_value = other_value.enum_value;
}

PF__CAN__protocols__enum_template::PF__CAN__protocols__enum_template(const OPTIONAL<PF__CAN__protocols__enum>& other_value)
{
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
set_selection(SPECIFIC_VALUE);
single_value = (PF__CAN__protocols__enum::enum_type)(const PF__CAN__protocols__enum&)other_value;
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Creating a template of enumerated type @Can.PF_CAN_protocols_enum from an unbound optional field.");
}
}

PF__CAN__protocols__enum_template::PF__CAN__protocols__enum_template(const PF__CAN__protocols__enum_template& other_value)
 : Base_Template()
{
copy_template(other_value);
}

PF__CAN__protocols__enum_template::~PF__CAN__protocols__enum_template()
{
clean_up();
}

boolean PF__CAN__protocols__enum_template::is_bound() const
{
if (template_selection == UNINITIALIZED_TEMPLATE && !is_ifpresent) return FALSE;
return TRUE;
}

boolean PF__CAN__protocols__enum_template::is_value() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent) return FALSE;
return single_value != PF__CAN__protocols__enum::UNBOUND_VALUE;
}

void PF__CAN__protocols__enum_template::clean_up()
{
if (template_selection == VALUE_LIST || template_selection == COMPLEMENTED_LIST) delete [] value_list.list_value;
template_selection = UNINITIALIZED_TEMPLATE;
}

PF__CAN__protocols__enum_template& PF__CAN__protocols__enum_template::operator=(template_sel other_value)
{
check_single_selection(other_value);
clean_up();
set_selection(other_value);
return *this;
}

PF__CAN__protocols__enum_template& PF__CAN__protocols__enum_template::operator=(int other_value)
{
if (!PF__CAN__protocols__enum::is_valid_enum(other_value)) TTCN_warning("Assigning unknown numeric value %d to a template of enumerated type @Can.PF_CAN_protocols_enum.", other_value);
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = (PF__CAN__protocols__enum::enum_type)other_value;
return *this;
}

PF__CAN__protocols__enum_template& PF__CAN__protocols__enum_template::operator=(PF__CAN__protocols__enum::enum_type other_value)
{
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = other_value;
return *this;
}

PF__CAN__protocols__enum_template& PF__CAN__protocols__enum_template::operator=(const PF__CAN__protocols__enum& other_value)
{
if (other_value.enum_value == PF__CAN__protocols__enum::UNBOUND_VALUE) TTCN_error("Assignment of an unbound value of enumerated type @Can.PF_CAN_protocols_enum to a template.");
clean_up();
set_selection(SPECIFIC_VALUE);
single_value = other_value.enum_value;
return *this;
}

PF__CAN__protocols__enum_template& PF__CAN__protocols__enum_template::operator=(const OPTIONAL<PF__CAN__protocols__enum>& other_value)
{
clean_up();
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
set_selection(SPECIFIC_VALUE);
single_value = (PF__CAN__protocols__enum::enum_type)(const PF__CAN__protocols__enum&)other_value;
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Assignment of an unbound optional field to a template of enumerated type @Can.PF_CAN_protocols_enum.");
}
return *this;
}

PF__CAN__protocols__enum_template& PF__CAN__protocols__enum_template::operator=(const PF__CAN__protocols__enum_template& other_value)
{
if (&other_value != this) {
clean_up();
copy_template(other_value);
}
return *this;
}

boolean PF__CAN__protocols__enum_template::match(PF__CAN__protocols__enum::enum_type other_value, boolean) const
{
switch (template_selection) {
case SPECIFIC_VALUE:
return single_value == other_value;
case OMIT_VALUE:
return FALSE;
case ANY_VALUE:
case ANY_OR_OMIT:
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
if (value_list.list_value[list_count].match(other_value)) return template_selection == VALUE_LIST;
return template_selection == COMPLEMENTED_LIST;
default:
TTCN_error("Matching an uninitialized/unsupported template of enumerated type @Can.PF_CAN_protocols_enum.");
}
return FALSE;
}

boolean PF__CAN__protocols__enum_template::match(const PF__CAN__protocols__enum& other_value, boolean) const
{
if (other_value.enum_value == PF__CAN__protocols__enum::UNBOUND_VALUE) TTCN_error("Matching a template of enumerated type @Can.PF_CAN_protocols_enum with an unbound value.");
return match(other_value.enum_value);
}

PF__CAN__protocols__enum::enum_type PF__CAN__protocols__enum_template::valueof() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent) TTCN_error("Performing a valueof or send operation on a non-specific template of enumerated type @Can.PF_CAN_protocols_enum.");
return single_value;
}

void PF__CAN__protocols__enum_template::set_type(template_sel template_type, unsigned int list_length)
{
if (template_type != VALUE_LIST && template_type != COMPLEMENTED_LIST) TTCN_error("Setting an invalid list type for a template of enumerated type @Can.PF_CAN_protocols_enum.");
clean_up();
set_selection(template_type);
value_list.n_values = list_length;
value_list.list_value = new PF__CAN__protocols__enum_template[list_length];
}

PF__CAN__protocols__enum_template& PF__CAN__protocols__enum_template::list_item(unsigned int list_index)
{
if (template_selection != VALUE_LIST && template_selection != COMPLEMENTED_LIST) TTCN_error("Accessing a list element in a non-list template of enumerated type @Can.PF_CAN_protocols_enum.");
if (list_index >= value_list.n_values) TTCN_error("Index overflow in a value list template of enumerated type @Can.PF_CAN_protocols_enum.");
return value_list.list_value[list_index];
}

void PF__CAN__protocols__enum_template::log() const
{
switch (template_selection) {
case SPECIFIC_VALUE:
TTCN_Logger::log_event_enum(PF__CAN__protocols__enum::enum_to_str(single_value), single_value);
break;
case COMPLEMENTED_LIST:
TTCN_Logger::log_event_str("complement");
case VALUE_LIST:
TTCN_Logger::log_char('(');
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++) {
if (elem_count > 0) TTCN_Logger::log_event_str(", ");
value_list.list_value[elem_count].log();
}
TTCN_Logger::log_char(')');
break;
default:
log_generic();
}
log_ifpresent();
}

void PF__CAN__protocols__enum_template::log_match(const PF__CAN__protocols__enum& match_value, boolean) const
{
match_value.log();
TTCN_Logger::log_event_str(" with ");
log();
if (match(match_value)) TTCN_Logger::log_event_str(" matched");
else TTCN_Logger::log_event_str(" unmatched");
}

void PF__CAN__protocols__enum_template::encode_text(Text_Buf& text_buf) const
{
encode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
text_buf.push_int(single_value);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
text_buf.push_int(value_list.n_values);
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++)
value_list.list_value[elem_count].encode_text(text_buf);
break;
default:
TTCN_error("Text encoder: Encoding an uninitialized/unsupported template of enumerated type @Can.PF_CAN_protocols_enum.");
}
}

void PF__CAN__protocols__enum_template::decode_text(Text_Buf& text_buf)
{
clean_up();
decode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value = (PF__CAN__protocols__enum::enum_type)text_buf.pull_int().get_val();
if (!PF__CAN__protocols__enum::is_valid_enum(single_value)) TTCN_error("Text decoder: Unknown numeric value %d was received for a template of enumerated type @Can.PF_CAN_protocols_enum.", single_value);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = text_buf.pull_int().get_val();
value_list.list_value = new PF__CAN__protocols__enum_template[value_list.n_values];
for (unsigned int elem_count = 0; elem_count < value_list.n_values; elem_count++)
value_list.list_value[elem_count].decode_text(text_buf);
break;
default:
TTCN_error("Text decoder: An unknown/unsupported selection was received for a template of enumerated type @Can.PF_CAN_protocols_enum.");
}
}

boolean PF__CAN__protocols__enum_template::is_present(boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return FALSE;
return !match_omit(legacy);
}

boolean PF__CAN__protocols__enum_template::match_omit(boolean legacy) const
{
if (is_ifpresent) return TRUE;
switch (template_selection) {
case OMIT_VALUE:
case ANY_OR_OMIT:
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
if (legacy) {
for (unsigned int i=0; i<value_list.n_values; i++)
if (value_list.list_value[i].match_omit())
return template_selection==VALUE_LIST;
return template_selection==COMPLEMENTED_LIST;
} // else fall through
default:
return FALSE;
}
return FALSE;
}

void PF__CAN__protocols__enum_template::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_TEMPLATE, "enumerated template");
  Module_Param_Ptr m_p = &param;
  switch (m_p->get_type()) {
  case Module_Param::MP_Omit:
    *this = OMIT_VALUE;
    break;
  case Module_Param::MP_Any:
    *this = ANY_VALUE;
    break;
  case Module_Param::MP_AnyOrNone:
    *this = ANY_OR_OMIT;
    break;
  case Module_Param::MP_List_Template:
  case Module_Param::MP_ComplementList_Template: {
    PF__CAN__protocols__enum_template new_temp;
    new_temp.set_type(m_p->get_type()==Module_Param::MP_List_Template ? VALUE_LIST : COMPLEMENTED_LIST, m_p->get_size());
    for (size_t p_i=0; p_i<m_p->get_size(); p_i++) {
      new_temp.list_item(p_i).set_param(*m_p->get_elem(p_i));
    }
    *this = new_temp;
    break; }
  case Module_Param::MP_Enumerated: {
    PF__CAN__protocols__enum::enum_type enum_val = PF__CAN__protocols__enum::str_to_enum(m_p->get_enumerated());
    if (!PF__CAN__protocols__enum::is_valid_enum(enum_val)) {
      param.error("Invalid enumerated value for type @Can.PF_CAN_protocols_enum.");
    }
    *this = enum_val;
  } break;
  default:
    param.type_error("enumerated template", "@Can.PF_CAN_protocols_enum");
  }
  is_ifpresent = param.get_ifpresent();
}

void PF__CAN__protocols__enum_template::check_restriction(template_res t_res, const char* t_name,
boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return;
switch ((t_name&&(t_res==TR_VALUE))?TR_OMIT:t_res) {
case TR_VALUE:
if (!is_ifpresent && template_selection==SPECIFIC_VALUE) return;
break;
case TR_OMIT:
if (!is_ifpresent && (template_selection==OMIT_VALUE || template_selection==SPECIFIC_VALUE)) return;
break;
case TR_PRESENT:
if (!match_omit(legacy)) return;
break;
default:
return;
}
TTCN_error("Restriction `%s' on template of type %s violated.", get_res_name(t_res), t_name ? t_name : "@Can.PF_CAN_protocols_enum");
}

CAN__frame::CAN__frame()
{
}

CAN__frame::CAN__frame(const OCTETSTRING& par_can__id,
    const OCTETSTRING& par_can__pdu)
  :   field_can__id(par_can__id),
  field_can__pdu(par_can__pdu)
{
}

CAN__frame::CAN__frame(const CAN__frame& other_value)
{
if(!other_value.is_bound()) TTCN_error("Copying an unbound value of type @Can.CAN_frame.");
if (other_value.can__id().is_bound()) field_can__id = other_value.can__id();
else field_can__id.clean_up();
if (other_value.can__pdu().is_bound()) field_can__pdu = other_value.can__pdu();
else field_can__pdu.clean_up();
}

void CAN__frame::clean_up()
{
field_can__id.clean_up();
field_can__pdu.clean_up();
}

const TTCN_Typedescriptor_t* CAN__frame::get_descriptor() const { return &CAN__frame_descr_; }
CAN__frame& CAN__frame::operator=(const CAN__frame& other_value)
{
if (this != &other_value) {
  if(!other_value.is_bound()) TTCN_error("Assignment of an unbound value of type @Can.CAN_frame.");
  if (other_value.can__id().is_bound()) field_can__id = other_value.can__id();
  else field_can__id.clean_up();
  if (other_value.can__pdu().is_bound()) field_can__pdu = other_value.can__pdu();
  else field_can__pdu.clean_up();
}
return *this;
}

boolean CAN__frame::operator==(const CAN__frame& other_value) const
{
return field_can__id==other_value.field_can__id
  && field_can__pdu==other_value.field_can__pdu;
}

boolean CAN__frame::is_bound() const
{
return (field_can__id.is_bound())
  || (field_can__pdu.is_bound());
}
boolean CAN__frame::is_value() const
{
return field_can__id.is_value()
  && field_can__pdu.is_value();
}
void CAN__frame::log() const
{
if (!is_bound()) {
TTCN_Logger::log_event_unbound();
return;
}
TTCN_Logger::log_event_str("{ can_id := ");
field_can__id.log();
TTCN_Logger::log_event_str(", can_pdu := ");
field_can__pdu.log();
TTCN_Logger::log_event_str(" }");
}

void CAN__frame::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_VALUE, "record value");
  switch (param.get_type()) {
  case Module_Param::MP_Value_List:
    if (2<param.get_size()) {
      param.error("record value of type @Can.CAN_frame has 2 fields but list value has %d fields", (int)param.get_size());
    }
    if (param.get_size()>0 && param.get_elem(0)->get_type()!=Module_Param::MP_NotUsed) can__id().set_param(*param.get_elem(0));
    if (param.get_size()>1 && param.get_elem(1)->get_type()!=Module_Param::MP_NotUsed) can__pdu().set_param(*param.get_elem(1));
    break;
  case Module_Param::MP_Assignment_List: {
    Vector<bool> value_used(param.get_size());
    value_used.resize(param.get_size(), FALSE);
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_id")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__id().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_pdu")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__pdu().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) if (!value_used[val_idx]) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      curr_param->error("Non existent field name in type @Can.CAN_frame: %s", curr_param->get_id()->get_name());
      break;
    }
  } break;
  default:
    param.type_error("record value", "@Can.CAN_frame");
  }
}

void CAN__frame::set_implicit_omit()
{
if (can__id().is_bound()) can__id().set_implicit_omit();
if (can__pdu().is_bound()) can__pdu().set_implicit_omit();
}

void CAN__frame::encode_text(Text_Buf& text_buf) const
{
field_can__id.encode_text(text_buf);
field_can__pdu.encode_text(text_buf);
}

void CAN__frame::decode_text(Text_Buf& text_buf)
{
field_can__id.decode_text(text_buf);
field_can__pdu.decode_text(text_buf);
}

struct CAN__frame_template::single_value_struct {
OCTETSTRING_template field_can__id;
OCTETSTRING_template field_can__pdu;
};

void CAN__frame_template::set_specific()
{
if (template_selection != SPECIFIC_VALUE) {
template_sel old_selection = template_selection;
clean_up();
single_value = new single_value_struct;
set_selection(SPECIFIC_VALUE);
if (old_selection == ANY_VALUE || old_selection == ANY_OR_OMIT) {
single_value->field_can__id = ANY_VALUE;
single_value->field_can__pdu = ANY_VALUE;
}
}
}

void CAN__frame_template::copy_value(const CAN__frame& other_value)
{
single_value = new single_value_struct;
if (other_value.can__id().is_bound()) {
  single_value->field_can__id = other_value.can__id();
} else {
  single_value->field_can__id.clean_up();
}
if (other_value.can__pdu().is_bound()) {
  single_value->field_can__pdu = other_value.can__pdu();
} else {
  single_value->field_can__pdu.clean_up();
}
set_selection(SPECIFIC_VALUE);
}

void CAN__frame_template::copy_template(const CAN__frame_template& other_value)
{
switch (other_value.template_selection) {
case SPECIFIC_VALUE:
single_value = new single_value_struct;
if (UNINITIALIZED_TEMPLATE != other_value.can__id().get_selection()) {
single_value->field_can__id = other_value.can__id();
} else {
single_value->field_can__id.clean_up();
}
if (UNINITIALIZED_TEMPLATE != other_value.can__pdu().get_selection()) {
single_value->field_can__pdu = other_value.can__pdu();
} else {
single_value->field_can__pdu.clean_up();
}
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = other_value.value_list.n_values;
value_list.list_value = new CAN__frame_template[value_list.n_values];
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].copy_template(other_value.value_list.list_value[list_count]);
break;
default:
TTCN_error("Copying an uninitialized/unsupported template of type @Can.CAN_frame.");
break;
}
set_selection(other_value);
}

CAN__frame_template::CAN__frame_template()
{
}

CAN__frame_template::CAN__frame_template(template_sel other_value)
 : Base_Template(other_value)
{
check_single_selection(other_value);
}

CAN__frame_template::CAN__frame_template(const CAN__frame& other_value)
{
copy_value(other_value);
}

CAN__frame_template::CAN__frame_template(const OPTIONAL<CAN__frame>& other_value)
{
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
copy_value((const CAN__frame&)other_value);
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Creating a template of type @Can.CAN_frame from an unbound optional field.");
}
}

CAN__frame_template::CAN__frame_template(const CAN__frame_template& other_value)
: Base_Template()
{
copy_template(other_value);
}

CAN__frame_template::~CAN__frame_template()
{
clean_up();
}

CAN__frame_template& CAN__frame_template::operator=(template_sel other_value)
{
check_single_selection(other_value);
clean_up();
set_selection(other_value);
return *this;
}

CAN__frame_template& CAN__frame_template::operator=(const CAN__frame& other_value)
{
clean_up();
copy_value(other_value);
return *this;
}

CAN__frame_template& CAN__frame_template::operator=(const OPTIONAL<CAN__frame>& other_value)
{
clean_up();
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
copy_value((const CAN__frame&)other_value);
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Assignment of an unbound optional field to a template of type @Can.CAN_frame.");
}
return *this;
}

CAN__frame_template& CAN__frame_template::operator=(const CAN__frame_template& other_value)
{
if (&other_value != this) {
clean_up();
copy_template(other_value);
}
return *this;
}

boolean CAN__frame_template::match(const CAN__frame& other_value, boolean legacy) const
{
if (!other_value.is_bound()) return FALSE;
switch (template_selection) {
case ANY_VALUE:
case ANY_OR_OMIT:
return TRUE;
case OMIT_VALUE:
return FALSE;
case SPECIFIC_VALUE:
if(!other_value.can__id().is_bound()) return FALSE;
if(!single_value->field_can__id.match(other_value.can__id(), legacy))return FALSE;
if(!other_value.can__pdu().is_bound()) return FALSE;
if(!single_value->field_can__pdu.match(other_value.can__pdu(), legacy))return FALSE;
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
if (value_list.list_value[list_count].match(other_value, legacy)) return template_selection == VALUE_LIST;
return template_selection == COMPLEMENTED_LIST;
default:
TTCN_error("Matching an uninitialized/unsupported template of type @Can.CAN_frame.");
}
return FALSE;
}

boolean CAN__frame_template::is_bound() const
{
if (template_selection == UNINITIALIZED_TEMPLATE && !is_ifpresent) return FALSE;
if (template_selection != SPECIFIC_VALUE) return TRUE;
return single_value->field_can__id.is_bound()

 ||single_value->field_can__pdu.is_bound()
;
}

boolean CAN__frame_template::is_value() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent) return FALSE;
return single_value->field_can__id.is_value()
 &&single_value->field_can__pdu.is_value();
}

void CAN__frame_template::clean_up()
{
switch (template_selection) {
case SPECIFIC_VALUE:
delete single_value;
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
delete [] value_list.list_value;
default:
break;
}
template_selection = UNINITIALIZED_TEMPLATE;
}

CAN__frame CAN__frame_template::valueof() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent)
TTCN_error("Performing a valueof or send operation on a non-specific template of type @Can.CAN_frame.");
CAN__frame ret_val;
if (single_value->field_can__id.is_bound()) {
ret_val.can__id() = single_value->field_can__id.valueof();
}
if (single_value->field_can__pdu.is_bound()) {
ret_val.can__pdu() = single_value->field_can__pdu.valueof();
}
return ret_val;
}

void CAN__frame_template::set_type(template_sel template_type, unsigned int list_length)
{
if (template_type != VALUE_LIST && template_type != COMPLEMENTED_LIST)
TTCN_error("Setting an invalid list for a template of type @Can.CAN_frame.");
clean_up();
set_selection(template_type);
value_list.n_values = list_length;
value_list.list_value = new CAN__frame_template[list_length];
}

CAN__frame_template& CAN__frame_template::list_item(unsigned int list_index) const
{
if (template_selection != VALUE_LIST && template_selection != COMPLEMENTED_LIST)
TTCN_error("Accessing a list element of a non-list template of type @Can.CAN_frame.");
if (list_index >= value_list.n_values)
TTCN_error("Index overflow in a value list template of type @Can.CAN_frame.");
return value_list.list_value[list_index];
}

OCTETSTRING_template& CAN__frame_template::can__id()
{
set_specific();
return single_value->field_can__id;
}

const OCTETSTRING_template& CAN__frame_template::can__id() const
{
if (template_selection != SPECIFIC_VALUE)
TTCN_error("Accessing field can_id of a non-specific template of type @Can.CAN_frame.");
return single_value->field_can__id;
}

OCTETSTRING_template& CAN__frame_template::can__pdu()
{
set_specific();
return single_value->field_can__pdu;
}

const OCTETSTRING_template& CAN__frame_template::can__pdu() const
{
if (template_selection != SPECIFIC_VALUE)
TTCN_error("Accessing field can_pdu of a non-specific template of type @Can.CAN_frame.");
return single_value->field_can__pdu;
}

int CAN__frame_template::size_of() const
{
  if (is_ifpresent) TTCN_error("Performing sizeof() operation on a template of type @Can.CAN_frame which has an ifpresent attribute.");
  switch (template_selection)
  {
  case SPECIFIC_VALUE:
    return 2;
  case VALUE_LIST:
   {
     if (value_list.n_values<1)
       TTCN_error("Internal error: Performing sizeof() operation on a template of type @Can.CAN_frame containing an empty list.");
      int item_size = value_list.list_value[0].size_of();
      for (unsigned int l_idx = 1; l_idx < value_list.n_values; l_idx++)
      {
        if (value_list.list_value[l_idx].size_of()!=item_size)
          TTCN_error("Performing sizeof() operation on a template of type @Can.CAN_frame containing a value list with different sizes.");
      }
      return item_size;
    }
  case OMIT_VALUE:
    TTCN_error("Performing sizeof() operation on a template of type @Can.CAN_frame containing omit value.");
  case ANY_VALUE:
  case ANY_OR_OMIT:
    TTCN_error("Performing sizeof() operation on a template of type @Can.CAN_frame containing */? value.");
  case COMPLEMENTED_LIST:
    TTCN_error("Performing sizeof() operation on a template of type @Can.CAN_frame containing complemented list.");
  default:
    TTCN_error("Performing sizeof() operation on an uninitialized/unsupported template of type @Can.CAN_frame.");
  }
  return 0;
}

void CAN__frame_template::log() const
{
switch (template_selection) {
case SPECIFIC_VALUE:
TTCN_Logger::log_event_str("{ can_id := ");
single_value->field_can__id.log();
TTCN_Logger::log_event_str(", can_pdu := ");
single_value->field_can__pdu.log();
TTCN_Logger::log_event_str(" }");
break;
case COMPLEMENTED_LIST:
TTCN_Logger::log_event_str("complement");
case VALUE_LIST:
TTCN_Logger::log_char('(');
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++) {
if (list_count > 0) TTCN_Logger::log_event_str(", ");
value_list.list_value[list_count].log();
}
TTCN_Logger::log_char(')');
break;
default:
log_generic();
}
log_ifpresent();
}

void CAN__frame_template::log_match(const CAN__frame& match_value, boolean legacy) const
{
if(TTCN_Logger::VERBOSITY_COMPACT == TTCN_Logger::get_matching_verbosity()){
if(match(match_value, legacy)){
TTCN_Logger::print_logmatch_buffer();
TTCN_Logger::log_event_str(" matched");
} else{
if (template_selection == SPECIFIC_VALUE) {
size_t previous_size = TTCN_Logger::get_logmatch_buffer_len();
if(!single_value->field_can__id.match(match_value.can__id(), legacy)){
TTCN_Logger::log_logmatch_info(".can_id");
single_value->field_can__id.log_match(match_value.can__id(), legacy);
TTCN_Logger::set_logmatch_buffer_len(previous_size);
}
if(!single_value->field_can__pdu.match(match_value.can__pdu(), legacy)){
TTCN_Logger::log_logmatch_info(".can_pdu");
single_value->field_can__pdu.log_match(match_value.can__pdu(), legacy);
TTCN_Logger::set_logmatch_buffer_len(previous_size);
}
}else {
TTCN_Logger::print_logmatch_buffer();
match_value.log();
TTCN_Logger::log_event_str(" with ");
log();
TTCN_Logger::log_event_str(" unmatched");
}
}
return;
}
if (template_selection == SPECIFIC_VALUE) {
TTCN_Logger::log_event_str("{ can_id := ");
single_value->field_can__id.log_match(match_value.can__id(), legacy);
TTCN_Logger::log_event_str(", can_pdu := ");
single_value->field_can__pdu.log_match(match_value.can__pdu(), legacy);
TTCN_Logger::log_event_str(" }");
} else {
match_value.log();
TTCN_Logger::log_event_str(" with ");
log();
if (match(match_value, legacy)) TTCN_Logger::log_event_str(" matched");
else TTCN_Logger::log_event_str(" unmatched");
}
}

void CAN__frame_template::encode_text(Text_Buf& text_buf) const
{
encode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value->field_can__id.encode_text(text_buf);
single_value->field_can__pdu.encode_text(text_buf);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
text_buf.push_int(value_list.n_values);
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].encode_text(text_buf);
break;
default:
TTCN_error("Text encoder: Encoding an uninitialized/unsupported template of type @Can.CAN_frame.");
}
}

void CAN__frame_template::decode_text(Text_Buf& text_buf)
{
clean_up();
decode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value = new single_value_struct;
single_value->field_can__id.decode_text(text_buf);
single_value->field_can__pdu.decode_text(text_buf);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = text_buf.pull_int().get_val();
value_list.list_value = new CAN__frame_template[value_list.n_values];
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].decode_text(text_buf);
break;
default:
TTCN_error("Text decoder: An unknown/unsupported selection was received in a template of type @Can.CAN_frame.");
}
}

void CAN__frame_template::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_TEMPLATE, "record template");
  switch (param.get_type()) {
  case Module_Param::MP_Omit:
    *this = OMIT_VALUE;
    break;
  case Module_Param::MP_Any:
    *this = ANY_VALUE;
    break;
  case Module_Param::MP_AnyOrNone:
    *this = ANY_OR_OMIT;
    break;
  case Module_Param::MP_List_Template:
  case Module_Param::MP_ComplementList_Template: {
    CAN__frame_template new_temp;
    new_temp.set_type(param.get_type()==Module_Param::MP_List_Template ? VALUE_LIST : COMPLEMENTED_LIST, param.get_size());
    for (size_t p_i=0; p_i<param.get_size(); p_i++) {
      new_temp.list_item(p_i).set_param(*param.get_elem(p_i));
    }
    *this = new_temp;
    break; }
  case Module_Param::MP_Value_List:
    if (2<param.get_size()) {
      param.error("record template of type @Can.CAN_frame has 2 fields but list value has %d fields", (int)param.get_size());
    }
    if (param.get_size()>0 && param.get_elem(0)->get_type()!=Module_Param::MP_NotUsed) can__id().set_param(*param.get_elem(0));
    if (param.get_size()>1 && param.get_elem(1)->get_type()!=Module_Param::MP_NotUsed) can__pdu().set_param(*param.get_elem(1));
    break;
  case Module_Param::MP_Assignment_List: {
    Vector<bool> value_used(param.get_size());
    value_used.resize(param.get_size(), FALSE);
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_id")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__id().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_pdu")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__pdu().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) if (!value_used[val_idx]) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      curr_param->error("Non existent field name in type @Can.CAN_frame: %s", curr_param->get_id()->get_name());
      break;
    }
  } break;
  default:
    param.type_error("record template", "@Can.CAN_frame");
  }
  is_ifpresent = param.get_ifpresent();
}

void CAN__frame_template::check_restriction(template_res t_res, const char* t_name, boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return;
switch ((t_name&&(t_res==TR_VALUE))?TR_OMIT:t_res) {
case TR_OMIT:
if (template_selection==OMIT_VALUE) return;
case TR_VALUE:
if (template_selection!=SPECIFIC_VALUE || is_ifpresent) break;
single_value->field_can__id.check_restriction(t_res, t_name ? t_name : "@Can.CAN_frame");
single_value->field_can__pdu.check_restriction(t_res, t_name ? t_name : "@Can.CAN_frame");
return;
case TR_PRESENT:
if (!match_omit(legacy)) return;
break;
default:
return;
}
TTCN_error("Restriction `%s' on template of type %s violated.", get_res_name(t_res), t_name ? t_name : "@Can.CAN_frame");
}

boolean CAN__frame_template::is_present(boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return FALSE;
return !match_omit(legacy);
}

boolean CAN__frame_template::match_omit(boolean legacy) const
{
if (is_ifpresent) return TRUE;
switch (template_selection) {
case OMIT_VALUE:
case ANY_OR_OMIT:
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
if (legacy) {
for (unsigned int l_idx=0; l_idx<value_list.n_values; l_idx++)
if (value_list.list_value[l_idx].match_omit())
return template_selection==VALUE_LIST;
return template_selection==COMPLEMENTED_LIST;
} // else fall through
default:
return FALSE;
}
return FALSE;
}

CANFD__frame::CANFD__frame()
{
}

CANFD__frame::CANFD__frame(const OCTETSTRING& par_can__id,
    const BITSTRING& par_can__flags,
    const OCTETSTRING& par_can__pdu)
  :   field_can__id(par_can__id),
  field_can__flags(par_can__flags),
  field_can__pdu(par_can__pdu)
{
}

CANFD__frame::CANFD__frame(const CANFD__frame& other_value)
{
if(!other_value.is_bound()) TTCN_error("Copying an unbound value of type @Can.CANFD_frame.");
if (other_value.can__id().is_bound()) field_can__id = other_value.can__id();
else field_can__id.clean_up();
if (other_value.can__flags().is_bound()) field_can__flags = other_value.can__flags();
else field_can__flags.clean_up();
if (other_value.can__pdu().is_bound()) field_can__pdu = other_value.can__pdu();
else field_can__pdu.clean_up();
}

void CANFD__frame::clean_up()
{
field_can__id.clean_up();
field_can__flags.clean_up();
field_can__pdu.clean_up();
}

const TTCN_Typedescriptor_t* CANFD__frame::get_descriptor() const { return &CANFD__frame_descr_; }
CANFD__frame& CANFD__frame::operator=(const CANFD__frame& other_value)
{
if (this != &other_value) {
  if(!other_value.is_bound()) TTCN_error("Assignment of an unbound value of type @Can.CANFD_frame.");
  if (other_value.can__id().is_bound()) field_can__id = other_value.can__id();
  else field_can__id.clean_up();
  if (other_value.can__flags().is_bound()) field_can__flags = other_value.can__flags();
  else field_can__flags.clean_up();
  if (other_value.can__pdu().is_bound()) field_can__pdu = other_value.can__pdu();
  else field_can__pdu.clean_up();
}
return *this;
}

boolean CANFD__frame::operator==(const CANFD__frame& other_value) const
{
return field_can__id==other_value.field_can__id
  && field_can__flags==other_value.field_can__flags
  && field_can__pdu==other_value.field_can__pdu;
}

boolean CANFD__frame::is_bound() const
{
return (field_can__id.is_bound())
  || (field_can__flags.is_bound())
  || (field_can__pdu.is_bound());
}
boolean CANFD__frame::is_value() const
{
return field_can__id.is_value()
  && field_can__flags.is_value()
  && field_can__pdu.is_value();
}
void CANFD__frame::log() const
{
if (!is_bound()) {
TTCN_Logger::log_event_unbound();
return;
}
TTCN_Logger::log_event_str("{ can_id := ");
field_can__id.log();
TTCN_Logger::log_event_str(", can_flags := ");
field_can__flags.log();
TTCN_Logger::log_event_str(", can_pdu := ");
field_can__pdu.log();
TTCN_Logger::log_event_str(" }");
}

void CANFD__frame::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_VALUE, "record value");
  switch (param.get_type()) {
  case Module_Param::MP_Value_List:
    if (3<param.get_size()) {
      param.error("record value of type @Can.CANFD_frame has 3 fields but list value has %d fields", (int)param.get_size());
    }
    if (param.get_size()>0 && param.get_elem(0)->get_type()!=Module_Param::MP_NotUsed) can__id().set_param(*param.get_elem(0));
    if (param.get_size()>1 && param.get_elem(1)->get_type()!=Module_Param::MP_NotUsed) can__flags().set_param(*param.get_elem(1));
    if (param.get_size()>2 && param.get_elem(2)->get_type()!=Module_Param::MP_NotUsed) can__pdu().set_param(*param.get_elem(2));
    break;
  case Module_Param::MP_Assignment_List: {
    Vector<bool> value_used(param.get_size());
    value_used.resize(param.get_size(), FALSE);
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_id")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__id().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_flags")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__flags().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_pdu")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__pdu().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) if (!value_used[val_idx]) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      curr_param->error("Non existent field name in type @Can.CANFD_frame: %s", curr_param->get_id()->get_name());
      break;
    }
  } break;
  default:
    param.type_error("record value", "@Can.CANFD_frame");
  }
}

void CANFD__frame::set_implicit_omit()
{
if (can__id().is_bound()) can__id().set_implicit_omit();
if (can__flags().is_bound()) can__flags().set_implicit_omit();
if (can__pdu().is_bound()) can__pdu().set_implicit_omit();
}

void CANFD__frame::encode_text(Text_Buf& text_buf) const
{
field_can__id.encode_text(text_buf);
field_can__flags.encode_text(text_buf);
field_can__pdu.encode_text(text_buf);
}

void CANFD__frame::decode_text(Text_Buf& text_buf)
{
field_can__id.decode_text(text_buf);
field_can__flags.decode_text(text_buf);
field_can__pdu.decode_text(text_buf);
}

struct CANFD__frame_template::single_value_struct {
OCTETSTRING_template field_can__id;
BITSTRING_template field_can__flags;
OCTETSTRING_template field_can__pdu;
};

void CANFD__frame_template::set_specific()
{
if (template_selection != SPECIFIC_VALUE) {
template_sel old_selection = template_selection;
clean_up();
single_value = new single_value_struct;
set_selection(SPECIFIC_VALUE);
if (old_selection == ANY_VALUE || old_selection == ANY_OR_OMIT) {
single_value->field_can__id = ANY_VALUE;
single_value->field_can__flags = ANY_VALUE;
single_value->field_can__pdu = ANY_VALUE;
}
}
}

void CANFD__frame_template::copy_value(const CANFD__frame& other_value)
{
single_value = new single_value_struct;
if (other_value.can__id().is_bound()) {
  single_value->field_can__id = other_value.can__id();
} else {
  single_value->field_can__id.clean_up();
}
if (other_value.can__flags().is_bound()) {
  single_value->field_can__flags = other_value.can__flags();
} else {
  single_value->field_can__flags.clean_up();
}
if (other_value.can__pdu().is_bound()) {
  single_value->field_can__pdu = other_value.can__pdu();
} else {
  single_value->field_can__pdu.clean_up();
}
set_selection(SPECIFIC_VALUE);
}

void CANFD__frame_template::copy_template(const CANFD__frame_template& other_value)
{
switch (other_value.template_selection) {
case SPECIFIC_VALUE:
single_value = new single_value_struct;
if (UNINITIALIZED_TEMPLATE != other_value.can__id().get_selection()) {
single_value->field_can__id = other_value.can__id();
} else {
single_value->field_can__id.clean_up();
}
if (UNINITIALIZED_TEMPLATE != other_value.can__flags().get_selection()) {
single_value->field_can__flags = other_value.can__flags();
} else {
single_value->field_can__flags.clean_up();
}
if (UNINITIALIZED_TEMPLATE != other_value.can__pdu().get_selection()) {
single_value->field_can__pdu = other_value.can__pdu();
} else {
single_value->field_can__pdu.clean_up();
}
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = other_value.value_list.n_values;
value_list.list_value = new CANFD__frame_template[value_list.n_values];
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].copy_template(other_value.value_list.list_value[list_count]);
break;
default:
TTCN_error("Copying an uninitialized/unsupported template of type @Can.CANFD_frame.");
break;
}
set_selection(other_value);
}

CANFD__frame_template::CANFD__frame_template()
{
}

CANFD__frame_template::CANFD__frame_template(template_sel other_value)
 : Base_Template(other_value)
{
check_single_selection(other_value);
}

CANFD__frame_template::CANFD__frame_template(const CANFD__frame& other_value)
{
copy_value(other_value);
}

CANFD__frame_template::CANFD__frame_template(const OPTIONAL<CANFD__frame>& other_value)
{
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
copy_value((const CANFD__frame&)other_value);
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Creating a template of type @Can.CANFD_frame from an unbound optional field.");
}
}

CANFD__frame_template::CANFD__frame_template(const CANFD__frame_template& other_value)
: Base_Template()
{
copy_template(other_value);
}

CANFD__frame_template::~CANFD__frame_template()
{
clean_up();
}

CANFD__frame_template& CANFD__frame_template::operator=(template_sel other_value)
{
check_single_selection(other_value);
clean_up();
set_selection(other_value);
return *this;
}

CANFD__frame_template& CANFD__frame_template::operator=(const CANFD__frame& other_value)
{
clean_up();
copy_value(other_value);
return *this;
}

CANFD__frame_template& CANFD__frame_template::operator=(const OPTIONAL<CANFD__frame>& other_value)
{
clean_up();
switch (other_value.get_selection()) {
case OPTIONAL_PRESENT:
copy_value((const CANFD__frame&)other_value);
break;
case OPTIONAL_OMIT:
set_selection(OMIT_VALUE);
break;
default:
TTCN_error("Assignment of an unbound optional field to a template of type @Can.CANFD_frame.");
}
return *this;
}

CANFD__frame_template& CANFD__frame_template::operator=(const CANFD__frame_template& other_value)
{
if (&other_value != this) {
clean_up();
copy_template(other_value);
}
return *this;
}

boolean CANFD__frame_template::match(const CANFD__frame& other_value, boolean legacy) const
{
if (!other_value.is_bound()) return FALSE;
switch (template_selection) {
case ANY_VALUE:
case ANY_OR_OMIT:
return TRUE;
case OMIT_VALUE:
return FALSE;
case SPECIFIC_VALUE:
if(!other_value.can__id().is_bound()) return FALSE;
if(!single_value->field_can__id.match(other_value.can__id(), legacy))return FALSE;
if(!other_value.can__flags().is_bound()) return FALSE;
if(!single_value->field_can__flags.match(other_value.can__flags(), legacy))return FALSE;
if(!other_value.can__pdu().is_bound()) return FALSE;
if(!single_value->field_can__pdu.match(other_value.can__pdu(), legacy))return FALSE;
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
if (value_list.list_value[list_count].match(other_value, legacy)) return template_selection == VALUE_LIST;
return template_selection == COMPLEMENTED_LIST;
default:
TTCN_error("Matching an uninitialized/unsupported template of type @Can.CANFD_frame.");
}
return FALSE;
}

boolean CANFD__frame_template::is_bound() const
{
if (template_selection == UNINITIALIZED_TEMPLATE && !is_ifpresent) return FALSE;
if (template_selection != SPECIFIC_VALUE) return TRUE;
return single_value->field_can__id.is_bound()

 ||single_value->field_can__flags.is_bound()

 ||single_value->field_can__pdu.is_bound()
;
}

boolean CANFD__frame_template::is_value() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent) return FALSE;
return single_value->field_can__id.is_value()
 &&single_value->field_can__flags.is_value()
 &&single_value->field_can__pdu.is_value();
}

void CANFD__frame_template::clean_up()
{
switch (template_selection) {
case SPECIFIC_VALUE:
delete single_value;
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
delete [] value_list.list_value;
default:
break;
}
template_selection = UNINITIALIZED_TEMPLATE;
}

CANFD__frame CANFD__frame_template::valueof() const
{
if (template_selection != SPECIFIC_VALUE || is_ifpresent)
TTCN_error("Performing a valueof or send operation on a non-specific template of type @Can.CANFD_frame.");
CANFD__frame ret_val;
if (single_value->field_can__id.is_bound()) {
ret_val.can__id() = single_value->field_can__id.valueof();
}
if (single_value->field_can__flags.is_bound()) {
ret_val.can__flags() = single_value->field_can__flags.valueof();
}
if (single_value->field_can__pdu.is_bound()) {
ret_val.can__pdu() = single_value->field_can__pdu.valueof();
}
return ret_val;
}

void CANFD__frame_template::set_type(template_sel template_type, unsigned int list_length)
{
if (template_type != VALUE_LIST && template_type != COMPLEMENTED_LIST)
TTCN_error("Setting an invalid list for a template of type @Can.CANFD_frame.");
clean_up();
set_selection(template_type);
value_list.n_values = list_length;
value_list.list_value = new CANFD__frame_template[list_length];
}

CANFD__frame_template& CANFD__frame_template::list_item(unsigned int list_index) const
{
if (template_selection != VALUE_LIST && template_selection != COMPLEMENTED_LIST)
TTCN_error("Accessing a list element of a non-list template of type @Can.CANFD_frame.");
if (list_index >= value_list.n_values)
TTCN_error("Index overflow in a value list template of type @Can.CANFD_frame.");
return value_list.list_value[list_index];
}

OCTETSTRING_template& CANFD__frame_template::can__id()
{
set_specific();
return single_value->field_can__id;
}

const OCTETSTRING_template& CANFD__frame_template::can__id() const
{
if (template_selection != SPECIFIC_VALUE)
TTCN_error("Accessing field can_id of a non-specific template of type @Can.CANFD_frame.");
return single_value->field_can__id;
}

BITSTRING_template& CANFD__frame_template::can__flags()
{
set_specific();
return single_value->field_can__flags;
}

const BITSTRING_template& CANFD__frame_template::can__flags() const
{
if (template_selection != SPECIFIC_VALUE)
TTCN_error("Accessing field can_flags of a non-specific template of type @Can.CANFD_frame.");
return single_value->field_can__flags;
}

OCTETSTRING_template& CANFD__frame_template::can__pdu()
{
set_specific();
return single_value->field_can__pdu;
}

const OCTETSTRING_template& CANFD__frame_template::can__pdu() const
{
if (template_selection != SPECIFIC_VALUE)
TTCN_error("Accessing field can_pdu of a non-specific template of type @Can.CANFD_frame.");
return single_value->field_can__pdu;
}

int CANFD__frame_template::size_of() const
{
  if (is_ifpresent) TTCN_error("Performing sizeof() operation on a template of type @Can.CANFD_frame which has an ifpresent attribute.");
  switch (template_selection)
  {
  case SPECIFIC_VALUE:
    return 3;
  case VALUE_LIST:
   {
     if (value_list.n_values<1)
       TTCN_error("Internal error: Performing sizeof() operation on a template of type @Can.CANFD_frame containing an empty list.");
      int item_size = value_list.list_value[0].size_of();
      for (unsigned int l_idx = 1; l_idx < value_list.n_values; l_idx++)
      {
        if (value_list.list_value[l_idx].size_of()!=item_size)
          TTCN_error("Performing sizeof() operation on a template of type @Can.CANFD_frame containing a value list with different sizes.");
      }
      return item_size;
    }
  case OMIT_VALUE:
    TTCN_error("Performing sizeof() operation on a template of type @Can.CANFD_frame containing omit value.");
  case ANY_VALUE:
  case ANY_OR_OMIT:
    TTCN_error("Performing sizeof() operation on a template of type @Can.CANFD_frame containing */? value.");
  case COMPLEMENTED_LIST:
    TTCN_error("Performing sizeof() operation on a template of type @Can.CANFD_frame containing complemented list.");
  default:
    TTCN_error("Performing sizeof() operation on an uninitialized/unsupported template of type @Can.CANFD_frame.");
  }
  return 0;
}

void CANFD__frame_template::log() const
{
switch (template_selection) {
case SPECIFIC_VALUE:
TTCN_Logger::log_event_str("{ can_id := ");
single_value->field_can__id.log();
TTCN_Logger::log_event_str(", can_flags := ");
single_value->field_can__flags.log();
TTCN_Logger::log_event_str(", can_pdu := ");
single_value->field_can__pdu.log();
TTCN_Logger::log_event_str(" }");
break;
case COMPLEMENTED_LIST:
TTCN_Logger::log_event_str("complement");
case VALUE_LIST:
TTCN_Logger::log_char('(');
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++) {
if (list_count > 0) TTCN_Logger::log_event_str(", ");
value_list.list_value[list_count].log();
}
TTCN_Logger::log_char(')');
break;
default:
log_generic();
}
log_ifpresent();
}

void CANFD__frame_template::log_match(const CANFD__frame& match_value, boolean legacy) const
{
if(TTCN_Logger::VERBOSITY_COMPACT == TTCN_Logger::get_matching_verbosity()){
if(match(match_value, legacy)){
TTCN_Logger::print_logmatch_buffer();
TTCN_Logger::log_event_str(" matched");
} else{
if (template_selection == SPECIFIC_VALUE) {
size_t previous_size = TTCN_Logger::get_logmatch_buffer_len();
if(!single_value->field_can__id.match(match_value.can__id(), legacy)){
TTCN_Logger::log_logmatch_info(".can_id");
single_value->field_can__id.log_match(match_value.can__id(), legacy);
TTCN_Logger::set_logmatch_buffer_len(previous_size);
}
if(!single_value->field_can__flags.match(match_value.can__flags(), legacy)){
TTCN_Logger::log_logmatch_info(".can_flags");
single_value->field_can__flags.log_match(match_value.can__flags(), legacy);
TTCN_Logger::set_logmatch_buffer_len(previous_size);
}
if(!single_value->field_can__pdu.match(match_value.can__pdu(), legacy)){
TTCN_Logger::log_logmatch_info(".can_pdu");
single_value->field_can__pdu.log_match(match_value.can__pdu(), legacy);
TTCN_Logger::set_logmatch_buffer_len(previous_size);
}
}else {
TTCN_Logger::print_logmatch_buffer();
match_value.log();
TTCN_Logger::log_event_str(" with ");
log();
TTCN_Logger::log_event_str(" unmatched");
}
}
return;
}
if (template_selection == SPECIFIC_VALUE) {
TTCN_Logger::log_event_str("{ can_id := ");
single_value->field_can__id.log_match(match_value.can__id(), legacy);
TTCN_Logger::log_event_str(", can_flags := ");
single_value->field_can__flags.log_match(match_value.can__flags(), legacy);
TTCN_Logger::log_event_str(", can_pdu := ");
single_value->field_can__pdu.log_match(match_value.can__pdu(), legacy);
TTCN_Logger::log_event_str(" }");
} else {
match_value.log();
TTCN_Logger::log_event_str(" with ");
log();
if (match(match_value, legacy)) TTCN_Logger::log_event_str(" matched");
else TTCN_Logger::log_event_str(" unmatched");
}
}

void CANFD__frame_template::encode_text(Text_Buf& text_buf) const
{
encode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value->field_can__id.encode_text(text_buf);
single_value->field_can__flags.encode_text(text_buf);
single_value->field_can__pdu.encode_text(text_buf);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
text_buf.push_int(value_list.n_values);
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].encode_text(text_buf);
break;
default:
TTCN_error("Text encoder: Encoding an uninitialized/unsupported template of type @Can.CANFD_frame.");
}
}

void CANFD__frame_template::decode_text(Text_Buf& text_buf)
{
clean_up();
decode_text_base(text_buf);
switch (template_selection) {
case SPECIFIC_VALUE:
single_value = new single_value_struct;
single_value->field_can__id.decode_text(text_buf);
single_value->field_can__flags.decode_text(text_buf);
single_value->field_can__pdu.decode_text(text_buf);
case OMIT_VALUE:
case ANY_VALUE:
case ANY_OR_OMIT:
break;
case VALUE_LIST:
case COMPLEMENTED_LIST:
value_list.n_values = text_buf.pull_int().get_val();
value_list.list_value = new CANFD__frame_template[value_list.n_values];
for (unsigned int list_count = 0; list_count < value_list.n_values; list_count++)
value_list.list_value[list_count].decode_text(text_buf);
break;
default:
TTCN_error("Text decoder: An unknown/unsupported selection was received in a template of type @Can.CANFD_frame.");
}
}

void CANFD__frame_template::set_param(Module_Param& param)
{
  param.basic_check(Module_Param::BC_TEMPLATE, "record template");
  switch (param.get_type()) {
  case Module_Param::MP_Omit:
    *this = OMIT_VALUE;
    break;
  case Module_Param::MP_Any:
    *this = ANY_VALUE;
    break;
  case Module_Param::MP_AnyOrNone:
    *this = ANY_OR_OMIT;
    break;
  case Module_Param::MP_List_Template:
  case Module_Param::MP_ComplementList_Template: {
    CANFD__frame_template new_temp;
    new_temp.set_type(param.get_type()==Module_Param::MP_List_Template ? VALUE_LIST : COMPLEMENTED_LIST, param.get_size());
    for (size_t p_i=0; p_i<param.get_size(); p_i++) {
      new_temp.list_item(p_i).set_param(*param.get_elem(p_i));
    }
    *this = new_temp;
    break; }
  case Module_Param::MP_Value_List:
    if (3<param.get_size()) {
      param.error("record template of type @Can.CANFD_frame has 3 fields but list value has %d fields", (int)param.get_size());
    }
    if (param.get_size()>0 && param.get_elem(0)->get_type()!=Module_Param::MP_NotUsed) can__id().set_param(*param.get_elem(0));
    if (param.get_size()>1 && param.get_elem(1)->get_type()!=Module_Param::MP_NotUsed) can__flags().set_param(*param.get_elem(1));
    if (param.get_size()>2 && param.get_elem(2)->get_type()!=Module_Param::MP_NotUsed) can__pdu().set_param(*param.get_elem(2));
    break;
  case Module_Param::MP_Assignment_List: {
    Vector<bool> value_used(param.get_size());
    value_used.resize(param.get_size(), FALSE);
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_id")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__id().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_flags")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__flags().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      if (!strcmp(curr_param->get_id()->get_name(), "can_pdu")) {
        if (curr_param->get_type()!=Module_Param::MP_NotUsed) {
          can__pdu().set_param(*curr_param);
        }
        value_used[val_idx]=TRUE;
      }
    }
    for (size_t val_idx=0; val_idx<param.get_size(); val_idx++) if (!value_used[val_idx]) {
      Module_Param* const curr_param = param.get_elem(val_idx);
      curr_param->error("Non existent field name in type @Can.CANFD_frame: %s", curr_param->get_id()->get_name());
      break;
    }
  } break;
  default:
    param.type_error("record template", "@Can.CANFD_frame");
  }
  is_ifpresent = param.get_ifpresent();
}

void CANFD__frame_template::check_restriction(template_res t_res, const char* t_name, boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return;
switch ((t_name&&(t_res==TR_VALUE))?TR_OMIT:t_res) {
case TR_OMIT:
if (template_selection==OMIT_VALUE) return;
case TR_VALUE:
if (template_selection!=SPECIFIC_VALUE || is_ifpresent) break;
single_value->field_can__id.check_restriction(t_res, t_name ? t_name : "@Can.CANFD_frame");
single_value->field_can__flags.check_restriction(t_res, t_name ? t_name : "@Can.CANFD_frame");
single_value->field_can__pdu.check_restriction(t_res, t_name ? t_name : "@Can.CANFD_frame");
return;
case TR_PRESENT:
if (!match_omit(legacy)) return;
break;
default:
return;
}
TTCN_error("Restriction `%s' on template of type %s violated.", get_res_name(t_res), t_name ? t_name : "@Can.CANFD_frame");
}

boolean CANFD__frame_template::is_present(boolean legacy) const
{
if (template_selection==UNINITIALIZED_TEMPLATE) return FALSE;
return !match_omit(legacy);
}

boolean CANFD__frame_template::match_omit(boolean legacy) const
{
if (is_ifpresent) return TRUE;
switch (template_selection) {
case OMIT_VALUE:
case ANY_OR_OMIT:
return TRUE;
case VALUE_LIST:
case COMPLEMENTED_LIST:
if (legacy) {
for (unsigned int l_idx=0; l_idx<value_list.n_values; l_idx++)
if (value_list.list_value[l_idx].match_omit())
return template_selection==VALUE_LIST;
return template_selection==COMPLEMENTED_LIST;
} // else fall through
default:
return FALSE;
}
return FALSE;
}


/* Bodies of static functions */

static void pre_init_module()
{
TTCN_Location current_location("../src/Can.ttcn", 0, TTCN_Location::LOCATION_UNKNOWN, "Can");
General__Types::module_object.pre_init_module();
current_location.update_lineno(21);
#line 21 "../src/Can.ttcn"
const_CAN__EFF__FLAG = os_0;
current_location.update_lineno(22);
#line 22 "../src/Can.ttcn"
const_CAN__RTR__FLAG = os_1;
current_location.update_lineno(23);
#line 23 "../src/Can.ttcn"
const_CAN__ERR__FLAG = os_2;
current_location.update_lineno(26);
#line 26 "../src/Can.ttcn"
const_CAN__SFF__MASK = os_3;
current_location.update_lineno(27);
#line 27 "../src/Can.ttcn"
const_CAN__EFF__MASK = os_4;
current_location.update_lineno(28);
#line 28 "../src/Can.ttcn"
const_CAN__ERR__MASK = os_4;
current_location.update_lineno(109);
#line 109 "../src/Can.ttcn"
const_AF__CAN = 29;
current_location.update_lineno(134);
#line 134 "../src/Can.ttcn"
const_CAN__MAX__DLEN = 8;
current_location.update_lineno(138);
#line 138 "../src/Can.ttcn"
const_CANFD__MAX__DLEN = 64;
}

static void post_init_module()
{
TTCN_Location current_location("../src/Can.ttcn", 0, TTCN_Location::LOCATION_UNKNOWN, "Can");
General__Types::module_object.post_init_module();
current_location.update_lineno(30);
#line 30 "../src/Can.ttcn"
template_t__CAN__EFF__FLAG.set_type(VALUE_LIST, 128);
template_t__CAN__EFF__FLAG.list_item(0) = op_0;
template_t__CAN__EFF__FLAG.list_item(1) = op_1;
template_t__CAN__EFF__FLAG.list_item(2) = op_2;
template_t__CAN__EFF__FLAG.list_item(3) = op_3;
template_t__CAN__EFF__FLAG.list_item(4) = op_4;
template_t__CAN__EFF__FLAG.list_item(5) = op_5;
template_t__CAN__EFF__FLAG.list_item(6) = op_6;
template_t__CAN__EFF__FLAG.list_item(7) = op_7;
template_t__CAN__EFF__FLAG.list_item(8) = op_8;
template_t__CAN__EFF__FLAG.list_item(9) = op_9;
template_t__CAN__EFF__FLAG.list_item(10) = op_10;
template_t__CAN__EFF__FLAG.list_item(11) = op_11;
template_t__CAN__EFF__FLAG.list_item(12) = op_12;
template_t__CAN__EFF__FLAG.list_item(13) = op_13;
template_t__CAN__EFF__FLAG.list_item(14) = op_14;
template_t__CAN__EFF__FLAG.list_item(15) = op_15;
template_t__CAN__EFF__FLAG.list_item(16) = op_16;
template_t__CAN__EFF__FLAG.list_item(17) = op_17;
template_t__CAN__EFF__FLAG.list_item(18) = op_18;
template_t__CAN__EFF__FLAG.list_item(19) = op_19;
template_t__CAN__EFF__FLAG.list_item(20) = op_20;
template_t__CAN__EFF__FLAG.list_item(21) = op_21;
template_t__CAN__EFF__FLAG.list_item(22) = op_22;
template_t__CAN__EFF__FLAG.list_item(23) = op_23;
template_t__CAN__EFF__FLAG.list_item(24) = op_24;
template_t__CAN__EFF__FLAG.list_item(25) = op_25;
template_t__CAN__EFF__FLAG.list_item(26) = op_26;
template_t__CAN__EFF__FLAG.list_item(27) = op_27;
template_t__CAN__EFF__FLAG.list_item(28) = op_28;
template_t__CAN__EFF__FLAG.list_item(29) = op_29;
template_t__CAN__EFF__FLAG.list_item(30) = op_30;
template_t__CAN__EFF__FLAG.list_item(31) = op_31;
template_t__CAN__EFF__FLAG.list_item(32) = op_32;
template_t__CAN__EFF__FLAG.list_item(33) = op_33;
template_t__CAN__EFF__FLAG.list_item(34) = op_34;
template_t__CAN__EFF__FLAG.list_item(35) = op_35;
template_t__CAN__EFF__FLAG.list_item(36) = op_36;
template_t__CAN__EFF__FLAG.list_item(37) = op_37;
template_t__CAN__EFF__FLAG.list_item(38) = op_38;
template_t__CAN__EFF__FLAG.list_item(39) = op_39;
template_t__CAN__EFF__FLAG.list_item(40) = op_40;
template_t__CAN__EFF__FLAG.list_item(41) = op_41;
template_t__CAN__EFF__FLAG.list_item(42) = op_42;
template_t__CAN__EFF__FLAG.list_item(43) = op_43;
template_t__CAN__EFF__FLAG.list_item(44) = op_44;
template_t__CAN__EFF__FLAG.list_item(45) = op_45;
template_t__CAN__EFF__FLAG.list_item(46) = op_46;
template_t__CAN__EFF__FLAG.list_item(47) = op_47;
template_t__CAN__EFF__FLAG.list_item(48) = op_48;
template_t__CAN__EFF__FLAG.list_item(49) = op_49;
template_t__CAN__EFF__FLAG.list_item(50) = op_50;
template_t__CAN__EFF__FLAG.list_item(51) = op_51;
template_t__CAN__EFF__FLAG.list_item(52) = op_52;
template_t__CAN__EFF__FLAG.list_item(53) = op_53;
template_t__CAN__EFF__FLAG.list_item(54) = op_54;
template_t__CAN__EFF__FLAG.list_item(55) = op_55;
template_t__CAN__EFF__FLAG.list_item(56) = op_56;
template_t__CAN__EFF__FLAG.list_item(57) = op_57;
template_t__CAN__EFF__FLAG.list_item(58) = op_58;
template_t__CAN__EFF__FLAG.list_item(59) = op_59;
template_t__CAN__EFF__FLAG.list_item(60) = op_60;
template_t__CAN__EFF__FLAG.list_item(61) = op_61;
template_t__CAN__EFF__FLAG.list_item(62) = op_62;
template_t__CAN__EFF__FLAG.list_item(63) = op_63;
template_t__CAN__EFF__FLAG.list_item(64) = op_64;
template_t__CAN__EFF__FLAG.list_item(65) = op_65;
template_t__CAN__EFF__FLAG.list_item(66) = op_66;
template_t__CAN__EFF__FLAG.list_item(67) = op_67;
template_t__CAN__EFF__FLAG.list_item(68) = op_68;
template_t__CAN__EFF__FLAG.list_item(69) = op_69;
template_t__CAN__EFF__FLAG.list_item(70) = op_70;
template_t__CAN__EFF__FLAG.list_item(71) = op_71;
template_t__CAN__EFF__FLAG.list_item(72) = op_72;
template_t__CAN__EFF__FLAG.list_item(73) = op_73;
template_t__CAN__EFF__FLAG.list_item(74) = op_74;
template_t__CAN__EFF__FLAG.list_item(75) = op_75;
template_t__CAN__EFF__FLAG.list_item(76) = op_76;
template_t__CAN__EFF__FLAG.list_item(77) = op_77;
template_t__CAN__EFF__FLAG.list_item(78) = op_78;
template_t__CAN__EFF__FLAG.list_item(79) = op_79;
template_t__CAN__EFF__FLAG.list_item(80) = op_80;
template_t__CAN__EFF__FLAG.list_item(81) = op_81;
template_t__CAN__EFF__FLAG.list_item(82) = op_82;
template_t__CAN__EFF__FLAG.list_item(83) = op_83;
template_t__CAN__EFF__FLAG.list_item(84) = op_84;
template_t__CAN__EFF__FLAG.list_item(85) = op_85;
template_t__CAN__EFF__FLAG.list_item(86) = op_86;
template_t__CAN__EFF__FLAG.list_item(87) = op_87;
template_t__CAN__EFF__FLAG.list_item(88) = op_88;
template_t__CAN__EFF__FLAG.list_item(89) = op_89;
template_t__CAN__EFF__FLAG.list_item(90) = op_90;
template_t__CAN__EFF__FLAG.list_item(91) = op_91;
template_t__CAN__EFF__FLAG.list_item(92) = op_92;
template_t__CAN__EFF__FLAG.list_item(93) = op_93;
template_t__CAN__EFF__FLAG.list_item(94) = op_94;
template_t__CAN__EFF__FLAG.list_item(95) = op_95;
template_t__CAN__EFF__FLAG.list_item(96) = op_96;
template_t__CAN__EFF__FLAG.list_item(97) = op_97;
template_t__CAN__EFF__FLAG.list_item(98) = op_98;
template_t__CAN__EFF__FLAG.list_item(99) = op_99;
template_t__CAN__EFF__FLAG.list_item(100) = op_100;
template_t__CAN__EFF__FLAG.list_item(101) = op_101;
template_t__CAN__EFF__FLAG.list_item(102) = op_102;
template_t__CAN__EFF__FLAG.list_item(103) = op_103;
template_t__CAN__EFF__FLAG.list_item(104) = op_104;
template_t__CAN__EFF__FLAG.list_item(105) = op_105;
template_t__CAN__EFF__FLAG.list_item(106) = op_106;
template_t__CAN__EFF__FLAG.list_item(107) = op_107;
template_t__CAN__EFF__FLAG.list_item(108) = op_108;
template_t__CAN__EFF__FLAG.list_item(109) = op_109;
template_t__CAN__EFF__FLAG.list_item(110) = op_110;
template_t__CAN__EFF__FLAG.list_item(111) = op_111;
template_t__CAN__EFF__FLAG.list_item(112) = op_112;
template_t__CAN__EFF__FLAG.list_item(113) = op_113;
template_t__CAN__EFF__FLAG.list_item(114) = op_114;
template_t__CAN__EFF__FLAG.list_item(115) = op_115;
template_t__CAN__EFF__FLAG.list_item(116) = op_116;
template_t__CAN__EFF__FLAG.list_item(117) = op_117;
template_t__CAN__EFF__FLAG.list_item(118) = op_118;
template_t__CAN__EFF__FLAG.list_item(119) = op_119;
template_t__CAN__EFF__FLAG.list_item(120) = op_120;
template_t__CAN__EFF__FLAG.list_item(121) = op_121;
template_t__CAN__EFF__FLAG.list_item(122) = op_122;
template_t__CAN__EFF__FLAG.list_item(123) = op_123;
template_t__CAN__EFF__FLAG.list_item(124) = op_124;
template_t__CAN__EFF__FLAG.list_item(125) = op_125;
template_t__CAN__EFF__FLAG.list_item(126) = op_126;
template_t__CAN__EFF__FLAG.list_item(127) = op_127;
current_location.update_lineno(48);
#line 48 "../src/Can.ttcn"
template_t__CAN__SFF__FLAG.set_type(VALUE_LIST, 128);
template_t__CAN__SFF__FLAG.list_item(0) = op_128;
template_t__CAN__SFF__FLAG.list_item(1) = op_129;
template_t__CAN__SFF__FLAG.list_item(2) = op_130;
template_t__CAN__SFF__FLAG.list_item(3) = op_131;
template_t__CAN__SFF__FLAG.list_item(4) = op_132;
template_t__CAN__SFF__FLAG.list_item(5) = op_133;
template_t__CAN__SFF__FLAG.list_item(6) = op_134;
template_t__CAN__SFF__FLAG.list_item(7) = op_135;
template_t__CAN__SFF__FLAG.list_item(8) = op_136;
template_t__CAN__SFF__FLAG.list_item(9) = op_137;
template_t__CAN__SFF__FLAG.list_item(10) = op_138;
template_t__CAN__SFF__FLAG.list_item(11) = op_139;
template_t__CAN__SFF__FLAG.list_item(12) = op_140;
template_t__CAN__SFF__FLAG.list_item(13) = op_141;
template_t__CAN__SFF__FLAG.list_item(14) = op_142;
template_t__CAN__SFF__FLAG.list_item(15) = op_143;
template_t__CAN__SFF__FLAG.list_item(16) = op_144;
template_t__CAN__SFF__FLAG.list_item(17) = op_145;
template_t__CAN__SFF__FLAG.list_item(18) = op_146;
template_t__CAN__SFF__FLAG.list_item(19) = op_147;
template_t__CAN__SFF__FLAG.list_item(20) = op_148;
template_t__CAN__SFF__FLAG.list_item(21) = op_149;
template_t__CAN__SFF__FLAG.list_item(22) = op_150;
template_t__CAN__SFF__FLAG.list_item(23) = op_151;
template_t__CAN__SFF__FLAG.list_item(24) = op_152;
template_t__CAN__SFF__FLAG.list_item(25) = op_153;
template_t__CAN__SFF__FLAG.list_item(26) = op_154;
template_t__CAN__SFF__FLAG.list_item(27) = op_155;
template_t__CAN__SFF__FLAG.list_item(28) = op_156;
template_t__CAN__SFF__FLAG.list_item(29) = op_157;
template_t__CAN__SFF__FLAG.list_item(30) = op_158;
template_t__CAN__SFF__FLAG.list_item(31) = op_159;
template_t__CAN__SFF__FLAG.list_item(32) = op_160;
template_t__CAN__SFF__FLAG.list_item(33) = op_161;
template_t__CAN__SFF__FLAG.list_item(34) = op_162;
template_t__CAN__SFF__FLAG.list_item(35) = op_163;
template_t__CAN__SFF__FLAG.list_item(36) = op_164;
template_t__CAN__SFF__FLAG.list_item(37) = op_165;
template_t__CAN__SFF__FLAG.list_item(38) = op_166;
template_t__CAN__SFF__FLAG.list_item(39) = op_167;
template_t__CAN__SFF__FLAG.list_item(40) = op_168;
template_t__CAN__SFF__FLAG.list_item(41) = op_169;
template_t__CAN__SFF__FLAG.list_item(42) = op_170;
template_t__CAN__SFF__FLAG.list_item(43) = op_171;
template_t__CAN__SFF__FLAG.list_item(44) = op_172;
template_t__CAN__SFF__FLAG.list_item(45) = op_173;
template_t__CAN__SFF__FLAG.list_item(46) = op_174;
template_t__CAN__SFF__FLAG.list_item(47) = op_175;
template_t__CAN__SFF__FLAG.list_item(48) = op_176;
template_t__CAN__SFF__FLAG.list_item(49) = op_177;
template_t__CAN__SFF__FLAG.list_item(50) = op_178;
template_t__CAN__SFF__FLAG.list_item(51) = op_179;
template_t__CAN__SFF__FLAG.list_item(52) = op_180;
template_t__CAN__SFF__FLAG.list_item(53) = op_181;
template_t__CAN__SFF__FLAG.list_item(54) = op_182;
template_t__CAN__SFF__FLAG.list_item(55) = op_183;
template_t__CAN__SFF__FLAG.list_item(56) = op_184;
template_t__CAN__SFF__FLAG.list_item(57) = op_185;
template_t__CAN__SFF__FLAG.list_item(58) = op_186;
template_t__CAN__SFF__FLAG.list_item(59) = op_187;
template_t__CAN__SFF__FLAG.list_item(60) = op_188;
template_t__CAN__SFF__FLAG.list_item(61) = op_189;
template_t__CAN__SFF__FLAG.list_item(62) = op_190;
template_t__CAN__SFF__FLAG.list_item(63) = op_191;
template_t__CAN__SFF__FLAG.list_item(64) = op_192;
template_t__CAN__SFF__FLAG.list_item(65) = op_193;
template_t__CAN__SFF__FLAG.list_item(66) = op_194;
template_t__CAN__SFF__FLAG.list_item(67) = op_195;
template_t__CAN__SFF__FLAG.list_item(68) = op_196;
template_t__CAN__SFF__FLAG.list_item(69) = op_197;
template_t__CAN__SFF__FLAG.list_item(70) = op_198;
template_t__CAN__SFF__FLAG.list_item(71) = op_199;
template_t__CAN__SFF__FLAG.list_item(72) = op_200;
template_t__CAN__SFF__FLAG.list_item(73) = op_201;
template_t__CAN__SFF__FLAG.list_item(74) = op_202;
template_t__CAN__SFF__FLAG.list_item(75) = op_203;
template_t__CAN__SFF__FLAG.list_item(76) = op_204;
template_t__CAN__SFF__FLAG.list_item(77) = op_205;
template_t__CAN__SFF__FLAG.list_item(78) = op_206;
template_t__CAN__SFF__FLAG.list_item(79) = op_207;
template_t__CAN__SFF__FLAG.list_item(80) = op_208;
template_t__CAN__SFF__FLAG.list_item(81) = op_209;
template_t__CAN__SFF__FLAG.list_item(82) = op_210;
template_t__CAN__SFF__FLAG.list_item(83) = op_211;
template_t__CAN__SFF__FLAG.list_item(84) = op_212;
template_t__CAN__SFF__FLAG.list_item(85) = op_213;
template_t__CAN__SFF__FLAG.list_item(86) = op_214;
template_t__CAN__SFF__FLAG.list_item(87) = op_215;
template_t__CAN__SFF__FLAG.list_item(88) = op_216;
template_t__CAN__SFF__FLAG.list_item(89) = op_217;
template_t__CAN__SFF__FLAG.list_item(90) = op_218;
template_t__CAN__SFF__FLAG.list_item(91) = op_219;
template_t__CAN__SFF__FLAG.list_item(92) = op_220;
template_t__CAN__SFF__FLAG.list_item(93) = op_221;
template_t__CAN__SFF__FLAG.list_item(94) = op_222;
template_t__CAN__SFF__FLAG.list_item(95) = op_223;
template_t__CAN__SFF__FLAG.list_item(96) = op_224;
template_t__CAN__SFF__FLAG.list_item(97) = op_225;
template_t__CAN__SFF__FLAG.list_item(98) = op_226;
template_t__CAN__SFF__FLAG.list_item(99) = op_227;
template_t__CAN__SFF__FLAG.list_item(100) = op_228;
template_t__CAN__SFF__FLAG.list_item(101) = op_229;
template_t__CAN__SFF__FLAG.list_item(102) = op_230;
template_t__CAN__SFF__FLAG.list_item(103) = op_231;
template_t__CAN__SFF__FLAG.list_item(104) = op_232;
template_t__CAN__SFF__FLAG.list_item(105) = op_233;
template_t__CAN__SFF__FLAG.list_item(106) = op_234;
template_t__CAN__SFF__FLAG.list_item(107) = op_235;
template_t__CAN__SFF__FLAG.list_item(108) = op_236;
template_t__CAN__SFF__FLAG.list_item(109) = op_237;
template_t__CAN__SFF__FLAG.list_item(110) = op_238;
template_t__CAN__SFF__FLAG.list_item(111) = op_239;
template_t__CAN__SFF__FLAG.list_item(112) = op_240;
template_t__CAN__SFF__FLAG.list_item(113) = op_241;
template_t__CAN__SFF__FLAG.list_item(114) = op_242;
template_t__CAN__SFF__FLAG.list_item(115) = op_243;
template_t__CAN__SFF__FLAG.list_item(116) = op_244;
template_t__CAN__SFF__FLAG.list_item(117) = op_245;
template_t__CAN__SFF__FLAG.list_item(118) = op_246;
template_t__CAN__SFF__FLAG.list_item(119) = op_247;
template_t__CAN__SFF__FLAG.list_item(120) = op_248;
template_t__CAN__SFF__FLAG.list_item(121) = op_249;
template_t__CAN__SFF__FLAG.list_item(122) = op_250;
template_t__CAN__SFF__FLAG.list_item(123) = op_251;
template_t__CAN__SFF__FLAG.list_item(124) = op_252;
template_t__CAN__SFF__FLAG.list_item(125) = op_253;
template_t__CAN__SFF__FLAG.list_item(126) = op_254;
template_t__CAN__SFF__FLAG.list_item(127) = op_255;
current_location.update_lineno(66);
#line 66 "../src/Can.ttcn"
template_t__CAN__RTR__FLAG.set_type(VALUE_LIST, 128);
template_t__CAN__RTR__FLAG.list_item(0) = op_192;
template_t__CAN__RTR__FLAG.list_item(1) = op_193;
template_t__CAN__RTR__FLAG.list_item(2) = op_194;
template_t__CAN__RTR__FLAG.list_item(3) = op_195;
template_t__CAN__RTR__FLAG.list_item(4) = op_196;
template_t__CAN__RTR__FLAG.list_item(5) = op_197;
template_t__CAN__RTR__FLAG.list_item(6) = op_198;
template_t__CAN__RTR__FLAG.list_item(7) = op_199;
template_t__CAN__RTR__FLAG.list_item(8) = op_200;
template_t__CAN__RTR__FLAG.list_item(9) = op_201;
template_t__CAN__RTR__FLAG.list_item(10) = op_202;
template_t__CAN__RTR__FLAG.list_item(11) = op_203;
template_t__CAN__RTR__FLAG.list_item(12) = op_204;
template_t__CAN__RTR__FLAG.list_item(13) = op_205;
template_t__CAN__RTR__FLAG.list_item(14) = op_206;
template_t__CAN__RTR__FLAG.list_item(15) = op_207;
template_t__CAN__RTR__FLAG.list_item(16) = op_208;
template_t__CAN__RTR__FLAG.list_item(17) = op_209;
template_t__CAN__RTR__FLAG.list_item(18) = op_210;
template_t__CAN__RTR__FLAG.list_item(19) = op_211;
template_t__CAN__RTR__FLAG.list_item(20) = op_212;
template_t__CAN__RTR__FLAG.list_item(21) = op_213;
template_t__CAN__RTR__FLAG.list_item(22) = op_214;
template_t__CAN__RTR__FLAG.list_item(23) = op_215;
template_t__CAN__RTR__FLAG.list_item(24) = op_216;
template_t__CAN__RTR__FLAG.list_item(25) = op_217;
template_t__CAN__RTR__FLAG.list_item(26) = op_218;
template_t__CAN__RTR__FLAG.list_item(27) = op_219;
template_t__CAN__RTR__FLAG.list_item(28) = op_220;
template_t__CAN__RTR__FLAG.list_item(29) = op_221;
template_t__CAN__RTR__FLAG.list_item(30) = op_222;
template_t__CAN__RTR__FLAG.list_item(31) = op_223;
template_t__CAN__RTR__FLAG.list_item(32) = op_224;
template_t__CAN__RTR__FLAG.list_item(33) = op_225;
template_t__CAN__RTR__FLAG.list_item(34) = op_226;
template_t__CAN__RTR__FLAG.list_item(35) = op_227;
template_t__CAN__RTR__FLAG.list_item(36) = op_228;
template_t__CAN__RTR__FLAG.list_item(37) = op_229;
template_t__CAN__RTR__FLAG.list_item(38) = op_230;
template_t__CAN__RTR__FLAG.list_item(39) = op_231;
template_t__CAN__RTR__FLAG.list_item(40) = op_232;
template_t__CAN__RTR__FLAG.list_item(41) = op_233;
template_t__CAN__RTR__FLAG.list_item(42) = op_234;
template_t__CAN__RTR__FLAG.list_item(43) = op_235;
template_t__CAN__RTR__FLAG.list_item(44) = op_236;
template_t__CAN__RTR__FLAG.list_item(45) = op_237;
template_t__CAN__RTR__FLAG.list_item(46) = op_238;
template_t__CAN__RTR__FLAG.list_item(47) = op_239;
template_t__CAN__RTR__FLAG.list_item(48) = op_240;
template_t__CAN__RTR__FLAG.list_item(49) = op_241;
template_t__CAN__RTR__FLAG.list_item(50) = op_242;
template_t__CAN__RTR__FLAG.list_item(51) = op_243;
template_t__CAN__RTR__FLAG.list_item(52) = op_244;
template_t__CAN__RTR__FLAG.list_item(53) = op_245;
template_t__CAN__RTR__FLAG.list_item(54) = op_246;
template_t__CAN__RTR__FLAG.list_item(55) = op_247;
template_t__CAN__RTR__FLAG.list_item(56) = op_248;
template_t__CAN__RTR__FLAG.list_item(57) = op_249;
template_t__CAN__RTR__FLAG.list_item(58) = op_250;
template_t__CAN__RTR__FLAG.list_item(59) = op_251;
template_t__CAN__RTR__FLAG.list_item(60) = op_252;
template_t__CAN__RTR__FLAG.list_item(61) = op_253;
template_t__CAN__RTR__FLAG.list_item(62) = op_254;
template_t__CAN__RTR__FLAG.list_item(63) = op_255;
template_t__CAN__RTR__FLAG.list_item(64) = op_64;
template_t__CAN__RTR__FLAG.list_item(65) = op_65;
template_t__CAN__RTR__FLAG.list_item(66) = op_66;
template_t__CAN__RTR__FLAG.list_item(67) = op_67;
template_t__CAN__RTR__FLAG.list_item(68) = op_68;
template_t__CAN__RTR__FLAG.list_item(69) = op_69;
template_t__CAN__RTR__FLAG.list_item(70) = op_70;
template_t__CAN__RTR__FLAG.list_item(71) = op_71;
template_t__CAN__RTR__FLAG.list_item(72) = op_72;
template_t__CAN__RTR__FLAG.list_item(73) = op_73;
template_t__CAN__RTR__FLAG.list_item(74) = op_74;
template_t__CAN__RTR__FLAG.list_item(75) = op_75;
template_t__CAN__RTR__FLAG.list_item(76) = op_76;
template_t__CAN__RTR__FLAG.list_item(77) = op_77;
template_t__CAN__RTR__FLAG.list_item(78) = op_78;
template_t__CAN__RTR__FLAG.list_item(79) = op_79;
template_t__CAN__RTR__FLAG.list_item(80) = op_80;
template_t__CAN__RTR__FLAG.list_item(81) = op_81;
template_t__CAN__RTR__FLAG.list_item(82) = op_82;
template_t__CAN__RTR__FLAG.list_item(83) = op_83;
template_t__CAN__RTR__FLAG.list_item(84) = op_84;
template_t__CAN__RTR__FLAG.list_item(85) = op_85;
template_t__CAN__RTR__FLAG.list_item(86) = op_86;
template_t__CAN__RTR__FLAG.list_item(87) = op_87;
template_t__CAN__RTR__FLAG.list_item(88) = op_88;
template_t__CAN__RTR__FLAG.list_item(89) = op_89;
template_t__CAN__RTR__FLAG.list_item(90) = op_90;
template_t__CAN__RTR__FLAG.list_item(91) = op_91;
template_t__CAN__RTR__FLAG.list_item(92) = op_92;
template_t__CAN__RTR__FLAG.list_item(93) = op_93;
template_t__CAN__RTR__FLAG.list_item(94) = op_94;
template_t__CAN__RTR__FLAG.list_item(95) = op_95;
template_t__CAN__RTR__FLAG.list_item(96) = op_96;
template_t__CAN__RTR__FLAG.list_item(97) = op_97;
template_t__CAN__RTR__FLAG.list_item(98) = op_98;
template_t__CAN__RTR__FLAG.list_item(99) = op_99;
template_t__CAN__RTR__FLAG.list_item(100) = op_100;
template_t__CAN__RTR__FLAG.list_item(101) = op_101;
template_t__CAN__RTR__FLAG.list_item(102) = op_102;
template_t__CAN__RTR__FLAG.list_item(103) = op_103;
template_t__CAN__RTR__FLAG.list_item(104) = op_104;
template_t__CAN__RTR__FLAG.list_item(105) = op_105;
template_t__CAN__RTR__FLAG.list_item(106) = op_106;
template_t__CAN__RTR__FLAG.list_item(107) = op_107;
template_t__CAN__RTR__FLAG.list_item(108) = op_108;
template_t__CAN__RTR__FLAG.list_item(109) = op_109;
template_t__CAN__RTR__FLAG.list_item(110) = op_110;
template_t__CAN__RTR__FLAG.list_item(111) = op_111;
template_t__CAN__RTR__FLAG.list_item(112) = op_112;
template_t__CAN__RTR__FLAG.list_item(113) = op_113;
template_t__CAN__RTR__FLAG.list_item(114) = op_114;
template_t__CAN__RTR__FLAG.list_item(115) = op_115;
template_t__CAN__RTR__FLAG.list_item(116) = op_116;
template_t__CAN__RTR__FLAG.list_item(117) = op_117;
template_t__CAN__RTR__FLAG.list_item(118) = op_118;
template_t__CAN__RTR__FLAG.list_item(119) = op_119;
template_t__CAN__RTR__FLAG.list_item(120) = op_120;
template_t__CAN__RTR__FLAG.list_item(121) = op_121;
template_t__CAN__RTR__FLAG.list_item(122) = op_122;
template_t__CAN__RTR__FLAG.list_item(123) = op_123;
template_t__CAN__RTR__FLAG.list_item(124) = op_124;
template_t__CAN__RTR__FLAG.list_item(125) = op_125;
template_t__CAN__RTR__FLAG.list_item(126) = op_126;
template_t__CAN__RTR__FLAG.list_item(127) = op_127;
current_location.update_lineno(84);
#line 84 "../src/Can.ttcn"
template_t__CAN__ERR__FLAG.set_type(VALUE_LIST, 128);
template_t__CAN__ERR__FLAG.list_item(0) = op_160;
template_t__CAN__ERR__FLAG.list_item(1) = op_161;
template_t__CAN__ERR__FLAG.list_item(2) = op_162;
template_t__CAN__ERR__FLAG.list_item(3) = op_163;
template_t__CAN__ERR__FLAG.list_item(4) = op_164;
template_t__CAN__ERR__FLAG.list_item(5) = op_165;
template_t__CAN__ERR__FLAG.list_item(6) = op_166;
template_t__CAN__ERR__FLAG.list_item(7) = op_167;
template_t__CAN__ERR__FLAG.list_item(8) = op_168;
template_t__CAN__ERR__FLAG.list_item(9) = op_169;
template_t__CAN__ERR__FLAG.list_item(10) = op_170;
template_t__CAN__ERR__FLAG.list_item(11) = op_171;
template_t__CAN__ERR__FLAG.list_item(12) = op_172;
template_t__CAN__ERR__FLAG.list_item(13) = op_173;
template_t__CAN__ERR__FLAG.list_item(14) = op_174;
template_t__CAN__ERR__FLAG.list_item(15) = op_175;
template_t__CAN__ERR__FLAG.list_item(16) = op_176;
template_t__CAN__ERR__FLAG.list_item(17) = op_177;
template_t__CAN__ERR__FLAG.list_item(18) = op_178;
template_t__CAN__ERR__FLAG.list_item(19) = op_179;
template_t__CAN__ERR__FLAG.list_item(20) = op_180;
template_t__CAN__ERR__FLAG.list_item(21) = op_181;
template_t__CAN__ERR__FLAG.list_item(22) = op_182;
template_t__CAN__ERR__FLAG.list_item(23) = op_183;
template_t__CAN__ERR__FLAG.list_item(24) = op_184;
template_t__CAN__ERR__FLAG.list_item(25) = op_185;
template_t__CAN__ERR__FLAG.list_item(26) = op_186;
template_t__CAN__ERR__FLAG.list_item(27) = op_187;
template_t__CAN__ERR__FLAG.list_item(28) = op_188;
template_t__CAN__ERR__FLAG.list_item(29) = op_189;
template_t__CAN__ERR__FLAG.list_item(30) = op_190;
template_t__CAN__ERR__FLAG.list_item(31) = op_191;
template_t__CAN__ERR__FLAG.list_item(32) = op_224;
template_t__CAN__ERR__FLAG.list_item(33) = op_225;
template_t__CAN__ERR__FLAG.list_item(34) = op_226;
template_t__CAN__ERR__FLAG.list_item(35) = op_227;
template_t__CAN__ERR__FLAG.list_item(36) = op_228;
template_t__CAN__ERR__FLAG.list_item(37) = op_229;
template_t__CAN__ERR__FLAG.list_item(38) = op_230;
template_t__CAN__ERR__FLAG.list_item(39) = op_231;
template_t__CAN__ERR__FLAG.list_item(40) = op_232;
template_t__CAN__ERR__FLAG.list_item(41) = op_233;
template_t__CAN__ERR__FLAG.list_item(42) = op_234;
template_t__CAN__ERR__FLAG.list_item(43) = op_235;
template_t__CAN__ERR__FLAG.list_item(44) = op_236;
template_t__CAN__ERR__FLAG.list_item(45) = op_237;
template_t__CAN__ERR__FLAG.list_item(46) = op_238;
template_t__CAN__ERR__FLAG.list_item(47) = op_239;
template_t__CAN__ERR__FLAG.list_item(48) = op_240;
template_t__CAN__ERR__FLAG.list_item(49) = op_241;
template_t__CAN__ERR__FLAG.list_item(50) = op_242;
template_t__CAN__ERR__FLAG.list_item(51) = op_243;
template_t__CAN__ERR__FLAG.list_item(52) = op_244;
template_t__CAN__ERR__FLAG.list_item(53) = op_245;
template_t__CAN__ERR__FLAG.list_item(54) = op_246;
template_t__CAN__ERR__FLAG.list_item(55) = op_247;
template_t__CAN__ERR__FLAG.list_item(56) = op_248;
template_t__CAN__ERR__FLAG.list_item(57) = op_249;
template_t__CAN__ERR__FLAG.list_item(58) = op_250;
template_t__CAN__ERR__FLAG.list_item(59) = op_251;
template_t__CAN__ERR__FLAG.list_item(60) = op_252;
template_t__CAN__ERR__FLAG.list_item(61) = op_253;
template_t__CAN__ERR__FLAG.list_item(62) = op_254;
template_t__CAN__ERR__FLAG.list_item(63) = op_255;
template_t__CAN__ERR__FLAG.list_item(64) = op_32;
template_t__CAN__ERR__FLAG.list_item(65) = op_33;
template_t__CAN__ERR__FLAG.list_item(66) = op_34;
template_t__CAN__ERR__FLAG.list_item(67) = op_35;
template_t__CAN__ERR__FLAG.list_item(68) = op_36;
template_t__CAN__ERR__FLAG.list_item(69) = op_37;
template_t__CAN__ERR__FLAG.list_item(70) = op_38;
template_t__CAN__ERR__FLAG.list_item(71) = op_39;
template_t__CAN__ERR__FLAG.list_item(72) = op_40;
template_t__CAN__ERR__FLAG.list_item(73) = op_41;
template_t__CAN__ERR__FLAG.list_item(74) = op_42;
template_t__CAN__ERR__FLAG.list_item(75) = op_43;
template_t__CAN__ERR__FLAG.list_item(76) = op_44;
template_t__CAN__ERR__FLAG.list_item(77) = op_45;
template_t__CAN__ERR__FLAG.list_item(78) = op_46;
template_t__CAN__ERR__FLAG.list_item(79) = op_47;
template_t__CAN__ERR__FLAG.list_item(80) = op_48;
template_t__CAN__ERR__FLAG.list_item(81) = op_49;
template_t__CAN__ERR__FLAG.list_item(82) = op_50;
template_t__CAN__ERR__FLAG.list_item(83) = op_51;
template_t__CAN__ERR__FLAG.list_item(84) = op_52;
template_t__CAN__ERR__FLAG.list_item(85) = op_53;
template_t__CAN__ERR__FLAG.list_item(86) = op_54;
template_t__CAN__ERR__FLAG.list_item(87) = op_55;
template_t__CAN__ERR__FLAG.list_item(88) = op_56;
template_t__CAN__ERR__FLAG.list_item(89) = op_57;
template_t__CAN__ERR__FLAG.list_item(90) = op_58;
template_t__CAN__ERR__FLAG.list_item(91) = op_59;
template_t__CAN__ERR__FLAG.list_item(92) = op_60;
template_t__CAN__ERR__FLAG.list_item(93) = op_61;
template_t__CAN__ERR__FLAG.list_item(94) = op_62;
template_t__CAN__ERR__FLAG.list_item(95) = op_63;
template_t__CAN__ERR__FLAG.list_item(96) = op_96;
template_t__CAN__ERR__FLAG.list_item(97) = op_97;
template_t__CAN__ERR__FLAG.list_item(98) = op_98;
template_t__CAN__ERR__FLAG.list_item(99) = op_99;
template_t__CAN__ERR__FLAG.list_item(100) = op_100;
template_t__CAN__ERR__FLAG.list_item(101) = op_101;
template_t__CAN__ERR__FLAG.list_item(102) = op_102;
template_t__CAN__ERR__FLAG.list_item(103) = op_103;
template_t__CAN__ERR__FLAG.list_item(104) = op_104;
template_t__CAN__ERR__FLAG.list_item(105) = op_105;
template_t__CAN__ERR__FLAG.list_item(106) = op_106;
template_t__CAN__ERR__FLAG.list_item(107) = op_107;
template_t__CAN__ERR__FLAG.list_item(108) = op_108;
template_t__CAN__ERR__FLAG.list_item(109) = op_109;
template_t__CAN__ERR__FLAG.list_item(110) = op_110;
template_t__CAN__ERR__FLAG.list_item(111) = op_111;
template_t__CAN__ERR__FLAG.list_item(112) = op_112;
template_t__CAN__ERR__FLAG.list_item(113) = op_113;
template_t__CAN__ERR__FLAG.list_item(114) = op_114;
template_t__CAN__ERR__FLAG.list_item(115) = op_115;
template_t__CAN__ERR__FLAG.list_item(116) = op_116;
template_t__CAN__ERR__FLAG.list_item(117) = op_117;
template_t__CAN__ERR__FLAG.list_item(118) = op_118;
template_t__CAN__ERR__FLAG.list_item(119) = op_119;
template_t__CAN__ERR__FLAG.list_item(120) = op_120;
template_t__CAN__ERR__FLAG.list_item(121) = op_121;
template_t__CAN__ERR__FLAG.list_item(122) = op_122;
template_t__CAN__ERR__FLAG.list_item(123) = op_123;
template_t__CAN__ERR__FLAG.list_item(124) = op_124;
template_t__CAN__ERR__FLAG.list_item(125) = op_125;
template_t__CAN__ERR__FLAG.list_item(126) = op_126;
template_t__CAN__ERR__FLAG.list_item(127) = op_127;
}


} /* end of namespace */
