17#include "../microfmt.hpp"
31 char close_delim{
']'};
32 microfmt::string_view separator{
", "};
37 const T *data{
nullptr};
41 char close_delim{
']'};
42 microfmt::string_view separator{
", "};
46template <
typename Range,
typename Predicate>
47[[nodiscard]]
constexpr auto filter(
const Range &rng, Predicate &&pred)
noexcept {
51template <
typename Range,
typename Predicate, std::enable_if_t<!std::is_lvalue_reference_v<Range>,
int> = 0>
52[[nodiscard]]
constexpr auto filter(Range &&, Predicate &&) noexcept = delete;
55template <typename T, typename Predicate>
56[[nodiscard]] constexpr auto
filter(const T *ptr,
size_t count, Predicate &&pred) noexcept {
58 std::forward<Predicate>(pred)};
70 microfmt::string_view forwarded_spec{
""};
73 auto spec = ctx.spec();
78 if (spec[0] ==
'b' || spec[0] ==
'B') {
82 }
else if (spec[0] ==
'c' || spec[0] ==
'C') {
86 }
else if (spec[0] ==
'n' || spec[0] ==
'N') {
91 forwarded_spec = spec.substr(i);
99 using ElementReference =
decltype(*std::begin(fv.range));
100 using ElemType =
typename std::remove_cv<typename std::remove_reference<ElementReference>::type>::type;
103 elem_fmt.
parse(elem_ctx);
105 size_t matched_count = 0;
106 for (
const auto &item : fv.range) {
107 if (fv.predicate(item)) {
108 if (matched_count++ > 0) {
109 out.write(fv.separator);
111 elem_fmt.
format(item, out);
115 if (close_c !=
'\0') {
129 microfmt::string_view forwarded_spec{
""};
132 auto spec = ctx.spec();
137 if (spec[0] ==
'b' || spec[0] ==
'B') {
141 }
else if (spec[0] ==
'c' || spec[0] ==
'C') {
145 }
else if (spec[0] ==
'n' || spec[0] ==
'N') {
150 forwarded_spec = spec.substr(i);
154 if (open_c !=
'\0') {
160 elem_fmt.
parse(elem_ctx);
162 size_t matched_count = 0;
163 for (
size_t i = 0; i < fv.count; ++i) {
164 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
165 const T &item = fv.data[i];
166 RELOCO_END_UNSAFE_BUFFER_USAGE;
168 if (fv.predicate(item)) {
169 if (matched_count++ > 0) {
170 out.write(fv.separator);
172 elem_fmt.
format(item, out);
176 if (close_c !=
'\0') {
Definition microfmt.hpp:881
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
constexpr auto filter(const Range &rng, Predicate &&pred) noexcept
Definition filter_view.hpp:47
Definition filter_view.hpp:36
Predicate predicate
Definition filter_view.hpp:39
Definition filter_view.hpp:27
const Range & range
Definition filter_view.hpp:28
Predicate predicate
Definition filter_view.hpp:29