about summary refs log tree commit diff
path: root/src/base/tl/string.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/tl/string.hpp')
-rw-r--r--src/base/tl/string.hpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/base/tl/string.hpp b/src/base/tl/string.hpp
new file mode 100644
index 00000000..2b164091
--- /dev/null
+++ b/src/base/tl/string.hpp
@@ -0,0 +1,68 @@
+#ifndef TL_FILE_STRING_HPP
+#define TL_FILE_STRING_HPP
+
+#include "base.hpp"
+#include "allocator.hpp"
+
+template<class ALLOCATOR >
+class string_base : private ALLOCATOR
+{
+	char *str;
+	int length;
+	
+	void reset()
+	{
+		str = 0; length = 0;
+	}
+	
+	void free()
+	{
+		ALLOCATOR::free_array(str);
+		reset();
+	}	
+	
+	void copy(const char *other_str, int other_length)
+	{
+		length = other_length;
+		str = ALLOCATOR::alloc_array(length+1);
+		mem_copy(str, other_str, length+1);
+	}
+		
+	void copy(const string_base &other)
+	{
+		if(!other.str)
+			return;
+		copy(other.str, other.length);
+	}
+	
+public:
+	string_base() { reset(); }
+	string_base(const char *other_str) { copy(other_str, str_length(other_str)); }
+	string_base(const string_base &other) { reset(); copy(other); }
+	~string_base() { free(); }
+	
+	string_base &operator = (const char *other)
+	{
+		free();
+		if(other)
+			copy(other, str_length(other));
+		return *this;
+	}
+	
+	string_base &operator = (const string_base &other)
+	{
+		free();
+		copy(other);
+		return *this;
+	}
+		
+	bool operator < (const char *other_str) const { return str_comp(str, other_str) < 0; }
+	operator const char *() const { return str; }
+	
+	const char *cstr() const { return str; }
+};
+
+/* normal allocated string */
+typedef string_base<allocator_default<char> > string;
+
+#endif // TL_FILE_STRING_HPP