MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/common/Codec.hpp
2024-06-07 11:12:56 +03:00

92 lines
2.8 KiB
C++

/*
* Codec.hpp
*
* Created on: 21 пїЅпїЅпїЅ. 2019 пїЅ.
* 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);
}
};
//!пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅ.
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);
}
};
//!пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ.
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); //пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ
}
};
//!пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ.
struct InverseGrayCodeDecoder : private GrayCodeDecoder {
//!most_signed_bit_pos - пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅ. пїЅпїЅпїЅпїЅ пїЅпїЅпїЅ n-пїЅпїЅпїЅпїЅпїЅпїЅ, 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_ */