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