annotate src/win32/7zip/7z/CPP/7zip/Compress/Bcj2Coder.h @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 // Bcj2Coder.h
rlm@1 2
rlm@1 3 #ifndef __COMPRESS_BCJ2_CODER_H
rlm@1 4 #define __COMPRESS_BCJ2_CODER_H
rlm@1 5
rlm@1 6 #include "../../Common/MyCom.h"
rlm@1 7
rlm@1 8 #include "../ICoder.h"
rlm@1 9
rlm@1 10 #include "RangeCoderBit.h"
rlm@1 11
rlm@1 12 namespace NCompress {
rlm@1 13 namespace NBcj2 {
rlm@1 14
rlm@1 15 const int kNumMoveBits = 5;
rlm@1 16
rlm@1 17 #ifndef EXTRACT_ONLY
rlm@1 18
rlm@1 19 class CEncoder:
rlm@1 20 public ICompressCoder2,
rlm@1 21 public CMyUnknownImp
rlm@1 22 {
rlm@1 23 Byte *_buffer;
rlm@1 24 public:
rlm@1 25 CEncoder(): _buffer(0) {};
rlm@1 26 ~CEncoder();
rlm@1 27 bool Create();
rlm@1 28
rlm@1 29 COutBuffer _mainStream;
rlm@1 30 COutBuffer _callStream;
rlm@1 31 COutBuffer _jumpStream;
rlm@1 32 NCompress::NRangeCoder::CEncoder _rangeEncoder;
rlm@1 33 NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusEncoder[256 + 2];
rlm@1 34
rlm@1 35 HRESULT Flush();
rlm@1 36 void ReleaseStreams()
rlm@1 37 {
rlm@1 38 _mainStream.ReleaseStream();
rlm@1 39 _callStream.ReleaseStream();
rlm@1 40 _jumpStream.ReleaseStream();
rlm@1 41 _rangeEncoder.ReleaseStream();
rlm@1 42 }
rlm@1 43
rlm@1 44 class CCoderReleaser
rlm@1 45 {
rlm@1 46 CEncoder *_coder;
rlm@1 47 public:
rlm@1 48 CCoderReleaser(CEncoder *coder): _coder(coder) {}
rlm@1 49 ~CCoderReleaser() { _coder->ReleaseStreams(); }
rlm@1 50 };
rlm@1 51
rlm@1 52 public:
rlm@1 53
rlm@1 54 MY_UNKNOWN_IMP
rlm@1 55
rlm@1 56 HRESULT CodeReal(ISequentialInStream **inStreams,
rlm@1 57 const UInt64 **inSizes,
rlm@1 58 UInt32 numInStreams,
rlm@1 59 ISequentialOutStream **outStreams,
rlm@1 60 const UInt64 **outSizes,
rlm@1 61 UInt32 numOutStreams,
rlm@1 62 ICompressProgressInfo *progress);
rlm@1 63 STDMETHOD(Code)(ISequentialInStream **inStreams,
rlm@1 64 const UInt64 **inSizes,
rlm@1 65 UInt32 numInStreams,
rlm@1 66 ISequentialOutStream **outStreams,
rlm@1 67 const UInt64 **outSizes,
rlm@1 68 UInt32 numOutStreams,
rlm@1 69 ICompressProgressInfo *progress);
rlm@1 70 };
rlm@1 71
rlm@1 72 #endif
rlm@1 73
rlm@1 74 class CDecoder:
rlm@1 75 public ICompressCoder2,
rlm@1 76 public CMyUnknownImp
rlm@1 77 {
rlm@1 78 public:
rlm@1 79 CInBuffer _mainInStream;
rlm@1 80 CInBuffer _callStream;
rlm@1 81 CInBuffer _jumpStream;
rlm@1 82 NCompress::NRangeCoder::CDecoder _rangeDecoder;
rlm@1 83 NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusDecoder[256 + 2];
rlm@1 84
rlm@1 85 COutBuffer _outStream;
rlm@1 86
rlm@1 87 void ReleaseStreams()
rlm@1 88 {
rlm@1 89 _mainInStream.ReleaseStream();
rlm@1 90 _callStream.ReleaseStream();
rlm@1 91 _jumpStream.ReleaseStream();
rlm@1 92 _rangeDecoder.ReleaseStream();
rlm@1 93 _outStream.ReleaseStream();
rlm@1 94 }
rlm@1 95
rlm@1 96 HRESULT Flush() { return _outStream.Flush(); }
rlm@1 97 class CCoderReleaser
rlm@1 98 {
rlm@1 99 CDecoder *_coder;
rlm@1 100 public:
rlm@1 101 CCoderReleaser(CDecoder *coder): _coder(coder) {}
rlm@1 102 ~CCoderReleaser() { _coder->ReleaseStreams(); }
rlm@1 103 };
rlm@1 104
rlm@1 105 public:
rlm@1 106 MY_UNKNOWN_IMP
rlm@1 107 HRESULT CodeReal(ISequentialInStream **inStreams,
rlm@1 108 const UInt64 **inSizes,
rlm@1 109 UInt32 numInStreams,
rlm@1 110 ISequentialOutStream **outStreams,
rlm@1 111 const UInt64 **outSizes,
rlm@1 112 UInt32 numOutStreams,
rlm@1 113 ICompressProgressInfo *progress);
rlm@1 114 STDMETHOD(Code)(ISequentialInStream **inStreams,
rlm@1 115 const UInt64 **inSizes,
rlm@1 116 UInt32 numInStreams,
rlm@1 117 ISequentialOutStream **outStreams,
rlm@1 118 const UInt64 **outSizes,
rlm@1 119 UInt32 numOutStreams,
rlm@1 120 ICompressProgressInfo *progress);
rlm@1 121 };
rlm@1 122
rlm@1 123 }}
rlm@1 124
rlm@1 125 #endif