bytesrc.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:21k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bytesrc.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:39:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bytesrc.cpp,v 1000.3 2004/06/01 19:39:53 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Eugene Vasilchenko
  35.  *
  36.  * File Description:
  37.  *   Implementation of CByteSource and CByteSourceReader
  38.  *   and their specializations'.
  39.  *
  40.  */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbistd.hpp>
  43. #include <util/bytesrc.hpp>
  44. #include <util/util_exception.hpp>
  45. #include <util/stream_utils.hpp>
  46. #include <algorithm>
  47. BEGIN_NCBI_SCOPE
  48. typedef CFileSourceCollector::TFilePos TFilePos;
  49. typedef CFileSourceCollector::TFileOff TFileOff;
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CByteSource
  52. /////////////////////////////////////////////////////////////////////////////
  53. CByteSource::CByteSource(void)
  54. {
  55. }
  56. CByteSource::~CByteSource(void)
  57. {
  58. }
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CByteSourceReader
  61. /////////////////////////////////////////////////////////////////////////////
  62. CByteSourceReader::CByteSourceReader(void)
  63. {
  64. }
  65. CByteSourceReader::~CByteSourceReader(void)
  66. {
  67. }
  68. bool CByteSourceReader::EndOfData(void) const
  69. {
  70.     return true;
  71. }
  72. bool CByteSourceReader::Pushback(const char* /*data*/, size_t size)
  73. {
  74.     if ( size ) {
  75.         ERR_POST("CByteSourceReader::Pushback: "
  76.                  "cannot push back " << size << " bytes");
  77.         return false;
  78.     }
  79.     return true;
  80. }
  81. void CByteSourceReader::Seekg(size_t pos)
  82. {
  83.     NCBI_THROW(CUtilException,eWrongCommand,"CByteSourceReader::Seekg: unable to seek");
  84. }
  85. CRef<CSubSourceCollector>
  86. CByteSourceReader::SubSource(size_t /*prevent*/,
  87.                              CRef<CSubSourceCollector> parent)
  88. {
  89.     return CRef<CSubSourceCollector>(new CMemorySourceCollector(parent));
  90. }
  91. /////////////////////////////////////////////////////////////////////////////
  92. // CSubSourceCollector
  93. /////////////////////////////////////////////////////////////////////////////
  94. CSubSourceCollector::CSubSourceCollector(CRef<CSubSourceCollector> parent)
  95.     : m_ParentSubSource(parent)
  96. {
  97.     return;
  98. }
  99. CSubSourceCollector::~CSubSourceCollector(void)
  100. {
  101.     return;
  102. }
  103. void CSubSourceCollector::AddChunk(const char* buffer, size_t bufferLength)
  104. {
  105.     if ( !m_ParentSubSource.IsNull() ) {
  106.         m_ParentSubSource->AddChunk(buffer,bufferLength);
  107.     }
  108. }
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CStreamByteSource
  111. /////////////////////////////////////////////////////////////////////////////
  112. /* Mac compiler doesn't like getting these flags as unsigned int (thiessen)
  113. static inline
  114. unsigned IFStreamFlags(bool binary)
  115. {
  116.     return binary ? (IOS_BASE::in | IOS_BASE::binary) : IOS_BASE::in;
  117. }
  118. */
  119. #define IFStreamFlags(isBinary) 
  120.   (isBinary? (IOS_BASE::in | IOS_BASE::binary): IOS_BASE::in)
  121. CStreamByteSource::CStreamByteSource(CNcbiIstream& in)
  122.     : m_Stream(&in)
  123. {
  124. }
  125. CStreamByteSource::~CStreamByteSource(void)
  126. {
  127. }
  128. CRef<CByteSourceReader> CStreamByteSource::Open(void)
  129. {
  130.     return CRef<CByteSourceReader>
  131.         (new CStreamByteSourceReader(this, m_Stream));
  132. }
  133. /////////////////////////////////////////////////////////////////////////////
  134. // CStreamByteSourceReader
  135. /////////////////////////////////////////////////////////////////////////////
  136. CStreamByteSourceReader::CStreamByteSourceReader(const CByteSource* source,
  137.                                                  CNcbiIstream* stream)
  138.     : m_Source(source), m_Stream(stream)
  139. {
  140. }
  141. CStreamByteSourceReader::~CStreamByteSourceReader(void)
  142. {
  143. }
  144. size_t CStreamByteSourceReader::Read(char* buffer, size_t bufferLength)
  145. {
  146.     return CStreamUtils::Readsome(*m_Stream, buffer, bufferLength);
  147. }
  148. bool CStreamByteSourceReader::EndOfData(void) const
  149. {
  150.     return m_Stream->eof();
  151. }
  152. bool CStreamByteSourceReader::Pushback(const char* data, size_t size)
  153. {
  154.     CStreamUtils::Pushback(*m_Stream, data, size);
  155.     return true;
  156. }
  157. void CStreamByteSourceReader::Seekg(size_t pos)
  158. {
  159.     m_Stream->seekg(pos);
  160. }
  161. /////////////////////////////////////////////////////////////////////////////
  162. // CIRByteSourceReader
  163. /////////////////////////////////////////////////////////////////////////////
  164. CIRByteSourceReader::CIRByteSourceReader(IReader* reader)
  165.     : m_Reader(reader), m_EOF(false)
  166. {
  167. }
  168. CIRByteSourceReader::~CIRByteSourceReader(void)
  169. {
  170. }
  171. size_t CIRByteSourceReader::Read(char* buffer, size_t bufferLength)
  172. {
  173.     size_t bytes_read;
  174.     m_Reader->Read(buffer, bufferLength, &bytes_read);
  175.     if ( bytes_read < bufferLength ) {
  176.         m_EOF = true;
  177.     }
  178.     return bytes_read;
  179. }
  180. bool CIRByteSourceReader::EndOfData(void) const
  181. {
  182.     return m_EOF;
  183. }
  184. /////////////////////////////////////////////////////////////////////////////
  185. // CFStreamByteSource
  186. /////////////////////////////////////////////////////////////////////////////
  187. CFStreamByteSource::CFStreamByteSource(CNcbiIstream& in)
  188.     : CStreamByteSource(in)
  189. {
  190. }
  191. CFStreamByteSource::CFStreamByteSource(const string& fileName, bool binary)
  192.     : CStreamByteSource(*new CNcbiIfstream(fileName.c_str(),
  193.                                            IFStreamFlags(binary)))
  194. {
  195.     if ( !*m_Stream ) {
  196.         NCBI_THROW(CUtilException,eNoInput,"file not found: " + fileName);
  197.     }
  198. }
  199. CFStreamByteSource::~CFStreamByteSource(void)
  200. {
  201.     delete m_Stream;
  202. }
  203. /////////////////////////////////////////////////////////////////////////////
  204. // CFileByteSource
  205. /////////////////////////////////////////////////////////////////////////////
  206. CFileByteSource::CFileByteSource(const string& fileName, bool binary)
  207.     : m_FileName(fileName), m_Binary(binary)
  208. {
  209.     return;
  210. }
  211. CFileByteSource::CFileByteSource(const CFileByteSource& file)
  212.     : m_FileName(file.m_FileName), m_Binary(file.m_Binary)
  213. {
  214.     return;
  215. }
  216. CFileByteSource::~CFileByteSource(void)
  217. {
  218. }
  219. CRef<CByteSourceReader> CFileByteSource::Open(void)
  220. {
  221.     return CRef<CByteSourceReader>(new CFileByteSourceReader(this));
  222. }
  223. /////////////////////////////////////////////////////////////////////////////
  224. // CSubFileByteSource
  225. /////////////////////////////////////////////////////////////////////////////
  226. CSubFileByteSource::CSubFileByteSource(const CFileByteSource& file,
  227.                                        TFilePos start, TFileOff length)
  228.     : CParent(file), m_Start(start), m_Length(length)
  229. {
  230.     return;
  231. }
  232. CSubFileByteSource::~CSubFileByteSource(void)
  233. {
  234. }
  235. CRef<CByteSourceReader> CSubFileByteSource::Open(void)
  236. {
  237.     return CRef<CByteSourceReader>
  238.         (new CSubFileByteSourceReader(this, m_Start, m_Length));
  239. }
  240. /////////////////////////////////////////////////////////////////////////////
  241. // CFileByteSourceReader
  242. /////////////////////////////////////////////////////////////////////////////
  243. CFileByteSourceReader::CFileByteSourceReader(const CFileByteSource* source)
  244.     : CStreamByteSourceReader(source, 0),
  245.       m_FileSource(source),
  246.       m_FStream(source->GetFileName().c_str(),
  247.                 IFStreamFlags(source->IsBinary()))
  248. {
  249.     if ( !m_FStream ) {
  250. //        THROW1_TRACE(runtime_error, "file not found: " +
  251. //                     source->GetFileName());
  252.         NCBI_THROW(CUtilException,eNoInput,
  253.                    "file not found: " +source->GetFileName());
  254.     }
  255.     m_Stream = &m_FStream;
  256. }
  257. CFileByteSourceReader::~CFileByteSourceReader(void)
  258. {
  259. }
  260. CRef<CSubSourceCollector> 
  261. CFileByteSourceReader::SubSource(size_t prepend, 
  262.                                  CRef<CSubSourceCollector> parent)
  263. {
  264.     return CRef<CSubSourceCollector>(new CFileSourceCollector(m_FileSource,
  265.                                     m_Stream->tellg() - TFileOff(prepend),
  266.                                     parent));
  267. }
  268. /////////////////////////////////////////////////////////////////////////////
  269. // CSubFileByteSourceReader
  270. /////////////////////////////////////////////////////////////////////////////
  271. CSubFileByteSourceReader::CSubFileByteSourceReader(const CFileByteSource* s,
  272.                                                    TFilePos start,
  273.                                                    TFileOff length)
  274.     : CParent(s), m_Length(length)
  275. {
  276.     m_Stream->seekg(start);
  277. }
  278. CSubFileByteSourceReader::~CSubFileByteSourceReader(void)
  279. {
  280. }
  281. size_t CSubFileByteSourceReader::Read(char* buffer, size_t bufferLength)
  282. {
  283.     if ( TFileOff(bufferLength) > m_Length ) {
  284.         bufferLength = size_t(m_Length);
  285.     }
  286.     size_t count = CParent::Read(buffer, bufferLength);
  287.     m_Length -= TFileOff(count);
  288.     return count;
  289. }
  290. bool CSubFileByteSourceReader::EndOfData(void) const
  291. {
  292.     return m_Length == 0;
  293. }
  294. /////////////////////////////////////////////////////////////////////////////
  295. // CFileSourceCollector
  296. /////////////////////////////////////////////////////////////////////////////
  297. CFileSourceCollector::CFileSourceCollector(CConstRef<CFileByteSource> s,
  298.                                            TFilePos start,
  299.                                            CRef<CSubSourceCollector> parent)
  300.     : CSubSourceCollector(parent),
  301.       m_FileSource(s),
  302.       m_Start(start),
  303.       m_Length(0)
  304. {
  305. }
  306. CFileSourceCollector::~CFileSourceCollector(void)
  307. {
  308. }
  309. void CFileSourceCollector::AddChunk(const char* buffer,
  310.                                     size_t bufferLength)
  311. {
  312.     CSubSourceCollector::AddChunk(buffer, bufferLength);
  313.     m_Length += TFileOff(bufferLength);
  314. }
  315. CRef<CByteSource> CFileSourceCollector::GetSource(void)
  316. {
  317.     return CRef<CByteSource>(new CSubFileByteSource(*m_FileSource,
  318.                                   m_Start, m_Length));
  319. }
  320. /////////////////////////////////////////////////////////////////////////////
  321. // CMemoryChunk
  322. /////////////////////////////////////////////////////////////////////////////
  323. CMemoryChunk::CMemoryChunk(const char* data, size_t dataSize,
  324.                            CRef<CMemoryChunk> prevChunk)
  325.     : m_Data(new char[dataSize]),
  326.       m_DataSize(dataSize)
  327. {
  328.     memcpy(m_Data, data, dataSize);
  329.     if ( prevChunk ) {
  330.         prevChunk->m_NextChunk = this;
  331.     }
  332.     prevChunk = this;
  333. }
  334. CMemoryChunk::~CMemoryChunk(void)
  335. {
  336.     delete m_Data;
  337. }
  338. /////////////////////////////////////////////////////////////////////////////
  339. // CMemoryByteSource
  340. /////////////////////////////////////////////////////////////////////////////
  341. CMemoryByteSource::CMemoryByteSource(CConstRef<CMemoryChunk> bytes)
  342.     : m_Bytes(bytes)
  343. {
  344. }
  345. CMemoryByteSource::~CMemoryByteSource(void)
  346. {
  347. }
  348. CRef<CByteSourceReader> CMemoryByteSource::Open(void)
  349. {
  350.     return CRef<CByteSourceReader>(new CMemoryByteSourceReader(m_Bytes));
  351. }
  352. /////////////////////////////////////////////////////////////////////////////
  353. // CMemoryByteSourceReader
  354. /////////////////////////////////////////////////////////////////////////////
  355. CMemoryByteSourceReader::CMemoryByteSourceReader(CConstRef<CMemoryChunk> bytes)
  356.     : m_CurrentChunk(bytes), m_CurrentChunkOffset(0)
  357. {
  358. }
  359. CMemoryByteSourceReader::~CMemoryByteSourceReader(void)
  360. {
  361. }
  362. size_t CMemoryByteSourceReader::GetCurrentChunkAvailable(void) const
  363. {
  364.     return m_CurrentChunk->GetDataSize() - m_CurrentChunkOffset;
  365. }
  366. size_t CMemoryByteSourceReader::Read(char* buffer, size_t bufferLength)
  367. {
  368.     while ( m_CurrentChunk ) {
  369.         size_t avail = GetCurrentChunkAvailable();
  370.         if ( avail == 0 ) {
  371.             // End of current chunk
  372.             CConstRef<CMemoryChunk> rest = m_CurrentChunk->GetNextChunk();
  373.             m_CurrentChunk = rest;
  374.             m_CurrentChunkOffset = 0;
  375.         }
  376.         else {
  377.             size_t c = min(bufferLength, avail);
  378.             memcpy(buffer, m_CurrentChunk->GetData(m_CurrentChunkOffset), c);
  379.             m_CurrentChunkOffset += c;
  380.             return c;
  381.         }
  382.     }
  383.     return 0;
  384. }
  385. bool CMemoryByteSourceReader::EndOfData(void) const
  386. {
  387.     return !m_CurrentChunk;
  388. }
  389. /////////////////////////////////////////////////////////////////////////////
  390. // CMemorySourceCollector
  391. /////////////////////////////////////////////////////////////////////////////
  392. CMemorySourceCollector::CMemorySourceCollector(CRef<CSubSourceCollector>
  393.                                                parent)
  394.     : CSubSourceCollector(parent)
  395. {
  396. }
  397. CMemorySourceCollector::~CMemorySourceCollector(void)
  398. {
  399. }
  400. void CMemorySourceCollector::AddChunk(const char* buffer,
  401.                                       size_t bufferLength)
  402. {
  403.     CSubSourceCollector::AddChunk(buffer, bufferLength);
  404.     m_LastChunk = new CMemoryChunk(buffer, bufferLength, m_LastChunk);
  405.     if ( !m_FirstChunk ) {
  406.         m_FirstChunk = m_LastChunk;
  407.     }
  408. }
  409. CRef<CByteSource> CMemorySourceCollector::GetSource(void)
  410. {
  411.     return CRef<CByteSource>(new CMemoryByteSource(m_FirstChunk));
  412. }
  413. /////////////////////////////////////////////////////////////////////////////
  414. // CWriterSourceCollector
  415. /////////////////////////////////////////////////////////////////////////////
  416. CWriterSourceCollector::CWriterSourceCollector(IWriter*    writer, 
  417.                                                EOwnership  own, 
  418.                                        CRef<CSubSourceCollector>  parent)
  419.     : CSubSourceCollector(parent),
  420.       m_Writer(writer),
  421.       m_Own(own)
  422. {
  423.     return;
  424. }
  425. CWriterSourceCollector::~CWriterSourceCollector()
  426. {
  427.     if ( m_Own ) {
  428.         delete m_Writer;
  429.     }
  430. }
  431. void CWriterSourceCollector::SetWriter(IWriter*   writer, 
  432.                                        EOwnership own)
  433. {
  434.     if ( m_Own ) {
  435.         delete m_Writer;
  436.     }
  437.     m_Writer = writer;
  438.     m_Own = own;    
  439. }
  440. void CWriterSourceCollector::AddChunk(const char* buffer, size_t bufferLength)
  441. {
  442.     size_t written;
  443.     m_Writer->Write(buffer, bufferLength, &written);
  444. }
  445. CRef<CByteSource> CWriterSourceCollector::GetSource(void)
  446. {
  447.     // Return NULL byte source, this happens because we cannot derive
  448.     // any readers from IWriter (one way interface)
  449.     return CRef<CByteSource>();
  450. }
  451. /////////////////////////////////////////////////////////////////////////////
  452. // CWriterByteSourceReader
  453. /////////////////////////////////////////////////////////////////////////////
  454. CWriterByteSourceReader::CWriterByteSourceReader(CNcbiIstream* stream,
  455.                                                  IWriter* writer)
  456.     : CStreamByteSourceReader(0 /* CByteSource* */, stream),
  457.       m_Writer(writer)
  458. {
  459.     _ASSERT(writer);
  460. }
  461. CWriterByteSourceReader::~CWriterByteSourceReader(void)
  462. {
  463. }
  464. CRef<CSubSourceCollector> 
  465. CWriterByteSourceReader::SubSource(size_t /*prepend*/,
  466.                                    CRef<CSubSourceCollector> parent)
  467. {
  468.     return 
  469.         CRef<CSubSourceCollector>(
  470.             new CWriterSourceCollector(m_Writer, eNoOwnership, parent));
  471. }
  472. /////////////////////////////////////////////////////////////////////////////
  473. // CWriterCopyByteSourceReader
  474. /////////////////////////////////////////////////////////////////////////////
  475. CWriterCopyByteSourceReader::CWriterCopyByteSourceReader(CByteSourceReader* reader, IWriter* writer)
  476.     : m_Reader(reader),
  477.       m_Writer(writer)
  478. {
  479.     _ASSERT(reader);
  480.     _ASSERT(writer);
  481. }
  482. CWriterCopyByteSourceReader::~CWriterCopyByteSourceReader(void)
  483. {
  484. }
  485. size_t CWriterCopyByteSourceReader::Read(char* buffer, size_t bufferLength)
  486. {
  487.     return m_Reader->Read(buffer, bufferLength);
  488. }
  489. bool CWriterCopyByteSourceReader::EndOfData(void) const
  490. {
  491.     return m_Reader->EndOfData();
  492. }
  493. CRef<CSubSourceCollector>
  494. CWriterCopyByteSourceReader::SubSource(size_t /*prepend*/,
  495.                                        CRef<CSubSourceCollector> parent)
  496. {
  497.     return 
  498.         CRef<CSubSourceCollector>(
  499.             new CWriterSourceCollector(m_Writer, eNoOwnership, parent));
  500. }
  501. END_NCBI_SCOPE
  502. /*
  503.  * ===========================================================================
  504.  * $Log: bytesrc.cpp,v $
  505.  * Revision 1000.3  2004/06/01 19:39:53  gouriano
  506.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33
  507.  *
  508.  * Revision 1.33  2004/05/17 21:06:02  gorelenk
  509.  * Added include of PCH ncbi_pch.hpp
  510.  *
  511.  * Revision 1.32  2003/12/31 20:51:33  gouriano
  512.  * added possibility to seek (when possible) in CByteSourceReader
  513.  *
  514.  * Revision 1.31  2003/11/19 15:40:09  vasilche
  515.  * Added possibility to pushback data to CByteSourceReader.
  516.  *
  517.  * Revision 1.30  2003/10/20 21:18:18  ivanov
  518.  * Get rid of compilation warning
  519.  *
  520.  * Revision 1.29  2003/10/14 18:28:33  vasilche
  521.  * Added full set of explicit constructors/destructors to all readers and sources.
  522.  * Added CWriterCopyByteSourceReader for copying data from another reader object.
  523.  *
  524.  * Revision 1.28  2003/10/01 21:14:55  ivanov
  525.  * Formal code rearrangement
  526.  *
  527.  * Revision 1.27  2003/10/01 19:27:57  kuznets
  528.  * Fixed compilation bug with CIRByteSourceReader::m_EOF
  529.  *
  530.  * Revision 1.26  2003/10/01 18:45:33  kuznets
  531.  * +CIRByteSourceReader
  532.  *
  533.  * Revision 1.25  2003/09/30 20:37:54  kuznets
  534.  * Class names clean up (Removed I from CI prefix for classes based in
  535.  * interfaces)
  536.  *
  537.  * Revision 1.24  2003/09/30 20:24:03  kuznets
  538.  * +CIWriterByteSourceReader
  539.  *
  540.  * Revision 1.23  2003/09/30 20:08:02  kuznets
  541.  * +CStreamRedirectByteSourceReader implementation
  542.  *
  543.  * Revision 1.22  2003/09/25 16:38:03  kuznets
  544.  * + IWriter based sub source collector
  545.  *
  546.  * Revision 1.21  2003/09/25 13:59:40  ucko
  547.  * Pass C(Const)Ref by value, not reference!
  548.  *
  549.  * Revision 1.20  2003/09/25 12:47:36  kuznets
  550.  * Added subsource chaining
  551.  *
  552.  * Revision 1.19  2003/02/26 21:32:00  gouriano
  553.  * modify C++ exceptions thrown by this library
  554.  *
  555.  * Revision 1.18  2002/11/27 21:08:52  lavr
  556.  * Take advantage of CStreamUtils::Readsome() in CStreamByteSource::Read()
  557.  *
  558.  * Revision 1.17  2002/11/04 21:29:22  grichenk
  559.  * Fixed usage of const CRef<> and CRef<> constructor
  560.  *
  561.  * Revision 1.16  2002/01/17 17:57:14  vakatov
  562.  * [GCC > 3.0]  CStreamByteSourceReader::Read() -- use "readsome()", thus
  563.  * avoid blocking on timeout at EOF for non-blocking input stream.
  564.  *
  565.  * Revision 1.15  2001/08/15 18:43:34  lavr
  566.  * FIXED CStreamByteSourceReader::Read:
  567.  * ios::clear() has to have no arguments in order to clear EOF state.
  568.  *
  569.  * Revision 1.14  2001/05/30 19:55:35  grichenk
  570.  * Fixed one more non-blocking stream reading bug, added comments
  571.  *
  572.  * Revision 1.13  2001/05/29 19:35:23  grichenk
  573.  * Fixed non-blocking stream reading for GCC
  574.  *
  575.  * Revision 1.12  2001/05/17 15:07:15  lavr
  576.  * Typos corrected
  577.  *
  578.  * Revision 1.11  2001/05/16 17:55:40  grichenk
  579.  * Redesigned support for non-blocking stream read operations
  580.  *
  581.  * Revision 1.10  2001/05/11 20:41:19  grichenk
  582.  * Added support for non-blocking stream reading
  583.  *
  584.  * Revision 1.9  2001/05/11 14:00:21  grichenk
  585.  * CStreamByteSourceReader::Read() -- use readsome() instead of read()
  586.  *
  587.  * Revision 1.8  2001/01/05 20:09:05  vasilche
  588.  * Added util directory for various algorithms and utility classes.
  589.  *
  590.  * Revision 1.7  2000/11/01 20:38:37  vasilche
  591.  * Removed ECanDelete enum and related constructors.
  592.  *
  593.  * Revision 1.6  2000/09/01 13:16:14  vasilche
  594.  * Implemented class/container/choice iterators.
  595.  * Implemented CObjectStreamCopier for copying data without loading into memory
  596.  *
  597.  * Revision 1.5  2000/07/03 18:42:42  vasilche
  598.  * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  599.  * Reduced header dependency.
  600.  *
  601.  * Revision 1.4  2000/06/22 16:13:48  thiessen
  602.  * change IFStreamFlags to macro
  603.  *
  604.  * Revision 1.3  2000/05/03 14:38:13  vasilche
  605.  * SERIAL: added support for delayed reading to generated classes.
  606.  * DATATOOL: added code generation for delayed reading.
  607.  *
  608.  * Revision 1.2  2000/04/28 19:14:37  vasilche
  609.  * Fixed stream position and offset typedefs.
  610.  *
  611.  * Revision 1.1  2000/04/28 16:58:11  vasilche
  612.  * Added classes CByteSource and CByteSourceReader for generic reading.
  613.  * Added delayed reading of choice variants.
  614.  *
  615.  * ===========================================================================
  616.  */