#pragma once #include #include #include #include template constexpr std::array toStdArray(T (&arr)[N], std::index_sequence) { return {arr[Idx]...}; } template constexpr std::array resize(const std::array& arr, std::index_sequence) { return {arr[Indexes]...}; } template constexpr std::array resize(const std::array& arr) { constexpr std::size_t minSize = std::min(OldSize, NewSize); return resize(arr, std::make_index_sequence()); } // statically allocates a string buffer of (N+1) chars template < size_t N > class StaticString { public: constexpr StaticString() = default; constexpr StaticString(const char (&chars)[N]) : m_str(toStdArray(chars)) { } constexpr StaticString(std::array chars) : m_str(std::move(chars)) { } constexpr StaticString(const char * str) { std::strncpy(m_str.data(), str, N); } void operator=(const char * str) { std::strncpy(m_str.data(), str, N); } const char * c_str() const noexcept { return m_str.data(); } const char * data() const noexcept { return m_str.data(); } std::size_t size() const { return strlen(m_str.data()); } template constexpr StaticString operator+(const StaticString &rhs) const { return join(resize(m_str), rhs.m_str); } template friend class StaticString; private: std::array< char, N + 1 > m_str{}; };