30#include <fmt/compile.h>
31#include <fmt/format.h>
32#include <fmt/ranges.h>
33#include <libassert/assert.hpp>
34#include <range/v3/algorithm/copy.hpp>
35#include <range/v3/algorithm/copy_if.hpp>
36#include <range/v3/algorithm/copy_n.hpp>
37#include <range/v3/algorithm/find.hpp>
38#include <range/v3/range/access.hpp>
39#include <range/v3/range/concepts.hpp>
40#include <range/v3/view/subrange.hpp>
57template <std::
size_t Size>
65 if (input[Size] !=
'\0') {
68 ranges::copy_n(std::data(input), Size + 1,
data.begin());
74 ranges::copy_n(ranges::begin(rng), Size,
data.begin());
79 std::array<char, Size + 1>
data{};
81 template <std::size_t Pos, std::size_t Len = std::numeric_limits<std::size_t>::max()>
85 constexpr auto end = std::min(Size, Pos + Len);
86 constexpr auto substr_size = std::min(Size - Pos, Len);
91 template <std::
size_t N>
95 return {ranges::subrange{
data.begin() +
N,
data.end() - 1}};
98 template <std::
size_t N>
102 return {ranges::subrange{
data.begin(),
data.end() - 1 -
N}};
105 template <
typename Range>
107 constexpr auto n = [] {
110 if constexpr (std::is_array_v<std::remove_cvref_t<Range>>) {
118 ranges::copy_n(
data.begin(), Size, result.
data.begin());
120 if constexpr (std::same_as<Range, StaticString<n>>) {
121 ranges::copy_n(rhs.data.begin(), n, result.
data.begin() + Size);
123 ranges::copy_n(ranges::begin(rhs), n, result.
data.begin() + Size);
129 constexpr std::size_t
size()
const {
return Size; }
137 constexpr auto end() {
return data.end() - 1; }
139 constexpr auto end()
const {
return data.cend() - 1; }
141 constexpr auto cend()
const {
return data.cend() - 1; }
144 constexpr operator std::string_view()
const {
return data.data(); }
146 std::string
str()
const {
return data.data(); }
158 constexpr char at(std::size_t i)
const {
return data.at(i); }
160 constexpr char&
at(std::size_t i) {
return data.at(i); }
162 template <std::
size_t OtherSize>
164 return std::string_view{*
this} <=> std::string_view{rhs};
168 constexpr auto operator<=>(std::string_view rhs)
const {
return std::string_view{*
this} <=> rhs; }
170 template <std::
size_t OtherSize>
172 return std::string_view{*
this} == std::string_view{rhs};
176 constexpr bool operator==(std::string_view rhs)
const {
return std::string_view{*
this} == rhs; }
180template <std::
size_t N>
184template <
StaticString Fmt, std::size_t MaxSz = 10 * 1'024, fmt::formattable... Args>
186 constexpr auto compiled_fmt = FMT_COMPILE(Fmt.
data.begin());
190 fmt::format_to(result.
data.begin(), compiled_fmt, std::forward<Args>(args)...);
195template <std::
size_t N>
202template <StaticString String>
203consteval auto operator""_static() {
214template <std::
size_t Size>
222template <std::
size_t I, std::
size_t Size>
236template <std::
size_t I, std::
size_t Size>
238constexpr char get(const ::asmgrader::StaticString<Size>& str) {
248template <std::
size_t N,
typename CharType>
249struct fmt::is_range<
asmgrader::StaticString<N>, CharType> : std::false_type
254template <std::
size_t N>
255struct fmt::is_tuple_like<
asmgrader::StaticString<N>> : std::false_type
A fully compile-time capable string type Guaranteed to be null-terminated.
Definition static_string.hpp:59
constexpr auto substr() const
Definition static_string.hpp:83
constexpr auto end() const
Definition static_string.hpp:139
constexpr char & at(std::size_t i)
Definition static_string.hpp:160
constexpr bool operator==(std::string_view rhs) const
Definition static_string.hpp:176
std::string str() const
Definition static_string.hpp:146
constexpr auto begin() const
Definition static_string.hpp:133
constexpr char & operator[](std::size_t i)
Definition static_string.hpp:153
constexpr auto begin()
Definition static_string.hpp:131
constexpr StaticString< Size - N > remove_prefix() const
Definition static_string.hpp:93
constexpr auto operator+(const Range &rhs) const
Definition static_string.hpp:106
constexpr StaticString< Size - N > remove_suffix() const
Definition static_string.hpp:100
std::array< char, Size+1 > data
Definition static_string.hpp:79
constexpr auto cend() const
Definition static_string.hpp:141
constexpr char operator[](std::size_t i) const
Definition static_string.hpp:148
constexpr auto cbegin() const
Definition static_string.hpp:135
constexpr StaticString(const ranges::forward_range auto &rng)
Do not include '\0'.
Definition static_string.hpp:73
constexpr bool operator==(const StaticString< OtherSize > &rhs) const
Definition static_string.hpp:171
constexpr std::size_t size() const
Definition static_string.hpp:129
constexpr auto operator<=>(std::string_view rhs) const
Definition static_string.hpp:168
constexpr auto end()
Definition static_string.hpp:137
constexpr auto operator<=>(const StaticString< OtherSize > &rhs) const
Definition static_string.hpp:163
constexpr StaticString()=default
constexpr StaticString(const char(&input)[Size+1])
Definition static_string.hpp:64
constexpr char at(std::size_t i) const
Definition static_string.hpp:158
Definition asm_buffer.hpp:20
consteval std::size_t get_static_size()
Definition static_size.hpp:19
constexpr char get(const ::asmgrader::StaticString< Size > &str)
Specialization of get to play nice with algorithms that work on tuple-like types.
Definition static_string.hpp:238
constexpr std::string_view format_as(const StaticString< N > &str)
Definition static_string.hpp:196
constexpr auto static_format(Args &&... args)
Definition static_string.hpp:185
StaticString(const char(&input)[N]) -> StaticString< N - 1 >
Definition byte_array.hpp:94
char type
Definition static_string.hpp:228
#define N
Definition test_macros.hpp:147