47 std::array<char, max_len> array;
48 std::vector<char> vector;
57 bool is_short() const noexcept {
return len <
max_len; }
70 static_assert(
sizeof...(args) > 0,
"Must specify at least one argument");
72 len = std::snprintf(
nullptr, 0, format, args...);
73 char *
const buffer = [&]() {
75 new (&storage.array) decltype(storage.array)();
76 return storage.array.data();
78 new (&storage.vector) decltype(storage.vector)(
79 static_cast<size_t>(len) + 1);
80 return storage.vector.data();
83 std::snprintf(buffer, static_cast<size_t>(len + 1), format, args...);
87 template <
typename... Ts>
91 new (&this->storage.array) decltype(this->storage.array)();
92 std::copy(rhs.storage.array.begin(), rhs.storage.array.end(),
93 this->storage.array.begin());
95 new (&this->storage.vector) decltype(storage.vector)(
96 std::move(rhs.storage.vector));
101 template <
typename... Ts>
117 char const *
c_str() const noexcept {
118 return (is_short()) ? storage.array.data() : storage.vector.data();
133 storage.vector.~vector();
153 template <
typename... Args>
169 const auto lq =
static_cast<uint64_t
>(ui);
170 const auto uq =
static_cast<uint64_t
>(ui>>64UL);