summaryrefslogtreecommitdiffstats
path: root/include/godot_cpp/variant/char_string.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/godot_cpp/variant/char_string.hpp')
-rw-r--r--include/godot_cpp/variant/char_string.hpp125
1 files changed, 71 insertions, 54 deletions
diff --git a/include/godot_cpp/variant/char_string.hpp b/include/godot_cpp/variant/char_string.hpp
index fa58bbd..f8f5169 100644
--- a/include/godot_cpp/variant/char_string.hpp
+++ b/include/godot_cpp/variant/char_string.hpp
@@ -31,83 +31,100 @@
#ifndef GODOT_CHAR_STRING_HPP
#define GODOT_CHAR_STRING_HPP
+#include <godot_cpp/templates/cowdata.hpp>
+
#include <cstddef>
#include <cstdint>
namespace godot {
-class CharString {
- friend class String;
-
- const char *_data = nullptr;
- int _length = 0;
-
- CharString(const char *str, int length);
-
-public:
- int length() const;
- const char *get_data() const;
-
- CharString(CharString &&p_str);
- void operator=(CharString &&p_str);
- CharString() {}
- ~CharString();
-};
+template <class T>
+class CharStringT;
-class Char16String {
- friend class String;
+template <class T>
+class CharProxy {
+ template <class TS>
+ friend class CharStringT;
- const char16_t *_data = nullptr;
- int _length = 0;
+ const int _index;
+ CowData<T> &_cowdata;
+ static inline const T _null = 0;
- Char16String(const char16_t *str, int length);
+ _FORCE_INLINE_ CharProxy(const int &p_index, CowData<T> &p_cowdata) :
+ _index(p_index),
+ _cowdata(p_cowdata) {}
public:
- int length() const;
- const char16_t *get_data() const;
-
- Char16String(Char16String &&p_str);
- void operator=(Char16String &&p_str);
- Char16String() {}
- ~Char16String();
-};
+ _FORCE_INLINE_ CharProxy(const CharProxy<T> &p_other) :
+ _index(p_other._index),
+ _cowdata(p_other._cowdata) {}
-class Char32String {
- friend class String;
+ _FORCE_INLINE_ operator T() const {
+ if (unlikely(_index == _cowdata.size())) {
+ return _null;
+ }
- const char32_t *_data = nullptr;
- int _length = 0;
+ return _cowdata.get(_index);
+ }
- Char32String(const char32_t *str, int length);
+ _FORCE_INLINE_ const T *operator&() const {
+ return _cowdata.ptr() + _index;
+ }
-public:
- int length() const;
- const char32_t *get_data() const;
+ _FORCE_INLINE_ void operator=(const T &p_other) const {
+ _cowdata.set(_index, p_other);
+ }
- Char32String(Char32String &&p_str);
- void operator=(Char32String &&p_str);
- Char32String() {}
- ~Char32String();
+ _FORCE_INLINE_ void operator=(const CharProxy<T> &p_other) const {
+ _cowdata.set(_index, p_other.operator T());
+ }
};
-class CharWideString {
+template <class T>
+class CharStringT {
friend class String;
- const wchar_t *_data = nullptr;
- int _length = 0;
-
- CharWideString(const wchar_t *str, int length);
+ CowData<T> _cowdata;
+ static inline const T _null = 0;
public:
- int length() const;
- const wchar_t *get_data() const;
-
- CharWideString(CharWideString &&p_str);
- void operator=(CharWideString &&p_str);
- CharWideString() {}
- ~CharWideString();
+ _FORCE_INLINE_ T *ptrw() { return _cowdata.ptrw(); }
+ _FORCE_INLINE_ const T *ptr() const { return _cowdata.ptr(); }
+ _FORCE_INLINE_ int size() const { return _cowdata.size(); }
+ Error resize(int p_size) { return _cowdata.resize(p_size); }
+
+ _FORCE_INLINE_ T get(int p_index) const { return _cowdata.get(p_index); }
+ _FORCE_INLINE_ void set(int p_index, const T &p_elem) { _cowdata.set(p_index, p_elem); }
+ _FORCE_INLINE_ const T &operator[](int p_index) const {
+ if (unlikely(p_index == _cowdata.size())) {
+ return _null;
+ }
+
+ return _cowdata.get(p_index);
+ }
+ _FORCE_INLINE_ CharProxy<T> operator[](int p_index) { return CharProxy<T>(p_index, _cowdata); }
+
+ _FORCE_INLINE_ CharStringT() {}
+ _FORCE_INLINE_ CharStringT(const CharStringT<T> &p_str) { _cowdata._ref(p_str._cowdata); }
+ _FORCE_INLINE_ void operator=(const CharStringT<T> &p_str) { _cowdata._ref(p_str._cowdata); }
+ _FORCE_INLINE_ CharStringT(const T *p_cstr) { copy_from(p_cstr); }
+
+ void operator=(const T *p_cstr);
+ bool operator<(const CharStringT<T> &p_right) const;
+ CharStringT<T> &operator+=(T p_char);
+ int length() const { return size() ? size() - 1 : 0; }
+ const T *get_data() const;
+ operator const T *() const { return get_data(); };
+
+protected:
+ void copy_from(const T *p_cstr);
};
+typedef CharStringT<char> CharString;
+typedef CharStringT<char16_t> Char16String;
+typedef CharStringT<char32_t> Char32String;
+typedef CharStringT<wchar_t> CharWideString;
+
} // namespace godot
#endif // GODOT_CHAR_STRING_HPP