diff options
author | Mike Buland <eichlan@xagasoft.com> | 2012-08-24 18:15:11 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2012-08-24 18:15:11 +0000 |
commit | da642482dee91921fc16786208aa497d3ee31d94 (patch) | |
tree | bae598fca2bb2b55661bc1c854b43a1393aced23 /src/unstable | |
parent | f5ac2c1ba333ce6aa6d385d9a63b658caaa46503 (diff) | |
download | libbu++-da642482dee91921fc16786208aa497d3ee31d94.tar.gz libbu++-da642482dee91921fc16786208aa497d3ee31d94.tar.bz2 libbu++-da642482dee91921fc16786208aa497d3ee31d94.tar.xz libbu++-da642482dee91921fc16786208aa497d3ee31d94.zip |
Adding new Bu::Settings system, which works more or less like QSettings from Qt,
only...without qt.
It's the first real system in libbu++ that is going to be all unicode, which
is exciting, but I'm having to actually finish the Bu::UtfString class while I
work on it. Also exciting.
Diffstat (limited to '')
-rw-r--r-- | src/unstable/settings.cpp | 40 | ||||
-rw-r--r-- | src/unstable/settings.h | 34 | ||||
-rw-r--r-- | src/unstable/settingsdriver.cpp | 10 | ||||
-rw-r--r-- | src/unstable/settingsdriver.h | 26 | ||||
-rw-r--r-- | src/unstable/settingsdrivertaf.cpp | 29 | ||||
-rw-r--r-- | src/unstable/settingsdrivertaf.h | 24 | ||||
-rw-r--r-- | src/unstable/utfstring.cpp | 78 | ||||
-rw-r--r-- | src/unstable/utfstring.h | 105 |
8 files changed, 321 insertions, 25 deletions
diff --git a/src/unstable/settings.cpp b/src/unstable/settings.cpp new file mode 100644 index 0000000..e993250 --- /dev/null +++ b/src/unstable/settings.cpp | |||
@@ -0,0 +1,40 @@ | |||
1 | #include "bu/settings.h" | ||
2 | |||
3 | #include "bu/settingsdrivertaf.h" | ||
4 | |||
5 | Bu::Settings::Settings( const Bu::UtfString &sCompany, | ||
6 | const Bu::UtfString &sProduct, Bu::Settings::Driver eDriver ) : | ||
7 | sCompany( sCompany ), | ||
8 | sProduct( sProduct ), | ||
9 | pDriver( NULL ) | ||
10 | { | ||
11 | switch( eDriver ) | ||
12 | { | ||
13 | case DriverNative: | ||
14 | #if defined( WIN32 ) | ||
15 | #else | ||
16 | pDriver = new Bu::SettingsDriverTaf(); | ||
17 | #endif | ||
18 | break; | ||
19 | |||
20 | case DriverTaf: | ||
21 | pDriver = new Bu::SettingsDriverTaf(); | ||
22 | break; | ||
23 | |||
24 | case DriverIni: | ||
25 | throw Bu::ExceptionBase("Not supported"); | ||
26 | break; | ||
27 | } | ||
28 | |||
29 | pDriver->init( sCompany, sProduct ); | ||
30 | } | ||
31 | |||
32 | Bu::Settings::~Settings() | ||
33 | { | ||
34 | delete pDriver; | ||
35 | } | ||
36 | |||
37 | void Bu::Settings::set( const Bu::UtfString &sKey, const Bu::UtfString &sValue ) | ||
38 | { | ||
39 | } | ||
40 | |||
diff --git a/src/unstable/settings.h b/src/unstable/settings.h new file mode 100644 index 0000000..0736ee5 --- /dev/null +++ b/src/unstable/settings.h | |||
@@ -0,0 +1,34 @@ | |||
1 | #ifndef BU_SETTINGS_H | ||
2 | #define BU_SETTINGS_H | ||
3 | |||
4 | #include "bu/utfstring.h" | ||
5 | |||
6 | namespace Bu | ||
7 | { | ||
8 | /** | ||
9 | * Simple access to configuration data. Provides a consistant, cross | ||
10 | * platform interface to configuration data using native storage. | ||
11 | */ | ||
12 | class Settings | ||
13 | { | ||
14 | public: | ||
15 | enum Driver | ||
16 | { | ||
17 | DriverNative, | ||
18 | DriverTaf, | ||
19 | DriverIni | ||
20 | }; | ||
21 | Settings( const Bu::UtfString &sCompany, const Bu::UtfString &sProduct, | ||
22 | Driver driver=DriverNative ); | ||
23 | virtual ~Settings(); | ||
24 | |||
25 | void set( const Bu::UtfString &sKey, const Bu::UtfString &sValue ); | ||
26 | |||
27 | private: | ||
28 | Bu::UtfString sCompany; | ||
29 | Bu::UtfString sProduct; | ||
30 | class SettingsDriver *pDriver; | ||
31 | }; | ||
32 | }; | ||
33 | |||
34 | #endif | ||
diff --git a/src/unstable/settingsdriver.cpp b/src/unstable/settingsdriver.cpp new file mode 100644 index 0000000..92cac77 --- /dev/null +++ b/src/unstable/settingsdriver.cpp | |||
@@ -0,0 +1,10 @@ | |||
1 | #include "bu/settingsdriver.h" | ||
2 | |||
3 | Bu::SettingsDriver::SettingsDriver() | ||
4 | { | ||
5 | } | ||
6 | |||
7 | Bu::SettingsDriver::~SettingsDriver() | ||
8 | { | ||
9 | } | ||
10 | |||
diff --git a/src/unstable/settingsdriver.h b/src/unstable/settingsdriver.h new file mode 100644 index 0000000..0a63106 --- /dev/null +++ b/src/unstable/settingsdriver.h | |||
@@ -0,0 +1,26 @@ | |||
1 | #ifndef BU_SETTINGS_DRIVER_H | ||
2 | #define BU_SETTINGS_DRIVER_H | ||
3 | |||
4 | #include "bu/utfstring.h" | ||
5 | |||
6 | namespace Bu | ||
7 | { | ||
8 | class Settings; | ||
9 | |||
10 | /** | ||
11 | * Base class for i/o interfaces for Bu::Settings. By subclassing this you | ||
12 | * can provide custom storage for application settings. | ||
13 | */ | ||
14 | class SettingsDriver | ||
15 | { | ||
16 | friend class Bu::Settings; | ||
17 | public: | ||
18 | SettingsDriver(); | ||
19 | virtual ~SettingsDriver(); | ||
20 | |||
21 | protected: | ||
22 | virtual void init( const Bu::UtfString &sCompany, const Bu::UtfString &sProduct )=0; | ||
23 | }; | ||
24 | }; | ||
25 | |||
26 | #endif | ||
diff --git a/src/unstable/settingsdrivertaf.cpp b/src/unstable/settingsdrivertaf.cpp new file mode 100644 index 0000000..164bf0b --- /dev/null +++ b/src/unstable/settingsdrivertaf.cpp | |||
@@ -0,0 +1,29 @@ | |||
1 | #include "bu/settingsdrivertaf.h" | ||
2 | |||
3 | #include "bu/file.h" | ||
4 | #include "bu/taf.h" | ||
5 | |||
6 | #include <stdlib.h> | ||
7 | |||
8 | Bu::SettingsDriverTaf::SettingsDriverTaf() : | ||
9 | pRoot( NULL ) | ||
10 | { | ||
11 | } | ||
12 | |||
13 | Bu::SettingsDriverTaf::~SettingsDriverTaf() | ||
14 | { | ||
15 | } | ||
16 | |||
17 | void Bu::SettingsDriverTaf::init( const Bu::UtfString &sCompany, | ||
18 | const Bu::UtfString &sProduct ) | ||
19 | { | ||
20 | Bu::UtfString us( getenv("HOME") ); | ||
21 | us += "/"; | ||
22 | us += sCompany; | ||
23 | us += "/"; | ||
24 | us += sProduct; | ||
25 | Bu::File fIn( us.get(), Bu::File::Read|Bu::File::Create ); | ||
26 | Bu::TafReader tr( fIn ); | ||
27 | pRoot = tr.readGroup(); | ||
28 | } | ||
29 | |||
diff --git a/src/unstable/settingsdrivertaf.h b/src/unstable/settingsdrivertaf.h new file mode 100644 index 0000000..d7d751b --- /dev/null +++ b/src/unstable/settingsdrivertaf.h | |||
@@ -0,0 +1,24 @@ | |||
1 | #ifndef BU_SETTINGS_DRIVER_TAF_H | ||
2 | #define BU_SETTINGS_DRIVER_TAF_H | ||
3 | |||
4 | #include "bu/settingsdriver.h" | ||
5 | |||
6 | namespace Bu | ||
7 | { | ||
8 | class TafGroup; | ||
9 | |||
10 | class SettingsDriverTaf : public SettingsDriver | ||
11 | { | ||
12 | public: | ||
13 | SettingsDriverTaf(); | ||
14 | virtual ~SettingsDriverTaf(); | ||
15 | |||
16 | protected: | ||
17 | virtual void init( const Bu::UtfString &sCompany, const Bu::UtfString &sProduct ); | ||
18 | |||
19 | private: | ||
20 | class Bu::TafGroup *pRoot; | ||
21 | }; | ||
22 | }; | ||
23 | |||
24 | #endif | ||
diff --git a/src/unstable/utfstring.cpp b/src/unstable/utfstring.cpp index 1c6813c..9fe2d02 100644 --- a/src/unstable/utfstring.cpp +++ b/src/unstable/utfstring.cpp | |||
@@ -23,10 +23,25 @@ Bu::UtfString::UtfString( const Bu::String &sInput, Encoding eEnc ) | |||
23 | set( sInput, eEnc ); | 23 | set( sInput, eEnc ); |
24 | } | 24 | } |
25 | 25 | ||
26 | Bu::UtfString::UtfString( const char *sInput, Encoding eEnc ) | ||
27 | { | ||
28 | set( sInput, eEnc ); | ||
29 | } | ||
30 | |||
26 | Bu::UtfString::~UtfString() | 31 | Bu::UtfString::~UtfString() |
27 | { | 32 | { |
28 | } | 33 | } |
29 | 34 | ||
35 | Bu::UtfString::iterator Bu::UtfString::begin() | ||
36 | { | ||
37 | return Bu::UtfString::iterator( this, 0 ); | ||
38 | } | ||
39 | |||
40 | Bu::UtfString::const_iterator Bu::UtfString::begin() const | ||
41 | { | ||
42 | return Bu::UtfString::const_iterator( this, 0 ); | ||
43 | } | ||
44 | |||
30 | void Bu::UtfString::set( const Bu::String &sInput, Encoding eEnc ) | 45 | void Bu::UtfString::set( const Bu::String &sInput, Encoding eEnc ) |
31 | { | 46 | { |
32 | switch( eEnc ) | 47 | switch( eEnc ) |
@@ -258,7 +273,7 @@ void Bu::UtfString::setUtf32le( const Bu::String &sInput ) | |||
258 | } | 273 | } |
259 | } | 274 | } |
260 | 275 | ||
261 | void Bu::UtfString::write( Bu::Stream &sOut, Encoding eEnc ) | 276 | void Bu::UtfString::write( Bu::Stream &sOut, Encoding eEnc ) const |
262 | { | 277 | { |
263 | switch( eEnc ) | 278 | switch( eEnc ) |
264 | { | 279 | { |
@@ -306,7 +321,7 @@ void Bu::UtfString::write( Bu::Stream &sOut, Encoding eEnc ) | |||
306 | } | 321 | } |
307 | } | 322 | } |
308 | 323 | ||
309 | void Bu::UtfString::writeUtf8( Bu::Stream &sOut ) | 324 | void Bu::UtfString::writeUtf8( Bu::Stream &sOut ) const |
310 | { | 325 | { |
311 | int iPos = 0; | 326 | int iPos = 0; |
312 | while( iPos < aData.getSize() ) | 327 | while( iPos < aData.getSize() ) |
@@ -359,12 +374,12 @@ void Bu::UtfString::writeUtf16( Bu::Stream &sOut ) | |||
359 | { | 374 | { |
360 | } | 375 | } |
361 | */ | 376 | */ |
362 | void Bu::UtfString::writeUtf16be( Bu::Stream &sOut ) | 377 | void Bu::UtfString::writeUtf16be( Bu::Stream &sOut ) const |
363 | { | 378 | { |
364 | #if BYTE_ORDER == BIG_ENDIAN | 379 | #if BYTE_ORDER == BIG_ENDIAN |
365 | uint16_t iTmp = 0xFEFF; // Byte Order Marker | 380 | uint16_t iTmp = 0xFEFF; // Byte Order Marker |
366 | sOut.write( &iTmp, 2 ); | 381 | sOut.write( &iTmp, 2 ); |
367 | for( Array<uint16_t>::iterator i = aData.begin(); i; i++ ) | 382 | for( Array<uint16_t>::const_iterator i = aData.begin(); i; i++ ) |
368 | { | 383 | { |
369 | iTmp = *i; | 384 | iTmp = *i; |
370 | sOut.write( &iTmp, 2 ); | 385 | sOut.write( &iTmp, 2 ); |
@@ -373,7 +388,7 @@ void Bu::UtfString::writeUtf16be( Bu::Stream &sOut ) | |||
373 | uint16_t iTmp = 0xFEFF; // Byte Order Marker | 388 | uint16_t iTmp = 0xFEFF; // Byte Order Marker |
374 | iTmp = (iTmp>>8) | (iTmp<<8); | 389 | iTmp = (iTmp>>8) | (iTmp<<8); |
375 | sOut.write( &iTmp, 2 ); | 390 | sOut.write( &iTmp, 2 ); |
376 | for( Array<uint16_t>::iterator i = aData.begin(); i; i++ ) | 391 | for( Array<uint16_t>::const_iterator i = aData.begin(); i; i++ ) |
377 | { | 392 | { |
378 | iTmp = *i; | 393 | iTmp = *i; |
379 | iTmp = (iTmp>>8) | (iTmp<<8); | 394 | iTmp = (iTmp>>8) | (iTmp<<8); |
@@ -382,12 +397,12 @@ void Bu::UtfString::writeUtf16be( Bu::Stream &sOut ) | |||
382 | #endif | 397 | #endif |
383 | } | 398 | } |
384 | 399 | ||
385 | void Bu::UtfString::writeUtf16le( Bu::Stream &sOut ) | 400 | void Bu::UtfString::writeUtf16le( Bu::Stream &sOut ) const |
386 | { | 401 | { |
387 | #if BYTE_ORDER == LITTLE_ENDIAN | 402 | #if BYTE_ORDER == LITTLE_ENDIAN |
388 | uint16_t iTmp = 0xFEFF; // Byte Order Marker | 403 | uint16_t iTmp = 0xFEFF; // Byte Order Marker |
389 | sOut.write( &iTmp, 2 ); | 404 | sOut.write( &iTmp, 2 ); |
390 | for( Array<uint16_t>::iterator i = aData.begin(); i; i++ ) | 405 | for( Array<uint16_t>::const_iterator i = aData.begin(); i; i++ ) |
391 | { | 406 | { |
392 | iTmp = *i; | 407 | iTmp = *i; |
393 | sOut.write( &iTmp, 2 ); | 408 | sOut.write( &iTmp, 2 ); |
@@ -396,7 +411,7 @@ void Bu::UtfString::writeUtf16le( Bu::Stream &sOut ) | |||
396 | uint16_t iTmp = 0xFEFF; // Byte Order Marker | 411 | uint16_t iTmp = 0xFEFF; // Byte Order Marker |
397 | iTmp = (iTmp>>8) | (iTmp<<8); | 412 | iTmp = (iTmp>>8) | (iTmp<<8); |
398 | sOut.write( &iTmp, 2 ); | 413 | sOut.write( &iTmp, 2 ); |
399 | for( Array<uint16_t>::iterator i = aData.begin(); i; i++ ) | 414 | for( Array<uint16_t>::const_iterator i = aData.begin(); i; i++ ) |
400 | { | 415 | { |
401 | iTmp = *i; | 416 | iTmp = *i; |
402 | iTmp = (iTmp>>8) | (iTmp<<8); | 417 | iTmp = (iTmp>>8) | (iTmp<<8); |
@@ -405,7 +420,7 @@ void Bu::UtfString::writeUtf16le( Bu::Stream &sOut ) | |||
405 | #endif | 420 | #endif |
406 | } | 421 | } |
407 | 422 | ||
408 | void Bu::UtfString::writeUtf32be( Bu::Stream &sOut ) | 423 | void Bu::UtfString::writeUtf32be( Bu::Stream &sOut ) const |
409 | { | 424 | { |
410 | #if BYTE_ORDER == BIG_ENDIAN | 425 | #if BYTE_ORDER == BIG_ENDIAN |
411 | uint32_t iTmp = 0xFEFF; // Byte Order Marker | 426 | uint32_t iTmp = 0xFEFF; // Byte Order Marker |
@@ -430,7 +445,7 @@ void Bu::UtfString::writeUtf32be( Bu::Stream &sOut ) | |||
430 | #endif | 445 | #endif |
431 | } | 446 | } |
432 | 447 | ||
433 | void Bu::UtfString::writeUtf32le( Bu::Stream &sOut ) | 448 | void Bu::UtfString::writeUtf32le( Bu::Stream &sOut ) const |
434 | { | 449 | { |
435 | #if BYTE_ORDER == LITTLE_ENDIAN | 450 | #if BYTE_ORDER == LITTLE_ENDIAN |
436 | uint32_t iTmp = 0xFEFF; // Byte Order Marker | 451 | uint32_t iTmp = 0xFEFF; // Byte Order Marker |
@@ -455,12 +470,12 @@ void Bu::UtfString::writeUtf32le( Bu::Stream &sOut ) | |||
455 | #endif | 470 | #endif |
456 | } | 471 | } |
457 | 472 | ||
458 | Bu::UtfChar Bu::UtfString::get( int iIndex ) | 473 | Bu::UtfChar Bu::UtfString::get( int iIndex ) const |
459 | { | 474 | { |
460 | return nextChar( iIndex ); | 475 | return nextChar( iIndex ); |
461 | } | 476 | } |
462 | 477 | ||
463 | Bu::UtfChar Bu::UtfString::nextChar( int &iIndex ) | 478 | Bu::UtfChar Bu::UtfString::nextChar( int &iIndex ) const |
464 | { | 479 | { |
465 | Bu::UtfChar i = aData[iIndex++]; | 480 | Bu::UtfChar i = aData[iIndex++]; |
466 | switch( i&0xFC00 ) | 481 | switch( i&0xFC00 ) |
@@ -476,14 +491,31 @@ Bu::UtfChar Bu::UtfString::nextChar( int &iIndex ) | |||
476 | } | 491 | } |
477 | } | 492 | } |
478 | 493 | ||
479 | Bu::String Bu::UtfString::get( Encoding eEnc ) | 494 | bool Bu::UtfString::operator==( const Bu::UtfString &rhs ) const |
495 | { | ||
496 | return aData == rhs.aData; | ||
497 | } | ||
498 | |||
499 | Bu::UtfString &Bu::UtfString::operator+=( const Bu::UtfString &rhs ) | ||
500 | { | ||
501 | append( rhs ); | ||
502 | return *this; | ||
503 | } | ||
504 | |||
505 | Bu::UtfString &Bu::UtfString::operator+=( const UtfChar &rhs ) | ||
506 | { | ||
507 | append( rhs ); | ||
508 | return *this; | ||
509 | } | ||
510 | |||
511 | Bu::String Bu::UtfString::get( Encoding eEnc ) const | ||
480 | { | 512 | { |
481 | Bu::MemBuf mb; | 513 | Bu::MemBuf mb; |
482 | write( mb, eEnc ); | 514 | write( mb, eEnc ); |
483 | return mb.getString(); | 515 | return mb.getString(); |
484 | } | 516 | } |
485 | 517 | ||
486 | void Bu::UtfString::debug() | 518 | void Bu::UtfString::debug() const |
487 | { | 519 | { |
488 | sio << "Raw Utf16: "; | 520 | sio << "Raw Utf16: "; |
489 | for( int i = 0; i < aData.getSize(); i++ ) | 521 | for( int i = 0; i < aData.getSize(); i++ ) |
@@ -552,3 +584,21 @@ void Bu::UtfString::debugUtf8( const Bu::String &sUtf8 ) | |||
552 | sio << sio.nl; | 584 | sio << sio.nl; |
553 | } | 585 | } |
554 | */ | 586 | */ |
587 | |||
588 | template<> uint32_t Bu::__calcHashCode<Bu::UtfString>( const Bu::UtfString &k ) | ||
589 | { | ||
590 | uint32_t uCode = 0; | ||
591 | |||
592 | for( Bu::UtfString::const_iterator i = k.begin(); i; i++ ) | ||
593 | { | ||
594 | uCode = *i + (uCode<<6) + (uCode<<16) - uCode; | ||
595 | } | ||
596 | |||
597 | return uCode; | ||
598 | } | ||
599 | |||
600 | template<> bool Bu::__cmpHashKeys<Bu::UtfString>( | ||
601 | const Bu::UtfString &a, const Bu::UtfString &b ) | ||
602 | { | ||
603 | return a == b; | ||
604 | } | ||
diff --git a/src/unstable/utfstring.h b/src/unstable/utfstring.h index af233e8..1bd4cce 100644 --- a/src/unstable/utfstring.h +++ b/src/unstable/utfstring.h | |||
@@ -72,10 +72,12 @@ namespace Bu | |||
72 | 72 | ||
73 | UtfString(); | 73 | UtfString(); |
74 | UtfString( const Bu::String &sInput, Encoding eEnc=Utf8 ); | 74 | UtfString( const Bu::String &sInput, Encoding eEnc=Utf8 ); |
75 | UtfString( const char *sInput, Encoding eEnc=Utf8 ); | ||
75 | virtual ~UtfString(); | 76 | virtual ~UtfString(); |
76 | 77 | ||
77 | class iterator | 78 | class iterator |
78 | { | 79 | { |
80 | friend class UtfString; | ||
79 | private: | 81 | private: |
80 | iterator( UtfString *pSrc, int iCodePos ) : | 82 | iterator( UtfString *pSrc, int iCodePos ) : |
81 | pSrc( pSrc ), iCodePos( iCodePos ) | 83 | pSrc( pSrc ), iCodePos( iCodePos ) |
@@ -92,13 +94,77 @@ namespace Bu | |||
92 | { | 94 | { |
93 | if( !pSrc ) | 95 | if( !pSrc ) |
94 | throw Bu::ExceptionBase("invalid UtfString::iterator dereferenced."); | 96 | throw Bu::ExceptionBase("invalid UtfString::iterator dereferenced."); |
95 | return pSrc->nextChar( iCodePos ); | 97 | return pSrc->get( iCodePos ); |
98 | } | ||
99 | |||
100 | iterator operator++() | ||
101 | { | ||
102 | pSrc->nextChar( iCodePos ); | ||
103 | return *this; | ||
104 | } | ||
105 | |||
106 | iterator operator++( int ) | ||
107 | { | ||
108 | pSrc->nextChar( iCodePos ); | ||
109 | return *this; | ||
110 | } | ||
111 | |||
112 | operator bool() const | ||
113 | { | ||
114 | return iCodePos < pSrc->aData.getSize(); | ||
96 | } | 115 | } |
97 | 116 | ||
98 | private: | 117 | private: |
99 | UtfString *pSrc; | 118 | UtfString *pSrc; |
100 | int iCodePos; | 119 | int iCodePos; |
101 | }; | 120 | }; |
121 | |||
122 | class const_iterator | ||
123 | { | ||
124 | friend class UtfString; | ||
125 | private: | ||
126 | const_iterator( const UtfString *pSrc, int iCodePos ) : | ||
127 | pSrc( pSrc ), iCodePos( iCodePos ) | ||
128 | { | ||
129 | } | ||
130 | |||
131 | public: | ||
132 | const_iterator() : | ||
133 | pSrc( NULL ), iCodePos( 0 ) | ||
134 | { | ||
135 | } | ||
136 | |||
137 | UtfChar operator*() | ||
138 | { | ||
139 | if( !pSrc ) | ||
140 | throw Bu::ExceptionBase("invalid UtfString::iterator dereferenced."); | ||
141 | return pSrc->get( iCodePos ); | ||
142 | } | ||
143 | |||
144 | const_iterator operator++() | ||
145 | { | ||
146 | pSrc->nextChar( iCodePos ); | ||
147 | return *this; | ||
148 | } | ||
149 | |||
150 | const_iterator operator++( int ) | ||
151 | { | ||
152 | pSrc->nextChar( iCodePos ); | ||
153 | return *this; | ||
154 | } | ||
155 | |||
156 | operator bool() const | ||
157 | { | ||
158 | return iCodePos < pSrc->aData.getSize(); | ||
159 | } | ||
160 | |||
161 | private: | ||
162 | const UtfString *pSrc; | ||
163 | int iCodePos; | ||
164 | }; | ||
165 | |||
166 | iterator begin(); | ||
167 | const_iterator begin() const; | ||
102 | 168 | ||
103 | /** | 169 | /** |
104 | * Append a UtfChar (A unicode code point) to the string. This can be | 170 | * Append a UtfChar (A unicode code point) to the string. This can be |
@@ -122,23 +188,23 @@ namespace Bu | |||
122 | * the provided stream. all Utf16 and Utf32 encodings will have the | 188 | * the provided stream. all Utf16 and Utf32 encodings will have the |
123 | * correct BOM (byte order marker) at the begining. | 189 | * correct BOM (byte order marker) at the begining. |
124 | */ | 190 | */ |
125 | void write( Bu::Stream &sOut, Encoding eEnc=Utf8 ); | 191 | void write( Bu::Stream &sOut, Encoding eEnc=Utf8 ) const; |
126 | 192 | ||
127 | /** | 193 | /** |
128 | * This encodes the UtfString in the given encoding and returns it as | 194 | * This encodes the UtfString in the given encoding and returns it as |
129 | * a binary Bu::String. Like write, this also includes the proper BOM | 195 | * a binary Bu::String. Like write, this also includes the proper BOM |
130 | * at the begining. | 196 | * at the begining. |
131 | */ | 197 | */ |
132 | Bu::String get( Encoding eEnc=Utf8 ); | 198 | Bu::String get( Encoding eEnc=Utf8 ) const; |
133 | 199 | ||
134 | void debug(); | 200 | void debug() const; |
135 | 201 | ||
136 | /** | 202 | /** |
137 | * This may or may not stick around, given an index, this returns a | 203 | * This may or may not stick around, given an index, this returns a |
138 | * codepoint, however there isn't necesarilly a 1:1 ratio between | 204 | * codepoint, however there isn't necesarilly a 1:1 ratio between |
139 | * indexes and code points. | 205 | * indexes and code points. |
140 | */ | 206 | */ |
141 | UtfChar get( int iIndex ); | 207 | UtfChar get( int iIndex ) const; |
142 | 208 | ||
143 | /** | 209 | /** |
144 | * This is what to use if you want to iterate through a section of the | 210 | * This is what to use if you want to iterate through a section of the |
@@ -147,7 +213,11 @@ namespace Bu | |||
147 | * will return the codepoint at that position and increment iIndex an | 213 | * will return the codepoint at that position and increment iIndex an |
148 | * appropriate amount for it to point to the next code point. | 214 | * appropriate amount for it to point to the next code point. |
149 | */ | 215 | */ |
150 | UtfChar nextChar( int &iIndex ); | 216 | UtfChar nextChar( int &iIndex ) const; |
217 | |||
218 | bool operator==( const Bu::UtfString &rhs ) const; | ||
219 | UtfString &operator+=( const Bu::UtfString &rhs ); | ||
220 | UtfString &operator+=( const UtfChar &rhs ); | ||
151 | 221 | ||
152 | private: | 222 | private: |
153 | void append16( uint16_t i ) { aData.append( i ); } | 223 | void append16( uint16_t i ) { aData.append( i ); } |
@@ -160,17 +230,30 @@ namespace Bu | |||
160 | void setUtf32be( const Bu::String &sInput ); | 230 | void setUtf32be( const Bu::String &sInput ); |
161 | void setUtf32le( const Bu::String &sInput ); | 231 | void setUtf32le( const Bu::String &sInput ); |
162 | 232 | ||
163 | void writeUtf8( Bu::Stream &sOut ); | 233 | void writeUtf8( Bu::Stream &sOut ) const; |
164 | void writeUtf16be( Bu::Stream &sOut ); | 234 | void writeUtf16be( Bu::Stream &sOut ) const; |
165 | void writeUtf16le( Bu::Stream &sOut ); | 235 | void writeUtf16le( Bu::Stream &sOut ) const; |
166 | void writeUtf32be( Bu::Stream &sOut ); | 236 | void writeUtf32be( Bu::Stream &sOut ) const; |
167 | void writeUtf32le( Bu::Stream &sOut ); | 237 | void writeUtf32le( Bu::Stream &sOut ) const; |
168 | 238 | ||
169 | private: | 239 | private: |
170 | Bu::Array<uint16_t> aData; | 240 | Bu::Array<uint16_t> aData; |
171 | int iRawLen; | 241 | int iRawLen; |
172 | int iCharLen; | 242 | int iCharLen; |
173 | }; | 243 | }; |
244 | |||
245 | // | ||
246 | // Hash support | ||
247 | // | ||
248 | template<typename T> | ||
249 | uint32_t __calcHashCode( const T &k ); | ||
250 | |||
251 | template<typename T> | ||
252 | bool __cmpHashKeys( const T &a, const T &b ); | ||
253 | |||
254 | template<> uint32_t __calcHashCode<UtfString>( const UtfString &k ); | ||
255 | template<> bool __cmpHashKeys<UtfString>( | ||
256 | const UtfString &a, const UtfString &b ); | ||
174 | }; | 257 | }; |
175 | 258 | ||
176 | #endif | 259 | #endif |