8 #include <wordring/serialize/serialize.hpp>
49 template <
typename InputIterator>
52 template <
typename InputIterator1>
55 template <
typename InputIterator1>
59 using iterator_type = InputIterator;
60 using unsigned_type = std::make_unsigned_t<typename std::iterator_traits<iterator_type>::value_type>;
62 using difference_type = std::ptrdiff_t;
63 using value_type = std::uint8_t;
64 using pointer = value_type*;
65 using reference = value_type&;
66 using iterator_category = std::input_iterator_tag;
68 static std::uint32_t constexpr coefficient =
sizeof(unsigned_type);
70 static_assert(std::is_integral_v<
typename std::iterator_traits<iterator_type>::value_type>);
97 value_type operator*()
const
99 std::uint32_t n = (coefficient - 1) - (m_index % coefficient);
101 return (
static_cast<unsigned_type
>(*m_it) >> n * 8) & 0xFFu;
107 if (m_index % coefficient == 0) ++m_it;
120 std::uint32_t m_index;
123 template <
typename InputIterator1>
124 inline bool operator==(serialize_iterator<InputIterator1>
const& lhs, serialize_iterator<InputIterator1>
const& rhs)
126 return !(lhs != rhs);
129 template <
typename InputIterator1>
130 inline bool operator!=(serialize_iterator<InputIterator1>
const& lhs, serialize_iterator<InputIterator1>
const& rhs)
132 std::uint32_t constexpr coefficient = serialize_iterator<InputIterator1>::coefficient;
133 return lhs.m_it != rhs.m_it || lhs.m_index % coefficient != rhs.m_index % coefficient;
167 template <
typename Value,
typename ForwardIterator>
170 template <
typename Value1,
typename ForwardIterator1>
173 template <
typename Value1,
typename ForwardIterator1>
177 using iterator_type = ForwardIterator;
178 using unsigned_type = std::make_unsigned_t<Value>;
180 using difference_type = std::ptrdiff_t;
181 using value_type = Value;
182 using pointer = value_type*;
183 using reference = value_type&;
184 using iterator_category = std::input_iterator_tag;
186 static std::uint32_t constexpr coefficient =
sizeof(unsigned_type);
197 using category =
typename std::iterator_traits<iterator_type>::iterator_category;
200 std::is_same_v<category, std::forward_iterator_tag>
201 || std::is_same_v<category, std::bidirectional_iterator_tag>
202 || std::is_same_v<category, std::random_access_iterator_tag>);
205 value_type operator*()
const
209 iterator_type it = m_it;
210 for (std::uint32_t i = 0; i < coefficient; ++i) v = (v << 8) + static_cast<std::uint8_t>(*it++);
217 std::advance(m_it, coefficient);
232 template <
typename Value1,
typename ForwardIterator1>
235 return lhs.m_it == rhs.m_it;
238 template <
typename Value1,
typename ForwardIterator1>
239 inline bool operator!=(deserialize_iterator<Value1, ForwardIterator1>
const& lhs, deserialize_iterator<Value1, ForwardIterator1>
const& rhs)
241 return lhs.m_it != rhs.m_it;