aboutsummaryrefslogtreecommitdiff
path: root/include/dchat/StringView.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/dchat/StringView.hpp')
-rw-r--r--include/dchat/StringView.hpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/include/dchat/StringView.hpp b/include/dchat/StringView.hpp
new file mode 100644
index 0000000..659610a
--- /dev/null
+++ b/include/dchat/StringView.hpp
@@ -0,0 +1,95 @@
+#pragma once
+
+#include "types.hpp"
+#include <string.h>
+#include <assert.h>
+
+namespace dchat
+{
+ template <typename CharType>
+ class BasicStringView
+ {
+ public:
+ BasicStringView() : data(nullptr), size(0)
+ {
+
+ }
+
+ BasicStringView(const BasicStringView<CharType> &other) : data(other.data), size(other.size)
+ {
+
+ }
+
+ BasicStringView(const CharType *_data) : data(_data), size(strlen(_data))
+ {
+
+ }
+
+ BasicStringView(const CharType *_data, usize _size) : data(_data), size(_size)
+ {
+
+ }
+
+ BasicStringView<CharType>& operator = (const BasicStringView<CharType> &other)
+ {
+ data = other.data;
+ size = other.size;
+ return *this;
+ }
+
+ BasicStringView(BasicStringView<CharType> &&other)
+ {
+ data = other.data;
+ size = other.size;
+
+ other.data = nullptr;
+ other.size = 0;
+ }
+
+ bool equals(const BasicStringView<CharType> &other) const
+ {
+ if(size != other.size) return false;
+ return memcmp(data, other.data, size * sizeof(CharType)) == 0;
+ }
+
+ bool operator == (const BasicStringView<CharType> &other) const
+ {
+ return equals(other);
+ }
+
+ bool operator != (const BasicStringView<CharType> &other) const
+ {
+ return !equals(other);
+ }
+
+ CharType operator [] (usize index) const
+ {
+ assert(index < size);
+ return data[index];
+ }
+
+ // Returns -1 if substr not found.
+ // TODO: Make this more efficient
+ usize find(const BasicStringView<CharType> &substr, usize offset = 0) const
+ {
+ if(substr.size == 0)
+ return -1;
+
+ if(offset + substr.size > size)
+ return -1;
+
+ for(usize i = offset; i < size - (substr.size - 1); ++i)
+ {
+ if(memcmp(data + i, substr.data, substr.size * sizeof(CharType)) == 0)
+ return i;
+ }
+ return -1;
+ }
+
+ const CharType *data;
+ usize size;
+ };
+
+ using StringView = BasicStringView<char>;
+ using StringViewUtf32 = BasicStringView<u32>;
+}