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
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
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
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
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 }
0071
0072 #endif