1 #ifndef REPLXX_UTF8STRING_HXX_INCLUDED 2 #define REPLXX_UTF8STRING_HXX_INCLUDED 3 4 #include <memory> 5 6 #include "unicodestring.hxx" 7 8 namespace replxx { 9 10 class Utf8String { 11 private: 12 typedef std::unique_ptr<char[]> buffer_t; 13 buffer_t _data; 14 int _bufSize; 15 int _len; 16 public: Utf8String(void)17 Utf8String( void ) 18 : _data() 19 , _bufSize( 0 ) 20 , _len( 0 ) { 21 } Utf8String(UnicodeString const & src)22 explicit Utf8String( UnicodeString const& src ) 23 : _data() 24 , _bufSize( 0 ) 25 , _len( 0 ) { 26 assign( src, src.length() ); 27 } 28 Utf8String(UnicodeString const & src_,int len_)29 Utf8String( UnicodeString const& src_, int len_ ) 30 : _data() 31 , _bufSize( 0 ) 32 , _len( 0 ) { 33 assign( src_, len_ ); 34 } 35 assign(UnicodeString const & str_)36 void assign( UnicodeString const& str_ ) { 37 assign( str_, str_.length() ); 38 } 39 assign(UnicodeString const & str_,int len_)40 void assign( UnicodeString const& str_, int len_ ) { 41 assign( str_.get(), len_ ); 42 } 43 assign(char32_t const * str_,int len_)44 void assign( char32_t const* str_, int len_ ) { 45 int len( len_ * 4 ); 46 realloc( len ); 47 _len = copyString32to8( _data.get(), len, str_, len_ ); 48 } 49 assign(std::string const & str_)50 void assign( std::string const& str_ ) { 51 realloc( static_cast<int>( str_.length() ) ); 52 strncpy( _data.get(), str_.c_str(), str_.length() ); 53 _len = static_cast<int>( str_.length() ); 54 } 55 assign(Utf8String const & other_)56 void assign( Utf8String const& other_ ) { 57 realloc( other_._len ); 58 strncpy( _data.get(), other_._data.get(), other_._len ); 59 _len = other_._len; 60 } 61 get() const62 char const* get() const { 63 return _data.get(); 64 } 65 size(void) const66 int size( void ) const { 67 return ( _len ); 68 } 69 operator !=(Utf8String const & other_)70 bool operator != ( Utf8String const& other_ ) { 71 return ( ( other_._len != _len ) || ( memcmp( other_._data.get(), _data.get(), _len ) != 0 ) ); 72 } 73 74 private: realloc(int reqLen)75 void realloc( int reqLen ) { 76 if ( ( reqLen + 1 ) > _bufSize ) { 77 _bufSize = 1; 78 while ( ( reqLen + 1 ) > _bufSize ) { 79 _bufSize *= 2; 80 } 81 _data.reset( new char[_bufSize] ); 82 memset( _data.get(), 0, _bufSize ); 83 } 84 _data[reqLen] = 0; 85 return; 86 } 87 Utf8String(const Utf8String&) = delete; 88 Utf8String& operator=(const Utf8String&) = delete; 89 }; 90 91 } 92 93 #endif 94 95