summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pstream.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/pstream.h')
-rw-r--r--src/lib/netlist/plib/pstream.h39
1 files changed, 30 insertions, 9 deletions
diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h
index b96c1f91a3b..dcb2b0652cf 100644
--- a/src/lib/netlist/plib/pstream.h
+++ b/src/lib/netlist/plib/pstream.h
@@ -27,8 +27,29 @@
namespace plib {
+ /// \brief wrapper around isteam read
+ ///
+ template <typename S, typename T>
+ static inline S & istream_read(S &is, T * data, size_t len)
+ {
+ using ct = typename S::char_type;
+ static_assert((sizeof(T) % sizeof(ct)) == 0, "istream_read sizeof issue");
+ // FIXME: throw on
+ return is.read(reinterpret_cast<ct *>(data), gsl::narrow<std::streamsize>(len * sizeof(T)));
+ }
+
+ /// \brief wrapper around osteam write
+ ///
+ template <typename S, typename T>
+ static inline S & ostream_write(S &os, const T * data, size_t len)
+ {
+ using ct = typename S::char_type;
+ static_assert((sizeof(T) % sizeof(ct)) == 0, "ostream_write sizeof issue");
+ // FIXME: throw on
+ return os.write(reinterpret_cast<const ct *>(data), gsl::narrow<std::streamsize>(len * sizeof(T)));
+ }
+
///
-/// \brief: putf8reader_t: reader on top of istream.
///
/// putf8reader_t digests linux & dos/windows text files
///
@@ -188,23 +209,23 @@ public:
template <typename T>
void write(const T &val)
{
- m_strm.write(reinterpret_cast<const std::ostream::char_type *>(&val), sizeof(T));
+ ostream_write(m_strm, &val, 1);
}
void write(const pstring &s)
{
- const auto *const sm = reinterpret_cast<const std::ostream::char_type *>(s.c_str());
- const auto sl(static_cast<std::streamsize>(std::char_traits<std::ostream::char_type>::length(sm)));
+ auto *sm = s.c_str();
+ const auto sl(std::char_traits<pstring::mem_t>::length(sm));
write(sl);
- m_strm.write(sm, sl);
+ ostream_write(m_strm, sm, sl);
}
template <typename T>
void write(const std::vector<T> &val)
{
- const auto sz(static_cast<std::streamsize>(val.size()));
+ const auto sz(val.size());
write(sz);
- m_strm.write(reinterpret_cast<const std::ostream::char_type *>(val.data()), sz * gsl::narrow<std::streamsize>(sizeof(T)));
+ ostream_write(m_strm, val.data(), sz);
}
private:
@@ -225,7 +246,7 @@ public:
template <typename T>
void read(T &val)
{
- m_strm.read(reinterpret_cast<std::istream::char_type *>(&val), gsl::narrow<std::streamsize>(sizeof(T)));
+ istream_read(m_strm, &val, 1);
}
void read( pstring &s)
@@ -244,7 +265,7 @@ public:
std::size_t sz = 0;
read(sz);
val.resize(sz);
- m_strm.read(reinterpret_cast<std::istream::char_type *>(val.data()), gsl::narrow<std::streamsize>(sizeof(T) * sz));
+ istream_read(m_strm, val.data(), sz);
}
private: