Skip to content

Commit 573bc48

Browse files
authored
Merge pull request #1752 from evoskuil/master
Add hex_reader and hex_writer (base16 streamers).
2 parents c7548ec + f33c2ea commit 573bc48

35 files changed

+772
-84
lines changed

Makefile.am

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,8 @@ test_libbitcoin_system_test_SOURCES = \
380380
test/stream/streamers/byte_flipper.cpp \
381381
test/stream/streamers/byte_reader.cpp \
382382
test/stream/streamers/byte_writer.cpp \
383+
test/stream/streamers/hex_reader.cpp \
384+
test/stream/streamers/hex_writer.cpp \
383385
test/stream/streamers/sha256_writer.cpp \
384386
test/stream/streamers/sha256t_writer.cpp \
385387
test/stream/streamers/sha256x2_writer.cpp \
@@ -742,6 +744,8 @@ include_bitcoin_system_impl_stream_streamers_HEADERS = \
742744
include/bitcoin/system/impl/stream/streamers/bit_writer.ipp \
743745
include/bitcoin/system/impl/stream/streamers/byte_reader.ipp \
744746
include/bitcoin/system/impl/stream/streamers/byte_writer.ipp \
747+
include/bitcoin/system/impl/stream/streamers/hex_reader.ipp \
748+
include/bitcoin/system/impl/stream/streamers/hex_writer.ipp \
745749
include/bitcoin/system/impl/stream/streamers/sha256_writer.ipp \
746750
include/bitcoin/system/impl/stream/streamers/sha256t_writer.ipp \
747751
include/bitcoin/system/impl/stream/streamers/sha256x2_writer.ipp
@@ -871,6 +875,8 @@ include_bitcoin_system_stream_streamers_HEADERS = \
871875
include/bitcoin/system/stream/streamers/byte_flipper.hpp \
872876
include/bitcoin/system/stream/streamers/byte_reader.hpp \
873877
include/bitcoin/system/stream/streamers/byte_writer.hpp \
878+
include/bitcoin/system/stream/streamers/hex_reader.hpp \
879+
include/bitcoin/system/stream/streamers/hex_writer.hpp \
874880
include/bitcoin/system/stream/streamers/sha256_writer.hpp \
875881
include/bitcoin/system/stream/streamers/sha256t_writer.hpp \
876882
include/bitcoin/system/stream/streamers/sha256x2_writer.hpp

builds/cmake/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,8 @@ if (with-tests)
859859
"../../test/stream/streamers/byte_flipper.cpp"
860860
"../../test/stream/streamers/byte_reader.cpp"
861861
"../../test/stream/streamers/byte_writer.cpp"
862+
"../../test/stream/streamers/hex_reader.cpp"
863+
"../../test/stream/streamers/hex_writer.cpp"
862864
"../../test/stream/streamers/sha256_writer.cpp"
863865
"../../test/stream/streamers/sha256t_writer.cpp"
864866
"../../test/stream/streamers/sha256x2_writer.cpp"

builds/msvc/vs2022/libbitcoin-system-test/libbitcoin-system-test.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@
303303
<ClCompile Include="..\..\..\..\test\stream\streamers\byte_flipper.cpp" />
304304
<ClCompile Include="..\..\..\..\test\stream\streamers\byte_reader.cpp" />
305305
<ClCompile Include="..\..\..\..\test\stream\streamers\byte_writer.cpp" />
306+
<ClCompile Include="..\..\..\..\test\stream\streamers\hex_reader.cpp" />
307+
<ClCompile Include="..\..\..\..\test\stream\streamers\hex_writer.cpp" />
306308
<ClCompile Include="..\..\..\..\test\stream\streamers\sha256_writer.cpp" />
307309
<ClCompile Include="..\..\..\..\test\stream\streamers\sha256t_writer.cpp" />
308310
<ClCompile Include="..\..\..\..\test\stream\streamers\sha256x2_writer.cpp" />

builds/msvc/vs2022/libbitcoin-system-test/libbitcoin-system-test.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,12 @@
579579
<ClCompile Include="..\..\..\..\test\stream\streamers\byte_writer.cpp">
580580
<Filter>src\stream\streamers</Filter>
581581
</ClCompile>
582+
<ClCompile Include="..\..\..\..\test\stream\streamers\hex_reader.cpp">
583+
<Filter>src\stream\streamers</Filter>
584+
</ClCompile>
585+
<ClCompile Include="..\..\..\..\test\stream\streamers\hex_writer.cpp">
586+
<Filter>src\stream\streamers</Filter>
587+
</ClCompile>
582588
<ClCompile Include="..\..\..\..\test\stream\streamers\sha256_writer.cpp">
583589
<Filter>src\stream\streamers</Filter>
584590
</ClCompile>

