92 lines
2.8 KiB
C++
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_ */
|