Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarOutputProxy.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/StarOutputProxy.hpp')
-rw-r--r--source/core/StarOutputProxy.hpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/source/core/StarOutputProxy.hpp b/source/core/StarOutputProxy.hpp
new file mode 100644
index 0000000..6449d94
--- /dev/null
+++ b/source/core/StarOutputProxy.hpp
@@ -0,0 +1,68 @@
+#ifndef STAR_OUTPUT_PROXY_HPP
+#define STAR_OUTPUT_PROXY_HPP
+
+#include "StarMemory.hpp"
+
+#include "fmt/format.h"
+#include "fmt/ostream.h"
+
+namespace Star {
+
+namespace OutputAnyDetail {
+ template<typename T, typename CharT, typename Traits>
+ std::basic_string<CharT, Traits> string(T const& t) {
+ return fmt::format("<type {} at address: {}>", typeid(T).name(), (void*)&t);
+ }
+
+ template<typename T, typename CharT, typename Traits>
+ std::basic_ostream<CharT, Traits>& output(std::basic_ostream<CharT, Traits>& os, T const& t) {
+ return os << string<T, CharT, Traits>(t);
+ }
+
+ namespace Operator {
+ template<typename T, typename CharT, typename Traits>
+ std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, T const& t) {
+ return output(os, t);
+ }
+ }
+
+ template <typename T>
+ struct Wrapper {
+ T const& wrapped;
+ };
+
+ template <typename T>
+ std::ostream& operator<<(std::ostream& os, Wrapper<T> const& wrapper) {
+ using namespace Operator;
+ return os << wrapper.wrapped;
+ }
+}
+
+// Wraps a type so that is printable no matter what.. If no operator<< is
+// defined for a type, then will print <type [typeid] at address: [address]>
+template <typename T>
+OutputAnyDetail::Wrapper<T> outputAny(T const& t) {
+ return OutputAnyDetail::Wrapper<T>{t};
+}
+
+struct OutputProxy {
+ typedef function<void(std::ostream&)> PrintFunction;
+
+ OutputProxy(PrintFunction p)
+ : print(move(p)) {}
+
+ PrintFunction print;
+};
+
+inline std::ostream& operator<<(std::ostream& os, OutputProxy const& p) {
+ p.print(os);
+ return os;
+}
+
+}
+
+template <typename T>
+struct fmt::formatter<Star::OutputAnyDetail::Wrapper<T>> : ostream_formatter {};
+template <> struct fmt::formatter<Star::OutputProxy> : ostream_formatter {};
+
+#endif \ No newline at end of file