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