00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __ZStrim__
00026 #define __ZStrim__ 1
00027 #include "zconfig.h"
00028
00029 #include "ZUnicode.h"
00030 #include <stdexcept>
00031
00032 class ZStrimW;
00033
00034
00035 #pragma mark -
00036 #pragma mark * ZStrimR
00037
00038 class ZStrimR
00039 {
00040 protected:
00045 ZStrimR() {}
00046 ~ZStrimR() {}
00047 ZStrimR(const ZStrimR&) {}
00048 ZStrimR& operator=(const ZStrimR&) { return *this; }
00050
00051
00052 public:
00053 class ExEndOfStrim;
00054 static void sThrowEndOfStrim();
00055
00058 bool ReadCP(UTF32& oCP) const;
00059 UTF32 ReadCP() const;
00061
00062
00065 string32 ReadUTF32(size_t iCountCP) const;
00066 string16 ReadUTF16(size_t iCountCP) const;
00067 string8 ReadUTF8(size_t iCountCP) const;
00069
00070
00073 void Read(UTF32* iDest, size_t iCount, size_t* oCount) const;
00074 void Read(UTF16* iDest, size_t iCountCU, size_t* oCountCU) const;
00075 void Read(UTF8* iDest, size_t iCountCU, size_t* oCountCU) const;
00077
00078
00081 void Read(UTF16* iDest,
00082 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP) const;
00083
00084 void Read(UTF8* iDest,
00085 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP) const;
00087
00088
00092 void CopyAllTo(const ZStrimW& iStrimW) const;
00093 void CopyAllTo(const ZStrimW& iStrimW, size_t* oCountCPRead, size_t* oCountCPWritten) const;
00094
00095 void CopyTo(const ZStrimW& iStrimW, size_t iCountCP) const;
00096
00097 void CopyTo(const ZStrimW& iStrimW,
00098 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten) const;
00100
00101
00105 void Skip(size_t iCountCP) const;
00106 void Skip(size_t iCountCP, size_t* oCountCPSkipped) const;
00107 void SkipAll() const;
00108 void SkipAll(size_t* oCountCPSkipped) const;
00110
00111
00115 virtual void Imp_ReadUTF32(UTF32* iDest, size_t iCount, size_t* oCount) = 0;
00117
00118
00123 virtual void Imp_ReadUTF16(UTF16* iDest,
00124 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00125
00126 virtual void Imp_ReadUTF8(UTF8* iDest,
00127 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00128
00129 virtual void Imp_CopyToDispatch(const ZStrimW& iStrimW,
00130 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00131
00132 virtual void Imp_CopyTo(const ZStrimW& iStrimW,
00133 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00134
00135 virtual void Imp_Skip(size_t iCountCP, size_t* oCountCPSkipped);
00137 };
00138
00139
00140 #pragma mark -
00141 #pragma mark * ZStrimR::ExEndOfStrim
00142
00143 class ZStrimR::ExEndOfStrim : public std::range_error
00144 {
00145 public:
00146 ExEndOfStrim();
00147 };
00148
00149
00150 #pragma mark -
00151 #pragma mark * ZStrimU
00152
00153 class ZStrimU : public ZStrimR
00154 {
00155 public:
00156 void Unread() const;
00157
00158 virtual void Imp_Unread() = 0;
00159 };
00160
00161 inline void ZStrimU::Unread() const
00162 { const_cast<ZStrimU*>(this)->Imp_Unread(); }
00163
00164
00165 #pragma mark -
00166 #pragma mark * ZStrimW
00167
00168 class ZStrimW
00169 {
00170 protected:
00175 ZStrimW() {}
00176 ~ZStrimW() {}
00177 ZStrimW(const ZStrimW&) {}
00178 ZStrimW& operator=(const ZStrimW&) { return *this; }
00180
00181
00182 public:
00183 class ExEndOfStrim;
00184 static void sThrowEndOfStrim();
00185
00188 void WriteCP(UTF32 iCP) const;
00190
00191
00194 void Write(const UTF32* iString) const;
00195 void Write(const UTF16* iString) const;
00196 void Write(const UTF8* iString) const;
00198
00199
00202 void Write(const string32& iString) const;
00203 void Write(const string16& iString) const;
00204 void Write(const string8& iString) const;
00206
00207
00210 void Write(const UTF32* iSource, size_t iCountCU) const;
00211 void Write(const UTF16* iSource, size_t iCountCU) const;
00212 void Write(const UTF8* iSource, size_t iCountCU) const;
00214
00215
00218 void Write(const UTF32* iSource, size_t iCountCU, size_t* oCountCU) const;
00219 void Write(const UTF16* iSource, size_t iCountCU, size_t* oCountCU) const;
00220 void Write(const UTF8* iSource, size_t iCountCU, size_t* oCountCU) const;
00222
00223
00226 void Write(const UTF32* iSource,
00227 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP) const;
00228
00229 void Write(const UTF16* iSource,
00230 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP) const;
00231
00232 void Write(const UTF8* iSource,
00233 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP) const;
00235
00236
00239 size_t Writef(const UTF8* iString, ...) const;
00241
00242
00246 void CopyAllFrom(const ZStrimR& iStrimR) const;
00247 void CopyAllFrom(const ZStrimR& iStrimR, size_t* oCountCPRead, size_t* oCountCPWritten) const;
00248
00249 void CopyFrom(const ZStrimR& iStrimR, size_t iCountCP) const;
00250
00251 void CopyFrom(const ZStrimR& iStrimR,
00252 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten) const;
00254
00255
00258 void Flush() const;
00260
00261
00265 virtual void Imp_WriteUTF32(const UTF32* iSource, size_t iCountCU, size_t* oCountCU) = 0;
00266 virtual void Imp_WriteUTF16(const UTF16* iSource, size_t iCountCU, size_t* oCountCU) = 0;
00267 virtual void Imp_WriteUTF8(const UTF8* iSource, size_t iCountCU, size_t* oCountCU) = 0;
00269
00270
00273 virtual void Imp_CopyFromDispatch(const ZStrimR& iStrimR,
00274 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00275
00276 virtual void Imp_CopyFrom(const ZStrimR& iStrimR,
00277 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00278
00279 virtual void Imp_Flush();
00281 };
00282
00283 inline const ZStrimW& operator<<(const ZStrimW& s, const string32& iString)
00284 {
00285 s.Write(iString);
00286 return s;
00287 }
00288
00289 inline const ZStrimW& operator<<(const ZStrimW& s, const UTF32* iString)
00290 {
00291 s.Write(iString);
00292 return s;
00293 }
00294
00295 inline const ZStrimW& operator<<(const ZStrimW& s, const string16& iString)
00296 {
00297 s.Write(iString);
00298 return s;
00299 }
00300
00301 inline const ZStrimW& operator<<(const ZStrimW& s, const UTF16* iString)
00302 {
00303 s.Write(iString);
00304 return s;
00305 }
00306
00307 inline const ZStrimW& operator<<(const ZStrimW& s, const string8& iString)
00308 {
00309 s.Write(iString);
00310 return s;
00311 }
00312
00313 inline const ZStrimW& operator<<(const ZStrimW& s, const UTF8* iString)
00314 {
00315 s.Write(iString);
00316 return s;
00317 }
00318
00319 inline const ZStrimW& operator<<(const ZStrimW& s, const ZStrimR& r)
00320 {
00321 s.CopyAllFrom(r);
00322 return s;
00323 }
00324
00325
00326 #pragma mark -
00327 #pragma mark * ZStrimW::ExEndOfStrim
00328
00329 class ZStrimW::ExEndOfStrim : public std::range_error
00330 {
00331 public:
00332 ExEndOfStrim();
00333 };
00334
00335
00336 #pragma mark -
00337 #pragma mark * ZStrimW_NativeUTF32
00338
00345 class ZStrimW_NativeUTF32 : public ZStrimW
00346 {
00347 public:
00348 virtual void Imp_WriteUTF32(const UTF32* iSource, size_t iCountCU, size_t* oCountCU) = 0;
00349 virtual void Imp_WriteUTF16(const UTF16* iSource, size_t iCountCU, size_t* oCountCU);
00350 virtual void Imp_WriteUTF8(const UTF8* iSource, size_t iCountCU, size_t* oCountCU);
00351 };
00352
00353
00354 #pragma mark -
00355 #pragma mark * ZStrimW_NativeUTF16
00356
00363 class ZStrimW_NativeUTF16 : public ZStrimW
00364 {
00365 public:
00366 virtual void Imp_WriteUTF32(const UTF32* iSource, size_t iCountCU, size_t* oCountCU);
00367 virtual void Imp_WriteUTF16(const UTF16* iSource, size_t iCountCU, size_t* oCountCU) = 0;
00368 virtual void Imp_WriteUTF8(const UTF8* iSource, size_t iCountCU, size_t* oCountCU);
00369 };
00370
00371
00372 #pragma mark -
00373 #pragma mark * ZStrimW_NativeUTF8
00374
00381 class ZStrimW_NativeUTF8 : public ZStrimW
00382 {
00383 public:
00384 virtual void Imp_WriteUTF32(const UTF32* iSource, size_t iCountCU, size_t* oCountCU);
00385 virtual void Imp_WriteUTF16(const UTF16* iSource, size_t iCountCU, size_t* oCountCU);
00386 virtual void Imp_WriteUTF8(const UTF8* iSource, size_t iCountCU, size_t* oCountCU) = 0;
00387 };
00388
00389
00390 #pragma mark -
00391 #pragma mark * ZStrimR_Null
00392
00394
00395 class ZStrimR_Null : public ZStrimR
00396 {
00397 public:
00398 virtual void Imp_ReadUTF32(UTF32* iDest, size_t iCount, size_t* oCount);
00399
00400 virtual void Imp_ReadUTF16(UTF16* iDest,
00401 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00402
00403 virtual void Imp_ReadUTF8(UTF8* iDest,
00404 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00405
00406 virtual void Imp_CopyToDispatch(const ZStrimW& iStrimW,
00407 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00408
00409 virtual void Imp_CopyTo(const ZStrimW& iStrimW,
00410 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00411
00412 virtual void Imp_Skip(size_t iCountCP, size_t* oCountCPSkipped);
00413 };
00414
00415
00416 #pragma mark -
00417 #pragma mark * ZStrimW_Null
00418
00420
00421 class ZStrimW_Null : public ZStrimW
00422 {
00423 public:
00424 virtual void Imp_WriteUTF32(const UTF32* iSource, size_t iCountCU, size_t* oCountCU);
00425 virtual void Imp_WriteUTF16(const UTF16* iSource, size_t iCountCU, size_t* oCountCU);
00426 virtual void Imp_WriteUTF8(const UTF8* iSource, size_t iCountCU, size_t* oCountCU);
00427
00428 virtual void Imp_CopyFromDispatch(const ZStrimR& iStrimR,
00429 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00430
00431 virtual void Imp_CopyFrom(const ZStrimR& iStrimR,
00432 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00433 };
00434
00435 typedef ZStrimW_Null ZStrimW_Sink;
00436
00437
00438 #pragma mark -
00439 #pragma mark * ZStrimU_Unreader
00440
00442
00443 class ZStrimU_Unreader : public ZStrimU
00444 {
00445 public:
00446 ZStrimU_Unreader(const ZStrimR& iStrimSource);
00447
00448
00449 virtual void Imp_ReadUTF32(UTF32* iDest, size_t iCount, size_t* oCount);
00450
00451 virtual void Imp_ReadUTF16(UTF16* iDest,
00452 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00453
00454 virtual void Imp_ReadUTF8(UTF8* iDest,
00455 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00456
00457
00458 virtual void Imp_Unread();
00459
00460 private:
00461 const ZStrimR& fStrimSource;
00462 enum { eStateFresh, eStateNormal, eStateUnread, eStateHitEnd } fState;
00463 UTF32 fCP;
00464 };
00465
00466
00467 #pragma mark -
00468 #pragma mark * ZStrimU_String8
00469
00471
00472 class ZStrimU_String8 : public ZStrimU
00473 {
00474 public:
00475 ZStrimU_String8(const string8& iString);
00476 ~ZStrimU_String8();
00477
00478
00479 virtual void Imp_ReadUTF32(UTF32* iDest, size_t iCount, size_t* oCount);
00480
00481 virtual void Imp_ReadUTF16(UTF16* iDest,
00482 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00483
00484 virtual void Imp_ReadUTF8(UTF8* iDest,
00485 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00486
00487
00488 virtual void Imp_Unread();
00489
00490 private:
00491 string8 fString;
00492 size_t fPosition;
00493 };
00494
00495 typedef ZStrimU_String8 ZStrimU_String;
00496
00497
00498 #pragma mark -
00499 #pragma mark * ZStrimU_String
00500
00502
00503 class ZStrimU_String32 : public ZStrimU
00504 {
00505 public:
00506 ZStrimU_String32(const string32& iString);
00507 ~ZStrimU_String32();
00508
00509
00510 virtual void Imp_ReadUTF32(UTF32* iDest, size_t iCount, size_t* oCount);
00511
00512 virtual void Imp_ReadUTF16(UTF16* iDest,
00513 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00514
00515 virtual void Imp_ReadUTF8(UTF8* iDest,
00516 size_t iCountCU, size_t* oCountCU, size_t iCountCP, size_t* oCountCP);
00517
00518
00519 virtual void Imp_Unread();
00520
00521 private:
00522 string32 fString;
00523 size_t fPosition;
00524 };
00525
00526
00527 #pragma mark -
00528 #pragma mark * ZStrimW_String
00529
00531
00532 class ZStrimW_String : public ZStrimW_NativeUTF8
00533 {
00534 public:
00535 ZStrimW_String(string8& iString);
00536 ~ZStrimW_String();
00537
00538 virtual void Imp_WriteUTF8(const UTF8* iSource, size_t iCountCU, size_t* oCountCU);
00539
00540 private:
00541 string8& fString;
00542 };
00543
00544
00545 #pragma mark -
00546 #pragma mark * ZStrimW_Indirect
00547
00548 class ZStrimW_Indirect : public ZStrimW
00549 {
00550 public:
00551 ZStrimW_Indirect();
00552 ZStrimW_Indirect(const ZStrimW& iStrimW);
00553 ~ZStrimW_Indirect();
00554
00555
00556 virtual void Imp_WriteUTF32(const UTF32* iSource, size_t iCountCU, size_t* oCountCU);
00557 virtual void Imp_WriteUTF16(const UTF16* iSource, size_t iCountCU, size_t* oCountCU);
00558 virtual void Imp_WriteUTF8(const UTF8* iSource, size_t iCountCU, size_t* oCountCU);
00559
00560 virtual void Imp_CopyFromDispatch(const ZStrimR& iStrimR,
00561 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00562
00563 virtual void Imp_CopyFrom(const ZStrimR& iStrimR,
00564 size_t iCountCP, size_t* oCountCPRead, size_t* oCountCPWritten);
00565
00566 virtual void Imp_Flush();
00567
00568
00569 void SetSink(const ZStrimW& iStrimW);
00570 void SetSink(const ZStrimW* iStrimW);
00571
00572 private:
00573 const ZStrimW* fSink;
00574 };
00575
00576 #endif // __ZStrim__