22 template <
typename InputIterator,
typename Functor>
23 void BitPack(
const InputIterator begin,
const InputIterator end, Functor callback)
25 static_assert(std::is_same<typename std::iterator_traits<InputIterator>::value_type, uint8_t>::value,
"container element type must be uint8_t");
26 static_assert(std::is_same<
typename std::result_of<Functor(uint8_t)>::type,
void>::value,
"callback function must be void(uint8_t)");
28 uint8_t extracteMsb = 0;
29 uint8_t extracteCount = 0;
33 for (
auto it = begin; it != end; ++it)
39 callback(*it | 0b10000000);
44 callback(*it & 0b01111111);
47 if (++extracteCount >= 7)
50 callback(extracteMsb);
57 callback(extracteMsb);
69 template <
typename OutputIterator,
typename Functor>
70 bool BitUnpack(OutputIterator begin, OutputIterator end, Functor callback)
72 static_assert(std::is_same<typename std::iterator_traits<OutputIterator>::value_type, uint8_t>::value,
"container element type must be uint8_t");
73 static_assert(std::is_same<
typename std::result_of<Functor()>::type, uint8_t>::value,
"callback function must be uint8_t()");
75 uint8_t extracteCount = 0;
79 for (
auto it = begin; it != end;)
81 const auto data = callback();
84 if (isFirst && not(data & 0b10000000))
97 if (extracteCount == 7)
101 const uint8_t msb = callback();
105 for (
int i = 0; i < 7; ++i)
115 const uint8_t msb = callback();
119 for (
int i = 0; i < extracteCount; ++i)
148 inline std::vector<uint8_t>
BitPack(
const std::vector<uint8_t>& data)
152 auto it = result.begin();
154 BitPack(data.begin(), data.end(), [&it](uint8_t data)
160 inline std::vector<uint8_t>
BitUnpack(
const std::vector<uint8_t>& data)
164 auto it = data.begin();
166 BitUnpack(result.begin(), result.end(), [&it]() -> uint8_t
void BitWrite(Ty &rhs, uint8_t bit, bool value)
特定のビットに値を書き込む
Definition Bit.hpp:61
void BitPack(const InputIterator begin, const InputIterator end, Functor callback)
バイト列のMSB(最上位ビット)を抽出し、7bitごとに分割してコールバック関数に渡す
Definition BitPack.hpp:23
bool BitUnpack(OutputIterator begin, OutputIterator end, Functor callback)
7bit分割されたデータを結合する
Definition BitPack.hpp:70
constexpr size_t BitPackedSize(size_t size)
ビットパックされたデータのサイズを取得する
Definition BitPack.hpp:132
constexpr size_t BitUnpackedSize(size_t size)
ビットアンパックされたデータのサイズを取得する
Definition BitPack.hpp:140
constexpr int Ceil(double x)
小数点切り上げ (std::ceil)
Definition Math.hpp:141
bool BitRead(const Ty &rhs, uint8_t bit)
特定のビットを読み取る
Definition Bit.hpp:20