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