cel_sstring.h

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------
00004 //
00005 // (C) 2003-2006 Celartem Technology Inc. All rights reserved.
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                 // This prevent compilers from stripping the memset above.
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 } // namespace Celartem
00122 
00123 #endif // _cel_sstring_h_

This document is automatically generated using doxygen 1.5.4 at Fri Jun 27 18:21:54 2008.