Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 09:13:46

0001 #ifndef BVH_V2_STREAM_H
0002 #define BVH_V2_STREAM_H
0003 
0004 #include <istream>
0005 #include <ostream>
0006 
0007 namespace bvh::v2 {
0008 
0009 /// Stream of data that can be used to deserialize data structures.
0010 class InputStream {
0011 public:
0012     template <typename T>
0013     T read(T&& default_val = {}) {
0014         T data;
0015         if (read_raw(&data, sizeof(T)) != sizeof(T))
0016             data = std::move(default_val);
0017         return data;
0018     }
0019 
0020 protected:
0021     virtual size_t read_raw(void*, size_t) = 0;
0022 };
0023 
0024 /// Stream of data that can be used to serialize data structures.
0025 class OutputStream {
0026 public:
0027     template <typename T>
0028     bool write(const T& data) { return write_raw(&data, sizeof(T)); }
0029 
0030 protected:
0031     virtual bool write_raw(const void*, size_t) = 0;
0032 };
0033 
0034 /// Stream adapter for standard library input streams.
0035 class StdInputStream : public InputStream {
0036 public:
0037     StdInputStream(std::istream& stream)
0038         : stream_(stream)
0039     {}
0040 
0041     using InputStream::read;
0042 
0043 protected:
0044     std::istream& stream_;
0045 
0046     size_t read_raw(void* data, size_t size) override {
0047         stream_.read(reinterpret_cast<char*>(data), static_cast<std::streamsize>(size));
0048         return static_cast<size_t>(stream_.gcount());
0049     }
0050 };
0051 
0052 /// Stream adapter for standard library output streams.
0053 class StdOutputStream : public OutputStream {
0054 public:
0055     StdOutputStream(std::ostream& stream)
0056         : stream_(stream)
0057     {}
0058 
0059     using OutputStream::write;
0060 
0061 protected:
0062     std::ostream& stream_;
0063 
0064     bool write_raw(const void* data, size_t size) override {
0065         stream_.write(reinterpret_cast<const char*>(data), static_cast<std::streamsize>(size));
0066         return stream_.good();
0067     }
0068 };
0069 
0070 } // namespace bvh::v2
0071 
0072 #endif