AsmGrader 0.0.0
Loading...
Searching...
No Matches
std.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <boost/describe.hpp>
7#include <boost/describe/enum.hpp>
8#include <boost/describe/enumerators.hpp>
9#include <boost/mp11.hpp>
10#include <boost/pfr.hpp>
11#include <boost/type_index.hpp>
12#include <fmt/base.h>
13#include <fmt/format.h>
14#include <range/v3/range/concepts.hpp>
15
16#include <concepts>
17#include <cstring>
18#include <ctime>
19#include <exception>
20#include <filesystem>
21#include <optional>
22#include <source_location>
23#include <string>
24#include <string_view>
25#include <system_error>
26#include <tuple>
27#include <variant>
28
29template <>
30struct fmt::formatter<std::exception> : formatter<std::string>
31{
32 auto format(const std::exception& from, fmt::format_context& ctx) const {
33 std::string str = fmt::format("{}: '{}'", boost::typeindex::type_id_runtime(from).pretty_name(), from.what());
34
35 return formatter<std::string>::format(str, ctx);
36 }
37};
38
39template <>
40struct fmt::formatter<std::filesystem::path> : formatter<std::string>
41{
42 auto format(const std::filesystem::path& from, fmt::format_context& ctx) const {
43 return formatter<std::string>::format(from.string(), ctx);
44 }
45};
46
47template <>
48struct fmt::formatter<std::timespec> : formatter<std::string>
49{
50 auto format(const std::timespec& from, fmt::format_context& ctx) const {
51 return fmt::format_to(ctx.out(), "timespec{{tv_sec={}, tv_nsec={}}}", from.tv_sec, from.tv_nsec);
52 }
53};
54
55template <>
56struct fmt::formatter<std::source_location> : formatter<std::string>
57{
58 auto format(const std::source_location& from, fmt::format_context& ctx) const {
59 return formatter<std::string>::format(
60 fmt::format("[{}@{}:{}:{}]", from.file_name(), from.line(), from.column(), from.function_name()), ctx);
61 }
62};
63
64// /// Formatter for std::timespec
65// inline std::string format_as(const timespec& from) {
66// return fmt::format("timespec{{tv_sec={}, tv_nsec={}}}", from.tv_sec, from.tv_nsec);
67// }
68
70template <>
71struct fmt::formatter<std::error_code> : ::asmgrader::DebugFormatter
72{
73 auto format(const std::error_code& from, format_context& ctx) const {
74 return fmt::format_to(ctx.out(), "{} : {}", strerrorname_np(from.value()), from.message());
75 }
76};
77
78template <typename T>
79struct fmt::formatter<std::optional<T>> : ::asmgrader::DebugFormatter
80{
81 auto format(const std::optional<T>& from, format_context& ctx) const {
82 if (!from) {
83 return fmt::format_to(ctx.out(), "nullopt");
84 }
85
86 if (is_debug_format) {
87 return asmgrader::format_to_or_unknown(ctx.out(), from.value(), "Optional({})");
88 }
89
90 return asmgrader::format_to_or_unknown(ctx.out(), from.value(), "{}");
91 }
92};
93
94template <typename... Ts>
95struct fmt::formatter<std::variant<Ts...>> : ::asmgrader::DebugFormatter
96{
97 auto format(const std::variant<Ts...>& from, format_context& ctx) const {
98 const auto& [type_str, inner_str] = std::visit(
99 [](auto&& val) {
100 std::string inner;
101 if constexpr (std::convertible_to<decltype(val), std::string_view>) {
102 inner = fmt::format("{:?}", val);
103 } else {
104 inner = asmgrader::format_or_unknown(val, "{}");
105 }
106 return std::tuple{boost::typeindex::type_id<decltype(val)>().pretty_name(), inner};
107 },
108 from);
109
110 if (is_debug_format) {
111 return fmt::format_to(ctx.out(), "Variant<T={}>({})", type_str, inner_str);
112 }
113
114 return fmt::format_to(ctx.out(), "{}", inner_str);
115 }
116};
auto format_to_or_unknown(OutputIt &&out, T &&value, fmt::format_string< T > fmt="{}")
Definition unknown.hpp:29
std::string format_or_unknown(T &&value, fmt::format_string< T > fmt="{}")
Definition unknown.hpp:15
Definition byte_array.hpp:94
Definition debug.hpp:9
auto format(const std::error_code &from, format_context &ctx) const
Definition std.hpp:73
auto format(const std::exception &from, fmt::format_context &ctx) const
Definition std.hpp:32
auto format(const std::filesystem::path &from, fmt::format_context &ctx) const
Definition std.hpp:42
auto format(const std::optional< T > &from, format_context &ctx) const
Definition std.hpp:81
auto format(const std::source_location &from, fmt::format_context &ctx) const
Definition std.hpp:58
auto format(const std::timespec &from, fmt::format_context &ctx) const
Definition std.hpp:50
auto format(const std::variant< Ts... > &from, format_context &ctx) const
Definition std.hpp:97