/* * Copyright (C) 2022 Riyyi * * SPDX-License-Identifier: MIT */ #pragma once #include // uint8_t #include // FILE, stdout #include // stringstream #include #include "util/format/format.h" #include "util/timer.h" namespace Util::Format { void variadicPrint(FILE* file, std::string_view format, TypeErasedParameters& parameters); template void print(const char (&format)[N], const Parameters&... parameters) { VariadicParameters variadicParameters { parameters... }; variadicPrint(stdout, { format, N - 1 }, variadicParameters); } template void print(FILE* file, const char (&format)[N], const Parameters&... parameters) { VariadicParameters variadicParameters { parameters... }; variadicPrint(file, { format, N - 1 }, variadicParameters); } // ----------------------------------------- class PrintOperatorStyle { public: PrintOperatorStyle(FILE* file); virtual ~PrintOperatorStyle(); Builder& builder() { return m_builder; } private: FILE* m_file; std::stringstream m_stream; Builder m_builder; }; template const PrintOperatorStyle& operator<<(const PrintOperatorStyle& printOperatorStyle, const T& value) { _format(const_cast(printOperatorStyle).builder(), value); return printOperatorStyle; } PrintOperatorStyle print(); PrintOperatorStyle print(FILE* file); // ----------------------------------------- } // namespace Util::Format namespace Util { using Util::Format::print; } // namespace Util