Add hash table formatters
This commit is contained in:
parent
03af0a7099
commit
68aedbf2fa
1 changed files with 57 additions and 0 deletions
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
|
#include <format>
|
||||||
|
|
||||||
namespace psemek::util
|
namespace psemek::util
|
||||||
{
|
{
|
||||||
|
|
@ -716,3 +717,59 @@ namespace psemek::util
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
|
||||||
|
template <typename T, typename Hash, typename Equal, typename Char>
|
||||||
|
struct formatter<::psemek::util::hash_set<T, Hash, Equal>, Char>
|
||||||
|
: std::formatter<T, Char>
|
||||||
|
{
|
||||||
|
using std::formatter<T, Char>::parse;
|
||||||
|
|
||||||
|
template <typename FormatContext>
|
||||||
|
auto format(::psemek::util::hash_set<T, Hash, Equal> const & s, FormatContext & ctx) const
|
||||||
|
{
|
||||||
|
bool first = true;
|
||||||
|
ctx.advance_to(std::format_to(ctx.out(), "{{"));
|
||||||
|
for (auto const & v : s)
|
||||||
|
{
|
||||||
|
if (!first)
|
||||||
|
ctx.advance_to(std::format_to(ctx.out(), ", "));
|
||||||
|
first = false;
|
||||||
|
ctx.advance_to(formatter<T, Char>::format(v, ctx));
|
||||||
|
}
|
||||||
|
return std::format_to(ctx.out(), "}}");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Key, typename Value, typename KeyHash, typename KeyEqual, typename Char>
|
||||||
|
struct formatter<::psemek::util::hash_map<Key, Value, KeyHash, KeyEqual>, Char>
|
||||||
|
: std::pair<formatter<Key, Char>, formatter<Value, Char>>
|
||||||
|
{
|
||||||
|
template <typename ParseContext>
|
||||||
|
constexpr auto parse(ParseContext & ctx)
|
||||||
|
{
|
||||||
|
return std::pair<formatter<Key, Char>, formatter<Value, Char>>::first.parse(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename FormatContext>
|
||||||
|
auto format(::psemek::util::hash_map<Key, Value, KeyHash, KeyEqual> const & m, FormatContext & ctx) const
|
||||||
|
{
|
||||||
|
bool first = true;
|
||||||
|
ctx.advance_to(std::format_to(ctx.out(), "{{"));
|
||||||
|
for (auto const & p : m)
|
||||||
|
{
|
||||||
|
if (!first)
|
||||||
|
ctx.advance_to(std::format_to(ctx.out(), ", "));
|
||||||
|
first = false;
|
||||||
|
ctx.advance_to(std::pair<formatter<Key, Char>, formatter<Value, Char>>::first.format(p.first, ctx));
|
||||||
|
ctx.advance_to(std::format_to(ctx.out(), ": "));
|
||||||
|
ctx.advance_to(std::pair<formatter<Key, Char>, formatter<Value, Char>>::second.format(p.second, ctx));
|
||||||
|
}
|
||||||
|
return std::format_to(ctx.out(), "}}");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue