Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

utf8string.hxx 1.9KB

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