00001
00004
00005
00006
00007
00008 #ifndef _cel_sstring_h_
00009 #define _cel_sstring_h_
00010
00011 #include "cel_types.h"
00012 #include "cel_stringutil.h"
00013 #include <cstring>
00014
00015 namespace Celartem
00016 {
00021 template<typename T> struct sstring
00022 {
00023 T *m_buffer;
00024 size_t m_size;
00025
00026 sstring() : m_buffer(NULL), m_size(0) {}
00027
00028 sstring(size_t size) : m_buffer(NULL)
00029 {
00030 allocate(size);
00031 }
00032
00033 ~sstring()
00034 {
00035 free();
00036 }
00037
00038 sstring(const sstring& str) : m_buffer(NULL)
00039 {
00040 duplicate(str);
00041 }
00042
00043 sstring(const T *str, size_t length = -1) : m_buffer(NULL)
00044 {
00045 from_cstr(str, length);
00046 }
00047
00048 sstring& operator=(const sstring& str)
00049 {
00050 duplicate(str);
00051 return *this;
00052 }
00053
00054 sstring& operator=(const T *str)
00055 {
00056 from_cstr(str);
00057 return *this;
00058 }
00059
00060 void from_cstr(const T *str, size_t length = -1)
00061 {
00062 if (str == NULL)
00063 {
00064 allocate(1);
00065 m_buffer[0] = 0;
00066 return;
00067 }
00068 size_t l = StringUtil<T>::strlen(str);
00069 if(length > l)
00070 length = l;
00071
00072 allocate(length + 1);
00073 std::memcpy(m_buffer, str, length);
00074 m_buffer[length] = 0;
00075 }
00076
00077 void duplicate(const sstring& str)
00078 {
00079 allocate(str.m_size);
00080 std::memcpy(m_buffer, str.m_buffer, sizeof(T) * m_size);
00081 }
00082
00083 void allocate(size_t size)
00084 {
00085 free();
00086 m_buffer = new T[size];
00087 m_size = size;
00088 }
00089
00090 void free()
00091 {
00092 if(m_buffer)
00093 {
00094 std::memset(m_buffer, 0, sizeof(T) * m_size);
00095
00096
00097 *(volatile char *)m_buffer = *(volatile char *)m_buffer;
00098
00099 delete[] m_buffer;
00100 m_buffer = NULL;
00101 m_size = 0;
00102 }
00103 }
00104
00105 operator const T *() const {return m_buffer;}
00106 const T *getPtr() const {return m_buffer;}
00107
00108 operator T *() {return m_buffer;}
00109 T *getPtr() {return m_buffer;}
00110
00111 size_t getSize() const {return m_size;}
00112
00113 T *detach()
00114 {
00115 T *t = m_buffer;
00116 m_buffer = NULL;
00117 return t;
00118 }
00119 };
00120
00121 }
00122
00123 #endif // _cel_sstring_h_