Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-17 08:52:03

0001 // Copyright (c) 2018-2025 Jean-Louis Leroy
0002 // Distributed under the Boost Software License, Version 1.0.
0003 // See accompanying file LICENSE_1_0.txt
0004 // or copy at http://www.boost.org/LICENSE_1_0.txt)
0005 
0006 #ifndef BOOST_OPENMETHOD_DETAIL_OSTDSTREAM_HPP
0007 #define BOOST_OPENMETHOD_DETAIL_OSTDSTREAM_HPP
0008 
0009 #include <array>
0010 #include <cstdio>
0011 #include <charconv>
0012 #include <random>
0013 
0014 namespace boost::openmethod {
0015 
0016 namespace detail {
0017 
0018 // -----------------------------------------------------------------------------
0019 // lightweight ostream
0020 
0021 struct ostdstream {
0022     FILE* stream = nullptr;
0023 
0024     ostdstream(FILE* s = nullptr) : stream(s) {
0025     }
0026 
0027     void on(FILE* s = stderr) {
0028         this->stream = s;
0029     }
0030 
0031     void off() {
0032         stream = nullptr;
0033     }
0034 
0035     auto is_on() const -> bool {
0036         return stream != nullptr;
0037     }
0038 };
0039 
0040 struct ostderr : ostdstream {
0041     ostderr() : ostdstream(stderr) {
0042     }
0043 };
0044 
0045 inline ostdstream cerr;
0046 
0047 inline auto operator<<(ostdstream& os, const char* str) -> ostdstream& {
0048     if (os.stream) {
0049         fputs(str, os.stream);
0050     }
0051 
0052     return os;
0053 }
0054 
0055 inline auto
0056 operator<<(ostdstream& os, const std::string_view& view) -> ostdstream& {
0057     if (os.stream) {
0058         fwrite(view.data(), sizeof(*view.data()), view.length(), os.stream);
0059     }
0060 
0061     return os;
0062 }
0063 
0064 inline auto operator<<(ostdstream& os, const void* value) -> ostdstream& {
0065     if (os.stream) {
0066         std::array<char, 20> str;
0067         auto end = std::to_chars(
0068                        str.data(), str.data() + str.size(),
0069                        reinterpret_cast<uintptr_t>(value), 16)
0070                        .ptr;
0071         os << std::string_view(str.data(), end - str.data());
0072     }
0073 
0074     return os;
0075 }
0076 
0077 inline auto operator<<(ostdstream& os, void (*value)()) -> ostdstream& {
0078     if (os.stream) {
0079         std::array<char, 20> str;
0080         auto end = std::to_chars(
0081                        str.data(), str.data() + str.size(),
0082                        reinterpret_cast<uintptr_t>(value), 16)
0083                        .ptr;
0084         os << std::string_view(str.data(), end - str.data());
0085     }
0086 
0087     return os;
0088 }
0089 
0090 inline auto operator<<(ostdstream& os, std::size_t value) -> ostdstream& {
0091     if (os.stream) {
0092         std::array<char, 20> str;
0093         auto end =
0094             std::to_chars(str.data(), str.data() + str.size(), value).ptr;
0095         os << std::string_view(str.data(), end - str.data());
0096     }
0097 
0098     return os;
0099 }
0100 
0101 } // namespace detail
0102 
0103 } // namespace boost::openmethod
0104 
0105 #endif