// -------------------------------------------------------------------------- // #ifndef TDMDATATYPE #define TDMDATATYPE // https://zone.ni.com/reference/de-XX/help/370858P-0113/tdmdatamodel/tdmdatamodel/tdm_header_tdx_data/ // !!!! define mapping of locally supported datatypes to tdm datatypes // !!!! this is where the magic happens !!! typedef short int eInt16Usi; typedef int eInt32Usi; typedef unsigned char eUInt8Usi; typedef unsigned short int eUInt16Usi; typedef unsigned int eUInt32Usi; typedef float eFloat32Usi; typedef double eFloat64Usi; class tdmdatatype { protected: eInt16Usi sint16_; // 0 eInt32Usi sint32_; // 1 eUInt8Usi uint8_; // 2 eUInt16Usi uint16_; // 3 eUInt32Usi uint32_; // 4 eFloat32Usi float32_; // 5 eFloat64Usi float64_; // 6 short int dtidx_; // \in \{0,...,6\} public: tdmdatatype(): sint16_(0), sint32_(0), uint8_(0), uint16_(0), uint32_(0), float32_(0.0), float64_(0.0), dtidx_(0) { }; // every supported datatype gets its own constructor tdmdatatype(eInt16Usi num): sint16_(num), dtidx_(0) {}; tdmdatatype(eInt32Usi num): sint32_(num), dtidx_(1) {}; tdmdatatype(eUInt8Usi num): uint8_(num), dtidx_(2) {}; tdmdatatype(eUInt16Usi num): uint16_(num), dtidx_(3) {}; tdmdatatype(eUInt32Usi num): uint32_(num), dtidx_(4) {}; tdmdatatype(eFloat32Usi num): float32_(num), dtidx_(5) {}; tdmdatatype(eFloat64Usi num): float64_(num), dtidx_(6) {}; // identify type short int& dtype() { return dtidx_; } // overall assignment operator tdmdatatype& operator=(const tdmdatatype &num) { if ( this != &num ) { this->sint16_ = num.sint16_; this->sint32_ = num.sint32_; this->uint8_ = num.uint8_; this->uint16_ = num.uint16_; this->uint32_ = num.uint32_; this->float32_ = num.float32_; this->float64_ = num.float64_; } return *this; } // implement assignment operator for individual datatypes tdmdatatype& operator=(const eInt16Usi &num) { this->sint16_ = num; this->dtidx_ = 0; return *this; } tdmdatatype& operator=(const eInt32Usi &num) { this->sint32_ = num; this->dtidx_ = 1; return *this; } tdmdatatype& operator=(const eUInt8Usi &num) { this->uint8_ = num; this->dtidx_ = 2; return *this; } tdmdatatype& operator=(const eUInt16Usi &num) { this->uint16_ = num; this->dtidx_ = 3; return *this; } tdmdatatype& operator=(const eUInt32Usi &num) { this->uint32_ = num; this->dtidx_ = 4; return *this; } tdmdatatype& operator=(const eFloat32Usi &num) { this->float32_ = num; this->dtidx_ = 5; return *this; } tdmdatatype& operator=(const eFloat64Usi &num) { this->float64_ = num; this->dtidx_ = 6; return *this; } // define custom stream operator to print the correct type friend std::ostream& operator<<(std::ostream& out, const tdmdatatype& num) { if ( num.dtidx_ == 0 ) out<sint16_ = num.sint16_; // // } // // return *this; // // } // friend std::ostream& operator<<(std::ostream& out, const eInt16Usi& num) // { // return num.print(out); // } // std::ostream& print(std::ostream& out) const override // { // out< tdm_datatypes = { {"eInt16Usi","DT_SHORT",2,"short_sequence",2,"signed 16 bit integer"}, {"eInt32Usi","DT_LONG",6,"long_sequence",4,"signed 32 bit integer"}, {"eUInt8Usi","DT_BYTE",5,"byte_sequence",1,"unsigned 8 bit integer"}, {"eUInt16Usi","DT_SHORT",2,"short_sequence",2,"unsigned 16 bit integer"}, {"eUInt32Usi","DT_LONG",6,"long_sequence",4,"unsigned 32 bit integer"}, {"eFloat32Usi","DT_FLOAT",3,"float_sequence",4,"32 bit float"}, {"eFloat64Usi","DT_DOUBLE",7,"double_sequence",8,"64 bit double"}, // {"eStringUsi","DT_STRING",1,"string_sequence",0,"text"} }; #endif // -------------------------------------------------------------------------- //