diff options
Diffstat (limited to 'src/util/string.h')
| -rw-r--r-- | src/util/string.h | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/util/string.h b/src/util/string.h index b261e76..47da1a0 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -3,9 +3,15 @@ #include "typedef.h" +constexpr U32 strlen_ct( const char* str ) { + U32 len = 0; + for( ; !!str[len]; ++len ); + return len; +} + template <U32 N> struct STR { - char data[N]; + char data[N]{ 0 }; enum { size = N }; @@ -13,11 +19,31 @@ struct STR { memset( data, 0, N ); } STR( const char* str ) { - memcpy( data, str, N ); + memcpy( data, str, strlen_ct( str ) ); } STR( const STR<N>& str ) { memcpy( data, str.data, N ); } + template <U32 other> + auto operator+( const STR<other>& rhs ) { + constexpr U32 l1 = strlen_ct( data ); + constexpr U32 l2 = strlen_ct( rhs.data ); + + constexpr U32 high = N > other ? N : other; + constexpr U32 max = (l1 + l2 > high) ? l1 + l2 + 1 : high; + + STR<max> result; + memcpy( result.data, data, l1 ); + memcpy( result.data + l1, rhs.data, l2 ); + result.data[l1 + l2] = '\0'; + return result; + } + + template <U32 other> + auto concat( const STR<other>& str ) { + return *this + str; + } + operator char*() { return data; } }; |
