microfmt
Zero-allocation C++ formatting for constrained environments
Loading...
Searching...
No Matches
repeated_view.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Jarosław Pelczar <jarek@jpelczar.com>
2//
3// SPDX-License-Identifier: BSD-2-Clause
4
5#pragma once
6
18#include "../microfmt.hpp"
19#include <cstddef>
20#include <string_view>
21#include <type_traits>
22#include <utility>
23
24namespace microfmt {
25
27template <typename T> struct RELOCO_POINTER repeated_view {
29 size_t count{0};
30 microfmt::string_view separator{""};
31};
32
34template <typename T> [[nodiscard]] constexpr auto repeat(T value, size_t count) noexcept {
35 return repeated_view<std::decay_t<T>>{std::move(value), count, microfmt::string_view("")};
36}
37
39template <typename T>
40[[nodiscard]] constexpr auto repeat(T value, size_t count, microfmt::string_view separator) noexcept {
41 return repeated_view<std::decay_t<T>>{std::move(value), count, separator};
42}
43
50template <typename T> struct formatter<repeated_view<T>> {
51 microfmt::string_view forwarded_spec{""};
52
53 constexpr void parse(format_parse_context &ctx) noexcept { forwarded_spec = ctx.spec(); }
54
55 void format(const repeated_view<T> &rv, const sink &out) const noexcept {
56 formatter<T> elem_fmt;
57 format_parse_context elem_ctx(forwarded_spec);
58 elem_fmt.parse(elem_ctx);
59
60 for (size_t i = 0; i < rv.count; ++i) {
61 if (i > 0) {
62 out.write(rv.separator);
63 }
64 elem_fmt.format(rv.value, out);
65 }
66 }
67};
68
69} // namespace microfmt
Definition microfmt.hpp:881
Definition assert.hpp:19
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
constexpr auto repeat(T value, size_t count) noexcept
Definition repeated_view.hpp:34
void format(const repeated_view< T > &rv, const sink &out) const noexcept
Definition repeated_view.hpp:55
constexpr void parse(format_parse_context &ctx) noexcept
Definition repeated_view.hpp:53
Definition microfmt.hpp:985
Definition repeated_view.hpp:27
T value
Definition repeated_view.hpp:28