/* * Copyright 2015 - 2025 gary@drinkingtea.net * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #pragma once #ifdef OX_USE_STDLIB #include #endif #include "concepts.hpp" #include "error.hpp" #include "types.hpp" #include "writer.hpp" namespace ox { template concept Reader_c = requires(T v) { {v.peek()} -> ox::same_as>; {v.read(static_cast(nullptr), static_cast(0))} -> ox::same_as>; {v.seekg(static_cast(0))} -> ox::same_as; {v.seekg(static_cast(0), ios_base::beg)} -> ox::same_as; {v.tellg()} -> ox::same_as>; }; class Reader_v { public: virtual constexpr ~Reader_v() noexcept = default; virtual constexpr ox::Result peek() const noexcept = 0; virtual constexpr ox::Result read(char*, std::size_t) noexcept = 0; virtual constexpr ox::Result tellg() noexcept = 0; virtual constexpr ox::Error seekg(std::size_t) noexcept = 0; virtual constexpr ox::Error seekg(int64_t, ios_base::seekdir) = 0; }; template class ReaderT: public Reader_v { private: T m_reader{}; public: template constexpr explicit ReaderT(Args&&... args) noexcept: m_reader(args...) { } constexpr ox::Result peek() const noexcept override { return m_reader.peek(); } constexpr ox::Result read(char *v, std::size_t cnt) noexcept override { return m_reader.read(v, cnt); } constexpr ox::Error seekg(std::size_t p) noexcept override { return m_reader.seekg(p); } constexpr ox::Error seekg(int64_t p, ios_base::seekdir sd) noexcept override { return m_reader.seekg(p, sd); } constexpr ox::Result tellg() noexcept override { return m_reader.tellg(); } }; #ifdef OX_USE_STDLIB class StreamReader: public Reader_v { private: std::istream &m_strm; public: constexpr explicit StreamReader(std::istream &stream) noexcept: m_strm(stream) {} ox::Result peek() const noexcept override; ox::Result read(char *v, std::size_t cnt) noexcept override; ox::Error seekg(std::size_t p) noexcept override; ox::Error seekg(int64_t p, ios_base::seekdir sd) noexcept override; ox::Result tellg() noexcept override; }; #endif }