builds/msvc/vs2022/libbitcoin-system/libbitcoin-system.vcxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,8 @@
501501
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\byte_flipper.hpp" />
502502
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\byte_reader.hpp" />
503503
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\byte_writer.hpp" />
504+
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\hex_reader.hpp" />
505+
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\hex_writer.hpp" />
504506
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\interfaces\bitflipper.hpp" />
505507
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\interfaces\bitreader.hpp" />
506508
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\interfaces\bitwriter.hpp" />
@@ -674,6 +676,8 @@
674676
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\bit_writer.ipp" />
675677
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\byte_reader.ipp" />
676678
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\byte_writer.ipp" />
679+
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\hex_reader.ipp" />
680+
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\hex_writer.ipp" />
677681
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\sha256_writer.ipp" />
678682
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\sha256t_writer.ipp" />
679683
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\sha256x2_writer.ipp" />

builds/msvc/vs2022/libbitcoin-system/libbitcoin-system.vcxproj.filters

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,6 +1253,12 @@
12531253
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\byte_writer.hpp">
12541254
<Filter>include\bitcoin\system\stream\streamers</Filter>
12551255
</ClInclude>
1256+
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\hex_reader.hpp">
1257+
<Filter>include\bitcoin\system\stream\streamers</Filter>
1258+
</ClInclude>
1259+
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\hex_writer.hpp">
1260+
<Filter>include\bitcoin\system\stream\streamers</Filter>
1261+
</ClInclude>
12561262
<ClInclude Include="..\..\..\..\include\bitcoin\system\stream\streamers\interfaces\bitflipper.hpp">
12571263
<Filter>include\bitcoin\system\stream\streamers\interfaces</Filter>
12581264
</ClInclude>
@@ -1768,6 +1774,12 @@
17681774
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\byte_writer.ipp">
17691775
<Filter>include\bitcoin\system\impl\stream\streamers</Filter>
17701776
</None>
1777+
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\hex_reader.ipp">
1778+
<Filter>include\bitcoin\system\impl\stream\streamers</Filter>
1779+
</None>
1780+
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\hex_writer.ipp">
1781+
<Filter>include\bitcoin\system\impl\stream\streamers</Filter>
1782+
</None>
17711783
<None Include="..\..\..\..\include\bitcoin\system\impl\stream\streamers\sha256_writer.ipp">
17721784
<Filter>include\bitcoin\system\impl\stream\streamers</Filter>
17731785
</None>

include/bitcoin/system.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@
221221
#include <bitcoin/system/stream/streamers/byte_flipper.hpp>
222222
#include <bitcoin/system/stream/streamers/byte_reader.hpp>
223223
#include <bitcoin/system/stream/streamers/byte_writer.hpp>
224+
#include <bitcoin/system/stream/streamers/hex_reader.hpp>
225+
#include <bitcoin/system/stream/streamers/hex_writer.hpp>
224226
#include <bitcoin/system/stream/streamers/sha256_writer.hpp>
225227
#include <bitcoin/system/stream/streamers/sha256t_writer.hpp>
226228
#include <bitcoin/system/stream/streamers/sha256x2_writer.hpp>

include/bitcoin/system/constraints.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,16 @@ using if_byte_insertable = bool_if<
280280
std::is_base_of<std_vector<uint8_t>, Type>::value ||
281281
std::is_base_of<std::vector<uint8_t>, Type>::value>;
282282

283+
/// define: DEFINE_HAS_METHOD(flush)
284+
/// usage: bool_if<has_flush_v<Type>>
285+
#define DEFINE_HAS_METHOD(method) \
286+
template <typename T, typename = void> \
287+
struct has_##method : std::false_type {}; \
288+
template <typename T> \
289+
struct has_##method<T, std::void_t<decltype(&T::method)>> : std::true_type {}; \
290+
template <typename Type> \
291+
static constexpr bool has_##method##_v = has_##method<Type>::value
292+
283293
} // namespace libbitcoin
284294

285295
#endif

include/bitcoin/system/impl/radix/base_16.ipp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,21 @@ constexpr bool is_between(uint8_t value, uint8_t low, uint8_t high) NOEXCEPT
4242
return low <= value && value <= high;
4343
}
4444

45-
constexpr char to_base16_character(char digit) NOEXCEPT
45+
constexpr char to_base16_character(uint8_t digit) NOEXCEPT
4646
{
4747
return (is_between(digit, 0, 9) ? '0' : 'a' - '\xa') + digit;
4848
}
4949

50+
constexpr char to_base16_hi_character(uint8_t octet) NOEXCEPT
51+
{
52+
return to_base16_character(shift_right(octet, to_half(byte_bits)));
53+
}
54+
55+
constexpr char to_base16_lo_character(uint8_t octet) NOEXCEPT
56+
{
57+
return to_base16_character(bit_and(octet, 0x0f_u8));
58+
}
59+
5060
constexpr uint8_t from_base16_characters(char high, char low) NOEXCEPT
5161
{
5262
const auto from_base16_digit = [](char character) NOEXCEPT
@@ -99,10 +109,10 @@ constexpr std::string encode_base16(const data_slice& data) NOEXCEPT
99109
out.resize(data.size() * octet_width);
100110
auto digit = out.begin();
101111

102-
for (const auto byte: data)
112+
for (const auto octet: data)
103113
{
104-
*digit++ = to_base16_character(shift_right(byte, to_half(byte_bits)));
105-
*digit++ = to_base16_character(bit_and(byte, 0x0f_u8));
114+
*digit++ = to_base16_hi_character(octet);
115+
*digit++ = to_base16_lo_character(octet);
106116
}
107117

108118
return out;
@@ -115,10 +125,10 @@ constexpr std::string encode_hash(const data_slice& hash) NOEXCEPT
115125
out.resize(hash.size() * octet_width);
116126
auto digit = out.begin();
117127

118-
for (const auto byte: std::views::reverse(hash))
128+
for (const auto octet: std::views::reverse(hash))
119129
{
120-
*digit++ = to_base16_character(shift_right(byte, to_half(byte_bits)));
121-
*digit++ = to_base16_character(bit_and(byte, 0x0f_u8));
130+
*digit++ = to_base16_hi_character(octet);
131+
*digit++ = to_base16_lo_character(octet);
122132
}
123133

124134
return out;

include/bitcoin/system/impl/stream/streamers/bit_reader.ipp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,19 @@ namespace system {
3434
// constructors
3535
// ----------------------------------------------------------------------------
3636

37+
// protected
38+
template <typename IStream>
39+
bit_reader<IStream>::bit_reader() NOEXCEPT
40+
: base(),
41+
byte_(base::pad()),
42+
offset_(byte_bits)
43+
{
44+
}
45+
3746
template <typename IStream>
3847
bit_reader<IStream>::bit_reader(IStream& source) NOEXCEPT
39-
: byte_reader<IStream>(source),
40-
byte_(byte_reader<IStream>::pad()),
48+
: base(source),
49+
byte_(base::pad()),
4150
offset_(byte_bits)
4251
{
4352
}
@@ -144,10 +153,10 @@ void bit_reader<IStream>::do_rewind_bytes(size_t size) NOEXCEPT
144153
template <typename IStream>
145154
bool bit_reader<IStream>::get_exhausted() const NOEXCEPT
146155
{
147-
if (byte_reader<IStream>::operator!())
156+
if (base::operator!())
148157
return true;
149158

150-
return is_zero(shift()) && byte_reader<IStream>::get_exhausted();
159+
return is_zero(shift()) && base::get_exhausted();
151160
}
152161

153162
// private
@@ -158,24 +167,24 @@ void bit_reader<IStream>::load() NOEXCEPT
158167
{
159168
// The next bit read will be from this byte.
160169
offset_ = 0;
161-
byte_ = byte_reader<IStream>::pad();
162-
byte_reader<IStream>::do_read_bytes(&byte_, one);
170+
byte_ = base::pad();
171+
base::do_read_bytes(&byte_, one);
163172
}
164173

165174
template <typename IStream>
166175
void bit_reader<IStream>::reload() NOEXCEPT
167176
{
168177
offset_ = byte_bits;
169-
byte_ = byte_reader<IStream>::pad();
170-
byte_reader<IStream>::do_rewind_bytes(two);
171-
byte_reader<IStream>::do_read_bytes(&byte_, one);
178+
byte_ = base::pad();
179+
base::do_rewind_bytes(two);
180+
base::do_read_bytes(&byte_, one);
172181
}
173182

174183
// This is the only byte peek.
175184
template <typename IStream>
176185
uint8_t bit_reader<IStream>::peek() NOEXCEPT
177186
{
178-
return byte_reader<IStream>::do_peek_byte();
187+
return base::do_peek_byte();
179188
}
180189

181190
template <typename OStream>

0 commit comments

Comments
 (0)