summaryrefslogtreecommitdiff
path: root/src/util/string.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/string.h')
-rw-r--r--src/util/string.h30
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; }
};