17#include "../microfmt.hpp"
26template <
typename KeyExtractor,
typename ValExtractor,
typename Iterator,
typename Sentinel>
32 microfmt::string_view open_delim{
"{"};
33 microfmt::string_view close_delim{
"}"};
34 microfmt::string_view sep{
", "};
35 microfmt::string_view kv_sep{
": "};
40template <
typename T>
using remove_cvref_map_t =
typename std::remove_cv<typename std::remove_reference<T>::type>::type;
45struct has_first_member<T, std::void_t<decltype(std::declval<const T &>().first)>> : std::true_type {};
50struct has_second_member<T, std::void_t<decltype(std::declval<const T &>().second)>> : std::true_type {};
52template <
typename T,
typename =
void>
struct has_key_method : std::false_type {};
55struct has_key_method<T, std::void_t<decltype(std::declval<const T &>().key())>> : std::true_type {};
60struct has_value_method<T, std::void_t<decltype(std::declval<const T &>().value())>> : std::true_type {};
64template <
typename T>
struct is_dereferenceable<T, std::void_t<decltype(*std::declval<T &>())>> : std::true_type {};
70 template <
typename T>
constexpr decltype(
auto)
operator()(
const T &item)
const noexcept {
83 template <
typename T>
constexpr decltype(
auto)
operator()(
const T &item)
const noexcept {
95template <
typename MapContainer> [[nodiscard]]
constexpr auto map_view(
const MapContainer &m)
noexcept {
100template <
typename MapContainer, std::enable_if_t<!std::is_lvalue_reference_v<MapContainer>,
int> = 0>
101[[nodiscard]]
constexpr auto map_view(MapContainer &&) noexcept = delete;
104template <typename MapContainer, typename KeyFn, typename ValFn>
105[[nodiscard]] constexpr auto
map_view(const MapContainer &m, KeyFn &&kfn, ValFn &&vfn) noexcept {
107 m.begin(), m.end(), std::forward<KeyFn>(kfn), std::forward<ValFn>(vfn)};
110template <
typename MapContainer,
typename KeyFn,
typename ValFn,
111 std::enable_if_t<!std::is_lvalue_reference_v<MapContainer>,
int> = 0>
112[[nodiscard]]
constexpr auto map_view(MapContainer &&, KeyFn &&, ValFn &&) noexcept = delete;
116 typename std::enable_if<detail::is_dereferenceable<Iterator>::value,
int>::type = 0>
117[[nodiscard]] constexpr auto
map_view(Iterator first, Sentinel last, KeyFn &&kfn = KeyFn{},
118 ValFn &&vfn = ValFn{})
noexcept {
119 return map_range_view<std::decay_t<KeyFn>, std::decay_t<ValFn>, Iterator, Sentinel>{
120 first, last, std::forward<KeyFn>(kfn), std::forward<ValFn>(vfn)};
129template <
typename KeyExtractor,
typename ValExtractor,
typename Iterator,
typename Sentinel>
133 microfmt::string_view forwarded_spec{
""};
136 auto spec = ctx.spec();
141 if (spec[0] ==
'b' || spec[0] ==
'B') {
145 }
else if (spec[0] ==
'n' || spec[0] ==
'N') {
149 }
else if (spec[0] ==
'c' || spec[0] ==
'C') {
155 forwarded_spec = spec.substr(i);
159 const sink &out)
const noexcept {
160 if (open_c !=
'\0') {
165 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
167 for (
auto it = view.first; it != view.last; ++it) {
172 const auto &k = view.key_fn(*it);
173 const auto &v = view.val_fn(*it);
183 key_fmt.format(k, out);
185 out.write(view.kv_sep);
192 if (close_c !=
'\0') {
196 RELOCO_END_UNSAFE_BUFFER_USAGE;
Definition microfmt.hpp:881
#define MICROFMT_API_CLASS
Definition compat.hpp:181
typename std::remove_cv< typename std::remove_reference< T >::type >::type remove_cvref_map_t
Definition map_view.hpp:40
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
constexpr auto map_view(const MapContainer &m) noexcept
Definition map_view.hpp:95
Definition map_view.hpp:69
Definition map_view.hpp:82
Definition map_view.hpp:42
Definition map_view.hpp:52
Definition map_view.hpp:47
Definition map_view.hpp:57
Definition map_view.hpp:62
Definition map_view.hpp:27
Sentinel last
Definition map_view.hpp:29
Iterator first
Definition map_view.hpp:28
KeyExtractor key_fn
Definition map_view.hpp:30
ValExtractor val_fn
Definition map_view.hpp:31