Skip to content

Commit 8d491ae

Browse files
committed
serialization: Add ParamsStream GetStream() method
Add GetStream() method useful for accessing underlying stream. Use to improve ParamsStream test coverage.
1 parent 951203b commit 8d491ae

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

src/serialize.h

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,10 @@ size_t GetSerializeSize(const T& t)
11031103
return (SizeComputer() << t).size();
11041104
}
11051105

1106+
//! Check if type contains a stream by seeing if has a GetStream() method.
1107+
template<typename T>
1108+
concept ContainsStream = requires(T t) { t.GetStream(); };
1109+
11061110
/** Wrapper that overrides the GetParams() function of a stream. */
11071111
template <typename SubStream, typename Params>
11081112
class ParamsStream
@@ -1126,11 +1130,11 @@ class ParamsStream
11261130

11271131
template <typename U> ParamsStream& operator<<(const U& obj) { ::Serialize(*this, obj); return *this; }
11281132
template <typename U> ParamsStream& operator>>(U&& obj) { ::Unserialize(*this, obj); return *this; }
1129-
void write(Span<const std::byte> src) { m_substream.write(src); }
1130-
void read(Span<std::byte> dst) { m_substream.read(dst); }
1131-
void ignore(size_t num) { m_substream.ignore(num); }
1132-
bool eof() const { return m_substream.eof(); }
1133-
size_t size() const { return m_substream.size(); }
1133+
void write(Span<const std::byte> src) { GetStream().write(src); }
1134+
void read(Span<std::byte> dst) { GetStream().read(dst); }
1135+
void ignore(size_t num) { GetStream().ignore(num); }
1136+
bool eof() const { return GetStream().eof(); }
1137+
size_t size() const { return GetStream().size(); }
11341138

11351139
//! Get reference to stream parameters.
11361140
template <typename P>
@@ -1142,6 +1146,24 @@ class ParamsStream
11421146
return m_substream.template GetParams<P>();
11431147
}
11441148
}
1149+
1150+
//! Get reference to underlying stream.
1151+
auto& GetStream()
1152+
{
1153+
if constexpr (ContainsStream<SubStream>) {
1154+
return m_substream.GetStream();
1155+
} else {
1156+
return m_substream;
1157+
}
1158+
}
1159+
const auto& GetStream() const
1160+
{
1161+
if constexpr (ContainsStream<SubStream>) {
1162+
return m_substream.GetStream();
1163+
} else {
1164+
return m_substream;
1165+
}
1166+
}
11451167
};
11461168

11471169
/**

src/test/serialize_tests.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,11 +412,14 @@ BOOST_AUTO_TEST_CASE(with_params_multi)
412412
//! Test creating a ParamsStream that moves from a stream argument.
413413
BOOST_AUTO_TEST_CASE(with_params_move)
414414
{
415-
UncopyableStream stream{};
415+
UncopyableStream stream{MakeByteSpan(std::string_view{"abc"})};
416416
ParamsStream pstream{std::move(stream), RAW, HEX, RAW};
417+
BOOST_CHECK_EQUAL(pstream.GetStream().str(), "abc");
418+
pstream.GetStream().clear();
417419

418420
Base base1{0x20};
419421
pstream << base1;
422+
BOOST_CHECK_EQUAL(pstream.GetStream().str(), "\x20");
420423

421424
Base base2;
422425
pstream >> base2;

0 commit comments

Comments
 (0)