about summary refs log tree commit diff
path: root/src/base/tl/string.hpp
blob: 2b164091a96a8735ac766fb938c7b2cda770fa03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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