x86_2.h 2.7 KB

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