File indexing completed on 2026-08-17 08:52:03
0001
0002
0003
0004
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
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 }
0102
0103 }
0104
0105 #endif