From cb8365a897be888e4e37f2173dc81f38877d6200 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Mon, 8 Feb 2021 17:21:37 +0100 Subject: [PATCH] implement imcdatatype --- lib/imc_block.hpp | 8 ++- lib/imc_datatype.hpp | 156 +++++++++++++++++++++++++++++++++++++++++++ lib/imc_raw.hpp | 1 + src/main.cpp | 1 + 4 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 lib/imc_datatype.hpp diff --git a/lib/imc_block.hpp b/lib/imc_block.hpp index 8d43fc0..fa70261 100644 --- a/lib/imc_block.hpp +++ b/lib/imc_block.hpp @@ -133,7 +133,13 @@ namespace imc unsigned long int& get_begin() { return begin_; } unsigned long int& get_end() { return end_; } - // get parameter + // get list of parameters + std::vector& get_parameters() + { + return parameters_; + } + + // get data of single parameter std::vector extract_parameter(parameter& param) { // check parameter w.r.t. to block diff --git a/lib/imc_datatype.hpp b/lib/imc_datatype.hpp new file mode 100644 index 0000000..9c932dd --- /dev/null +++ b/lib/imc_datatype.hpp @@ -0,0 +1,156 @@ +//---------------------------------------------------------------------------// + +#ifndef IMCDATATYPE +#define IMCDATATYPE + +//---------------------------------------------------------------------------// + +namespace imc +{ + // map datatype to machine's datatypes + typedef unsigned char imc_Ubyte; + typedef signed char imc_Sbyte; + typedef unsigned short imc_Ushort; + typedef signed short imc_Sshort; + typedef unsigned long int imc_Ulongint; + typedef signed long int imc_Slongint; + typedef float imc_float; + typedef double imc_double; + + class imcdatatype + { + protected: + imc_Ubyte ubyte_; // 0 + imc_Sbyte sbyte_; // 1 + imc_Ushort ushort_; // 2 + imc_Sshort sshort_; // 3 + imc_Ulongint ulint_; // 4 + imc_Slongint slint_; // 5 + imc_float sfloat_; // 6 + imc_double sdouble_; // 7 + short int dtidx_; // \in \{0,...,7\} + public: + imcdatatype(): ubyte_(0), sbyte_(0), + ushort_(0), sshort_(0), + ulint_(0.0), slint_(0.0), + sfloat_(0.0), sdouble_(0.0), + dtidx_(0) { }; + // every supported datatype gets its own constructor + imcdatatype(imc_Ubyte num): ubyte_(num), dtidx_(0) {}; + imcdatatype(imc_Sbyte num): sbyte_(num), dtidx_(1) {}; + imcdatatype(imc_Ushort num): ushort_(num), dtidx_(2) {}; + imcdatatype(imc_Sshort num): sshort_(num), dtidx_(3) {}; + imcdatatype(imc_Ulongint num): ulint_(num), dtidx_(4) {}; + imcdatatype(imc_Slongint num): slint_(num), dtidx_(5) {}; + imcdatatype(imc_float num): sfloat_(num), dtidx_(6) {}; + imcdatatype(imc_double num): sdouble_(num), dtidx_(7) {}; + + // identify type + short int& dtype() { return dtidx_; } + + // overall assignment operator + imcdatatype& operator=(const imcdatatype &num) + { + if ( this != &num ) + { + this->ubyte_ = num.ubyte_; + this->sbyte_ = num.sbyte_; + this->ushort_ = num.ushort_; + this->sshort_ = num.sshort_; + this->ulint_ = num.ulint_; + this->slint_ = num.slint_; + this->sfloat_ = num.sfloat_; + this->sdouble_ = num.sdouble_; + this->dtidx_ = num.dtidx_; + } + + return *this; + } + + // implement assignment operator for individual datatypes + imcdatatype& operator=(const imc_Ubyte &num) + { + this->ubyte_ = num; + this->dtidx_ = 0; + return *this; + } + imcdatatype& operator=(const imc_Sbyte &num) + { + this->sbyte_ = num; + this->dtidx_ = 1; + return *this; + } + imcdatatype& operator=(const imc_Ushort &num) + { + this->ushort_ = num; + this->dtidx_ = 2; + return *this; + } + imcdatatype& operator=(const imc_Sshort &num) + { + this->sshort_ = num; + this->dtidx_ = 3; + return *this; + } + imcdatatype& operator=(const imc_Ulongint &num) + { + this->ulint_ = num; + this->dtidx_ = 4; + return *this; + } + imcdatatype& operator=(const imc_Slongint &num) + { + this->slint_ = num; + this->dtidx_ = 5; + return *this; + } + imcdatatype& operator=(const imc_float &num) + { + this->sfloat_ = num; + this->dtidx_ = 6; + return *this; + } + imcdatatype& operator=(const imc_double &num) + { + this->sdouble_ = num; + this->dtidx_ = 7; + return *this; + } + + // obtain number as double + double as_double() + { + double num = 0.0; + if ( dtidx_ == 0 ) num = (double)ubyte_; + else if ( dtidx_ == 1 ) num = (double)sbyte_; + else if ( dtidx_ == 2 ) num = (double)ushort_; + else if ( dtidx_ == 3 ) num = (double)sshort_; + else if ( dtidx_ == 4 ) num = (double)ulint_; + else if ( dtidx_ == 5 ) num = (double)slint_; + else if ( dtidx_ == 6 ) num = (double)sfloat_; + else if ( dtidx_ == 7 ) num = (double)sdouble_; + return num; + } + + // define custom stream operator to print the correct type + friend std::ostream& operator<<(std::ostream& out, const imcdatatype& num) + { + if ( num.dtidx_ == 0 ) out<