MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/common/Codec.hpp

92 lines
2.4 KiB
C++
Raw Blame History

/*
* Codec.hpp
*
* Created on: 21 <20><><EFBFBD>. 2019 <20>.
* Author: krugliy
*/
#ifndef SOURCE_COMMON_CODEC_HPP_
#define SOURCE_COMMON_CODEC_HPP_
#include <type_traits>
#if __cplusplus > 199711L
namespace std {
namespace tr1 {
using std::enable_if;
using std::is_unsigned;
}
}
#endif
namespace codec {
struct BinDecoder {
template<typename T,
class = typename std::tr1::enable_if<std::tr1::is_unsigned<T>::value>::type
>
T operator()( T bin, unsigned short most_signed_bit_pos ) {
return bin & ((1ull << most_signed_bit_pos) - 1);
}
};
struct InverseBinDecoder {
template<typename T,
class = typename std::tr1::enable_if<std::tr1::is_unsigned<T>::value>::type
>
T operator()( T bin, unsigned short most_signed_bit_pos ) {
return ~bin & ((1ull << most_signed_bit_pos) - 1);
}
};
//!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>.
struct GrayCodeCoder {
template<typename T,
class = typename std::tr1::enable_if<std::tr1::is_unsigned<T>::value>::type
>
T operator()( T bin ) {
return bin ^ (bin >> 1);
}
};
//!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
struct GrayCodeDecoder {
template<typename T,
class = typename std::tr1::enable_if<std::tr1::is_unsigned<T>::value>::type
>
T operator()( T gray_code, unsigned short most_signed_bit_pos ) {
T raw_code = 0;
for( ; gray_code; gray_code >>= 1 )
raw_code ^= gray_code;
return raw_code;
//return (~raw_code) & ((1ull << most_signed_bit_pos) - 1); //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
}
};
//!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
struct InverseGrayCodeDecoder : private GrayCodeDecoder {
//!most_signed_bit_pos - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD> n-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, most_signed_bit_pos = n - 1
template<typename T,
class = typename std::tr1::enable_if<std::tr1::is_unsigned<T>::value>::type
>
T operator()( T gray_code, unsigned short most_signed_bit_pos ) {
return GrayCodeDecoder::operator()( gray_code ^ (1 << most_signed_bit_pos), most_signed_bit_pos );
}
};
}
#endif /* SOURCE_COMMON_CODEC_HPP_ */