microfmt
Zero-allocation C++ formatting for constrained environments
Loading...
Searching...
No Matches
base_views.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
9#include "binary.hpp"
10#include <cstddef>
11#include <cstdint>
12#include <string_view>
13#include <type_traits>
14
15namespace microfmt {
16
17// ============================================================================
18// Base64 Stream View
19// ============================================================================
20
21struct MICROFMT_API_CLASS RELOCO_POINTER base64_view {
22 span<const uint8_t> data;
23};
24
25[[nodiscard]] constexpr base64_view base64(span<const uint8_t> bytes) noexcept { return base64_view{bytes}; }
26
27template <size_t N> [[nodiscard]] constexpr base64_view base64(const uint8_t (&arr)[N]) noexcept {
28 return base64_view{span<const uint8_t>(arr, N)};
29}
30
31template <> struct formatter<base64_view> {
32 constexpr void parse(format_parse_context &) noexcept {}
33
34 MICROFMT_API void format(const base64_view &bv, const sink &out) const noexcept;
35};
36
37// ============================================================================
38// Grouped Binary / Radix View
39// ============================================================================
40
41template <typename T, typename = std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>>>
44 uint8_t group_size{4};
45 char separator{'_'};
46};
47
48template <typename T, std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>, int> = 0>
49[[nodiscard]] constexpr auto bin_grouped(T val, uint8_t group, char sep = '_') noexcept {
50 return bin_grouped_view<T>{val, group, sep};
51}
52
53template <typename T> struct formatter<bin_grouped_view<T>> {
54 constexpr void parse(format_parse_context &) noexcept {}
55
56 void format(const bin_grouped_view<T> &bg, const sink &out) const noexcept {
57 using UnsignedT = std::make_unsigned_t<T>;
58 constexpr size_t total_bits = sizeof(T) * 8;
59 const auto raw = static_cast<UnsignedT>(bg.value);
60
61 out.write("0b");
62 for (size_t i = 0; i < total_bits; ++i) {
63 const size_t bit_idx = total_bits - 1 - i;
64 out.put((raw & (UnsignedT{1} << bit_idx)) ? '1' : '0');
65
66 if (bg.group_size != 0 && (i + 1) < total_bits && (bit_idx % bg.group_size == 0)) {
67 out.put(bg.separator);
68 }
69 }
70 }
71};
72
73} // namespace microfmt
74
75#if MICROFMT_SHARED_PROVIDE_DEFINITIONS
76#include "base_views.ipp"
77#endif
Binary integer formatting views and grouping options.
Definition microfmt.hpp:881
#define MICROFMT_API_CLASS
Definition compat.hpp:181
#define MICROFMT_API
Definition compat.hpp:135
Definition assert.hpp:19
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
constexpr base64_view base64(span< const uint8_t > bytes) noexcept
Definition base_views.hpp:25
constexpr auto bin_grouped(T val, uint8_t group, char sep='_') noexcept
Definition base_views.hpp:49
constexpr bytes_view bytes(uint64_t count) noexcept
Definition format_helpers.hpp:82
Definition base_views.hpp:21
span< const uint8_t > data
Definition base_views.hpp:22
Definition base_views.hpp:42
char separator
Definition base_views.hpp:45
uint8_t group_size
Definition base_views.hpp:44
T value
Definition base_views.hpp:43
constexpr void parse(format_parse_context &) noexcept
Definition base_views.hpp:32
MICROFMT_API void format(const base64_view &bv, const sink &out) const noexcept
constexpr void parse(format_parse_context &) noexcept
Definition base_views.hpp:54
void format(const bin_grouped_view< T > &bg, const sink &out) const noexcept
Definition base_views.hpp:56
Definition microfmt.hpp:985