12 #include <string_view>
39 template<
typename... Ts>
40 [[nodiscard]] std::string
strCat(Ts&& ...ts);
47 template<
typename... Ts>
68 template<
typename... Ts>
69 void strAppend(std::string& result, Ts&& ...ts);
119 [[nodiscard]]
size_t size()
const
124 [[nodiscard]]
char*
copy(
char* dst)
const
127 memcpy(dst, s.data(), sz);
141 struct ConcatToString : ConcatViaString
156 std::ostringstream os;
174 [[nodiscard]]
size_t size()
const
179 [[nodiscard]]
char*
copy(
char* dst)
const
182 if (sz) memcpy(dst, v.data(), sz);
200 [[nodiscard]]
size_t size()
const
205 [[nodiscard]]
char*
copy(
char* dst)
const
225 [[nodiscard]]
size_t size()
const
230 [[nodiscard]]
char*
copy(
char* dst)
const
232 *dst = b ?
'1' :
'0';
269 return (
t < 0) ? -
t :
t;
296 if (
t < 0) *--p =
'-';
319 static constexpr
bool IS_SIGNED = std::numeric_limits<T>::is_signed;
324 char* p = this->end();
328 *--p =
static_cast<char>(
'0' + (a % 10));
333 this->sz =
static_cast<unsigned char>(this->end() - p);
336 [[nodiscard]]
size_t size()
const
341 [[nodiscard]]
char*
copy(
char* dst)
const
343 memcpy(dst, begin(), sz);
347 [[nodiscard]]
operator std::string()
const
349 return std::string(begin(), this->
size());
353 [[nodiscard]]
const char* begin()
const
358 [[nodiscard]]
char* end()
379 [[nodiscard]]
size_t size()
const
384 [[nodiscard]]
char*
copy(
char* dst)
const
391 *--p = (d < 10) ? static_cast<char>(d +
'0')
392 :
static_cast<char>(d - 10 +
'a');
412 [[nodiscard]]
size_t size()
const
417 [[nodiscard]]
char*
copy(
char* dst)
const
523 return ConcatToString<float>(f);
528 return ConcatToString<double>(d);
533 return ConcatToString<long double>(d);
537 template<
size_t N,
typename T>
551 template<
typename Tuple,
size_t... Is>
554 return (... + std::get<Is>(
t).
size());
557 template<
typename... Ts>
565 template<
typename Tuple,
size_t... Is>
568 auto l = { ((dst = std::get<Is>(
t).copy(dst)) , 0)... };
572 template<
typename... Ts>
590 template<
typename... Ts>
591 [[nodiscard]] std::string
strCat(Ts&& ...ts)
604 std::string result(
size,
' ');
605 char* dst = result.data();
612 template<
typename... Ts>
613 [[nodiscard]] std::string
strCat(std::string&& first, Ts&& ...ts)
615 strAppend(first, std::forward<Ts>(ts)...);
616 return std::move(first);
620 [[nodiscard]]
inline std::string
strCat()
622 return std::string();
629 [[nodiscard]]
inline std::string
strCat(
const std::string&
x) {
return x; }
630 [[nodiscard]]
inline std::string
strCat(std::string&&
x) {
return std::move(
x); }
631 [[nodiscard]]
inline std::string
strCat(
const char*
x) {
return std::string(
x); }
632 [[nodiscard]]
inline std::string
strCat(
char x) {
return std::string(1,
x); }
633 [[nodiscard]]
inline std::string
strCat(std::string_view
x) {
return std::string(
x.data(),
x.size()); }
646 [[nodiscard]]
inline std::string
strCat(
const std::string&
x,
const std::string& y) {
return x + y; }
647 [[nodiscard]]
inline std::string
strCat(
const char*
x,
const std::string& y) {
return x + y; }
648 [[nodiscard]]
inline std::string
strCat(
char x,
const std::string& y) {
return x + y; }
649 [[nodiscard]]
inline std::string
strCat(
const std::string&
x,
const char* y) {
return x + y; }
650 [[nodiscard]]
inline std::string
strCat(
const std::string&
x,
char y) {
return x + y; }
651 [[nodiscard]]
inline std::string
strCat(std::string&&
x,
const std::string& y) {
return x + y; }
652 [[nodiscard]]
inline std::string
strCat(
const std::string&
x, std::string&& y) {
return x + y; }
653 [[nodiscard]]
inline std::string
strCat(std::string&&
x, std::string&& y) {
return x + y; }
654 [[nodiscard]]
inline std::string
strCat(
const char*
x, std::string&& y) {
return x + y; }
655 [[nodiscard]]
inline std::string
strCat(
char x, std::string&& y) {
return x + y; }
656 [[nodiscard]]
inline std::string
strCat(std::string&&
x,
const char* y) {
return x + y; }
657 [[nodiscard]]
inline std::string
strCat(std::string&&
x,
char y) {
return x + y; }
668 template<
typename... Ts>
676 auto oldSize = result.size();
677 result.append(extraSize,
' ');
678 char* dst = &result[oldSize];
689 inline void strAppend(std::string&
x,
const std::string& y) {
x += y; }
691 inline void strAppend(std::string&
x, std::string_view y) {
x.append(y.data(), y.size()); }
694 template<
size_t N,
typename T>
Like std::string_view, but with the extra guarantee that it refers to a zero-terminated string.
constexpr KeyMatrixPosition x
Keyboard bindings.
auto makeConcatUnit(const T &t)
void copyUnits(char *dst, const std::tuple< Ts... > &t)
std::string to_string(T x)
void copyUnitsHelper(char *dst, const Tuple &t, std::index_sequence< Is... >)
typename FastUnsignedImpl< T >::type FastUnsigned
size_t calcTotalSizeHelper(const Tuple &t, std::index_sequence< Is... >)
size_t calcTotalSize(const std::tuple< Ts... > &t)
size_t size(std::string_view utf8)
strCatImpl::ConcatFixedWidthHexIntegral< N, T > hex_string(T t)
strCatImpl::ConcatSpaces spaces(size_t n)
TemporaryString tmpStrCat(Ts &&... ts)
std::string strCat(Ts &&...ts)
void strAppend(std::string &result, Ts &&...ts)
FastUnsigned< T > operator()(T t) const
FastUnsigned< T > operator()(T t) const
ConcatFixedWidthHexIntegral(T t_)
char * copy(char *dst) const
static constexpr size_t BUF_SIZE
char * copy(char *dst) const
static constexpr bool IS_SIGNED
char * copy(char *dst) const
char * copy(char *dst) const
char * copy(char *dst) const
ConcatUnit(const std::string_view v_)
char * copy(char *dst) const
ConcatViaString(std::string s_)
char * copy(char *dst) const
void operator()(T, char *&) const
void operator()(T t, char *&p) const
constexpr void repeat(T n, Op op)
Repeat the given operation 'op' 'n' times.