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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: stream.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:39:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef UTIL_COMPRESS__STREAM__HPP
  10. #define UTIL_COMPRESS__STREAM__HPP
  11. /*  $Id: stream.hpp,v 1000.3 2004/06/01 19:39:22 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Vladimir Ivanov
  37.  *
  38.  * File Description:  CCompression based C++ I/O streams
  39.  *
  40.  */
  41. #include <util/compress/compress.hpp>
  42. /** @addtogroup CompressionStreams
  43.  *
  44.  * @{
  45.  */
  46. BEGIN_NCBI_SCOPE
  47. //////////////////////////////////////////////////////////////////////////////
  48. //
  49. // CCompression based stream classes
  50. //
  51. //////////////////////////////////////////////////////////////////////////////
  52. //
  53. // All CCompression based streams uses a "stream processors" that works as
  54. // adapters between current stream's I/O interface and a some other stream,
  55. // specified in the constructor. Any stream processor can implement either
  56. // compression or decompression.
  57. // On reading from stream, data will be readed from underlying stream,
  58. // processed by "read stream processor", and next processed data will be
  59. // carried to called process.
  60. // Also, all data written into CCompression[IO]Stream stream will be processed
  61. // using "write stream processor" and further written into underlying stream. 
  62. // 
  63. // Note:
  64. //   Notice that generally the input/output stream you pass to
  65. //   CCompression[IO]Stream class constructor must be in binary mode, because
  66. //   the compressed data always is binary (decompressed data also can be
  67. //   binary) and the conversions which happen in text mode will corrupt it.
  68. //
  69. // Note:
  70. //   CCompression[IO]Stream class objects must be finalized after use.
  71. //   Only after finalization all data putted into stream will be processed
  72. //   for sure. By default finalization called in the class destructor, however
  73. //   it can be done in any time by call Finalize(). After finalization you
  74. //   can only read from the stream (if it is derived from istream).
  75. //
  76. // Note:
  77. //   There is one special aspect of CCompression[I]OStream class. Basically
  78. //   the compression algorithms works on blocks of data. They waits until
  79. //   a block is full and then compresses it. As long as you only feed data
  80. //   to the stream without flushing it this works normally. If you flush
  81. //   the stream, you force a premature end of the data block. This will cause
  82. //   a worse compression factor. You should avoid flushing a output buffer.
  83. //
  84. //   Accordingly, the using input stream with compression usualy have worse
  85. //   compression than output stream with compression. Because a stream needs
  86. //   to flush data from compressor very often. Increasing compressor buffer
  87. //   size can to amend this situation.
  88. //
  89. // Forward declaration
  90. class CCompressionStreamProcessor;
  91. //////////////////////////////////////////////////////////////////////////////
  92. //
  93. // CCompressionStream - base stream class
  94. //
  95. class NCBI_XUTIL_EXPORT CCompressionStream : virtual public CNcbiIos
  96. {
  97. public:
  98.     /// Stream processing direction.
  99.     enum EDirection {
  100.         eRead,                      // reading from stream
  101.         eWrite,                     // writing into stream
  102.         eReadWrite                  // eRead + eWrite
  103.     };
  104.     /// Which of the objects (passed in the constructor) should be
  105.     /// deleted on this object's destruction.
  106.     /// NOTE:  if the reader and writer are in fact one object, it will
  107.     ///        not be deleted twice.
  108.     enum EOwnership {
  109.         fOwnStream = (1<<1),        // delete the underlying I/O stream
  110.         fOwnReader = (1<<2),        // delete the reader
  111.         fOwnWriter = (1<<3),        // delete the writer
  112.         fOwnProcessor = fOwnReader + fOwnWriter,
  113.         fOwnAll       = fOwnStream + fOwnProcessor
  114.     };
  115.     typedef int TOwnership;         // bitwise OR of EOwnership
  116.     /// Constructor
  117.     ///
  118.     /// If read/write stream processor is 0, that read/write operation
  119.     /// on this stream will be unsuccessful.
  120.     CCompressionStream(CNcbiIos&                    stream,
  121.                        CCompressionStreamProcessor* read_sp,
  122.                        CCompressionStreamProcessor* write_sp,
  123.                        TOwnership                   ownership = 0);
  124.     /// Destructor
  125.     virtual ~CCompressionStream(void);
  126.     // Finalize stream's compression/decompression process for read/write.
  127.     // This function just calls a streambuf Finalize().
  128.     virtual void Finalize(CCompressionStream::EDirection dir =
  129.                           CCompressionStream::eReadWrite);
  130. protected:
  131.     // Return number of processed/output bytes.
  132.     unsigned long x_GetProcessedSize(CCompressionStream::EDirection dir);
  133.     unsigned long x_GetOutputSize(CCompressionStream::EDirection dir);
  134. protected:
  135.     CNcbiIos*                    m_Stream;    // underlying stream
  136.     CCompressionStreambuf*       m_StreamBuf; // stream buffer
  137.     CCompressionStreamProcessor* m_Reader;    // read processor
  138.     CCompressionStreamProcessor* m_Writer;    // write processor
  139.     TOwnership                   m_Ownership; // bitwise OR of EOwnership
  140. };
  141. //////////////////////////////////////////////////////////////////////////////
  142. //
  143. // CCompressionStreamProcessor class
  144. //
  145. // Container class for storing a stream's processor read/write info.
  146. //
  147. class NCBI_XUTIL_EXPORT CCompressionStreamProcessor
  148. {
  149. public:
  150.     // If to delete the used compression processor in the destructor
  151.     enum EDeleteProcessor {
  152.         eDelete,            // do      delete processor object 
  153.         eNoDelete           // do  not delete processor object
  154.     };
  155.     // 'ctors
  156.     CCompressionStreamProcessor(
  157.         CCompressionProcessor* processor,
  158.         EDeleteProcessor       need_delete  = eNoDelete,
  159.         streamsize             in_bufsize   = kCompressionDefaultBufSize,
  160.         streamsize             out_bufsize  = kCompressionDefaultBufSize
  161.     );
  162.     virtual ~CCompressionStreamProcessor(void);
  163. private:
  164.     CCompressionProcessor* m_Processor;   // Compression/decompr processor
  165.     CT_CHAR_TYPE*          m_InBuf;       // Buffer of unprocessed data
  166.     streamsize             m_InBufSize;   // Unprocessed data buffer size
  167.     CT_CHAR_TYPE*          m_OutBuf;      // Buffer of processed data
  168.     streamsize             m_OutBufSize;  // Processed data buffer size 
  169.     streamsize             m_LastOutAvail;// The size of last data received
  170.                                           // from compression processor
  171.     CT_CHAR_TYPE*          m_Begin;       // Begin and end of the pre/post
  172.     CT_CHAR_TYPE*          m_End;         // processed data in the read/write
  173.                                           // buffer
  174.     EDeleteProcessor       m_NeedDelete;  // m_Processor auto-deleting flag
  175.     CCompressionProcessor::EStatus
  176.                            m_LastStatus;  // Last compressor status
  177.     bool                   m_Finalized;   // True if a Finalize() already done
  178.                                           // for compression processor  
  179.     // Friend classes
  180.     friend class CCompressionStream;
  181.     friend class CCompressionStreambuf;
  182. };
  183. //////////////////////////////////////////////////////////////////////////////
  184. //
  185. // I/O stream classes
  186. //
  187. class NCBI_XUTIL_EXPORT CCompressionIStream : public istream,
  188.                                               public CCompressionStream
  189. {
  190. public:
  191.     CCompressionIStream(CNcbiIos&                    stream,
  192.                         CCompressionStreamProcessor* stream_processor,
  193.                         TOwnership                   ownership = 0)
  194.         : istream(0),
  195.           CCompressionStream(stream, stream_processor, 0, ownership)
  196.     {}
  197.     
  198.     // Return number of processed/output bytes.
  199.     unsigned long GetProcessedSize(void) {
  200.         return CCompressionStream::x_GetProcessedSize(eRead);
  201.     };
  202.     unsigned long GetOutputSize(void) {
  203.         return CCompressionStream::x_GetOutputSize(eRead);
  204.     };
  205. };
  206. class NCBI_XUTIL_EXPORT CCompressionOStream : public ostream,
  207.                                               public CCompressionStream
  208. {
  209. public:
  210.     CCompressionOStream(CNcbiIos&                    stream,
  211.                         CCompressionStreamProcessor* stream_processor,
  212.                         TOwnership                   ownership = 0)
  213.         : ostream(0),
  214.           CCompressionStream(stream, 0, stream_processor, ownership)
  215.     {}
  216.     // Return number of processed/output bytes.
  217.     unsigned long GetProcessedSize(void) {
  218.         return CCompressionStream::x_GetProcessedSize(eWrite);
  219.     };
  220.     unsigned long GetOutputSize(void) {
  221.         return CCompressionStream::x_GetOutputSize(eWrite);
  222.     };
  223. };
  224. class NCBI_XUTIL_EXPORT CCompressionIOStream : public iostream,
  225.                                                public CCompressionStream
  226. {
  227. public:
  228.     CCompressionIOStream(CNcbiIos&                    stream,
  229.                          CCompressionStreamProcessor* read_sp,
  230.                          CCompressionStreamProcessor* write_sp,
  231.                          TOwnership                   ownership = 0)
  232.         : iostream(0),
  233.           CCompressionStream(stream, read_sp, write_sp, ownership)
  234.     { }
  235.     // Return number of processed/output bytes.
  236.     unsigned long GetProcessedSize(CCompressionStream::EDirection dir) {
  237.         return CCompressionStream::x_GetProcessedSize(dir);
  238.     };
  239.     unsigned long GetOutputSize(CCompressionStream::EDirection dir) {
  240.         return CCompressionStream::x_GetOutputSize(dir);
  241.     };
  242. };
  243. END_NCBI_SCOPE
  244. /* @} */
  245. /*
  246.  * ===========================================================================
  247.  * $Log: stream.hpp,v $
  248.  * Revision 1000.3  2004/06/01 19:39:22  gouriano
  249.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  250.  *
  251.  * Revision 1.9  2004/05/10 11:56:24  ivanov
  252.  * Added gzip file format support
  253.  *
  254.  * Revision 1.8  2004/04/09 11:48:56  ivanov
  255.  * Added ownership parameter for automaticaly destruction underlying stream
  256.  * and read/write compression processors.
  257.  *
  258.  * Revision 1.7  2004/01/20 20:34:31  lavr
  259.  * One empty line added (separator)
  260.  *
  261.  * Revision 1.6  2003/07/10 16:17:48  ivanov
  262.  * Moved kCompressionDefaultBufSize definition to compress.hpp
  263.  *
  264.  * Revision 1.5  2003/06/17 15:49:32  ivanov
  265.  * The second Compression API redesign. Replaced all standalone compression-
  266.  * decompression I/O classes with unified CCompression[I/O]Stream classes.
  267.  * Added CCompressionStreamProcessor base class. Some comments rearrangement.
  268.  *
  269.  * Revision 1.4  2003/06/04 12:42:01  ucko
  270.  * Use our NcbiIos typedef for portability to old iostream implementations.
  271.  *
  272.  * Revision 1.3  2003/06/03 20:09:54  ivanov
  273.  * The Compression API redesign. Added some new classes, rewritten old.
  274.  *
  275.  * Revision 1.2  2003/04/11 19:57:25  ivanov
  276.  * Move streambuf.hpp from 'include/...' to 'src/...'
  277.  *
  278.  * Revision 1.1  2003/04/07 20:42:11  ivanov
  279.  * Initial revision
  280.  *
  281.  * ===========================================================================
  282.  */
  283. #endif  /* UTIL_COMPRESS__STREAM__HPP */