Mercurial > vba-linux
view src/win32/7zip/7z/CPP/7zip/Archive/Common/CoderMixer2.h @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
line wrap: on
line source
1 // CoderMixer2.h3 #ifndef __CODER_MIXER2_H4 #define __CODER_MIXER2_H6 #include "../../../Common/MyVector.h"7 #include "../../../Common/Types.h"8 #include "../../../Common/MyCom.h"9 #include "../../ICoder.h"11 namespace NCoderMixer {13 struct CBindPair14 {15 UInt32 InIndex;16 UInt32 OutIndex;17 };19 struct CCoderStreamsInfo20 {21 UInt32 NumInStreams;22 UInt32 NumOutStreams;23 };25 struct CBindInfo26 {27 CRecordVector<CCoderStreamsInfo> Coders;28 CRecordVector<CBindPair> BindPairs;29 CRecordVector<UInt32> InStreams;30 CRecordVector<UInt32> OutStreams;32 void Clear()33 {34 Coders.Clear();35 BindPairs.Clear();36 InStreams.Clear();37 OutStreams.Clear();38 }40 /*41 UInt32 GetCoderStartOutStream(UInt32 coderIndex) const42 {43 UInt32 numOutStreams = 0;44 for (UInt32 i = 0; i < coderIndex; i++)45 numOutStreams += Coders[i].NumOutStreams;46 return numOutStreams;47 }48 */51 void GetNumStreams(UInt32 &numInStreams, UInt32 &numOutStreams) const52 {53 numInStreams = 0;54 numOutStreams = 0;55 for (int i = 0; i < Coders.Size(); i++)56 {57 const CCoderStreamsInfo &coderStreamsInfo = Coders[i];58 numInStreams += coderStreamsInfo.NumInStreams;59 numOutStreams += coderStreamsInfo.NumOutStreams;60 }61 }63 int FindBinderForInStream(UInt32 inStream) const64 {65 for (int i = 0; i < BindPairs.Size(); i++)66 if (BindPairs[i].InIndex == inStream)67 return i;68 return -1;69 }70 int FindBinderForOutStream(UInt32 outStream) const71 {72 for (int i = 0; i < BindPairs.Size(); i++)73 if (BindPairs[i].OutIndex == outStream)74 return i;75 return -1;76 }78 UInt32 GetCoderInStreamIndex(UInt32 coderIndex) const79 {80 UInt32 streamIndex = 0;81 for (UInt32 i = 0; i < coderIndex; i++)82 streamIndex += Coders[i].NumInStreams;83 return streamIndex;84 }86 UInt32 GetCoderOutStreamIndex(UInt32 coderIndex) const87 {88 UInt32 streamIndex = 0;89 for (UInt32 i = 0; i < coderIndex; i++)90 streamIndex += Coders[i].NumOutStreams;91 return streamIndex;92 }95 void FindInStream(UInt32 streamIndex, UInt32 &coderIndex,96 UInt32 &coderStreamIndex) const97 {98 for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)99 {100 UInt32 curSize = Coders[coderIndex].NumInStreams;101 if (streamIndex < curSize)102 {103 coderStreamIndex = streamIndex;104 return;105 }106 streamIndex -= curSize;107 }108 throw 1;109 }110 void FindOutStream(UInt32 streamIndex, UInt32 &coderIndex,111 UInt32 &coderStreamIndex) const112 {113 for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++)114 {115 UInt32 curSize = Coders[coderIndex].NumOutStreams;116 if (streamIndex < curSize)117 {118 coderStreamIndex = streamIndex;119 return;120 }121 streamIndex -= curSize;122 }123 throw 1;124 }125 };127 class CBindReverseConverter128 {129 UInt32 _numSrcOutStreams;130 NCoderMixer::CBindInfo _srcBindInfo;131 CRecordVector<UInt32> _srcInToDestOutMap;132 CRecordVector<UInt32> _srcOutToDestInMap;133 CRecordVector<UInt32> _destInToSrcOutMap;134 public:135 UInt32 NumSrcInStreams;136 CRecordVector<UInt32> DestOutToSrcInMap;138 CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo);139 void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo);140 };142 struct CCoderInfo2143 {144 CMyComPtr<ICompressCoder> Coder;145 CMyComPtr<ICompressCoder2> Coder2;146 UInt32 NumInStreams;147 UInt32 NumOutStreams;149 CRecordVector<UInt64> InSizes;150 CRecordVector<UInt64> OutSizes;151 CRecordVector<const UInt64 *> InSizePointers;152 CRecordVector<const UInt64 *> OutSizePointers;154 CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams);155 void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes);157 HRESULT QueryInterface(REFGUID iid, void** pp) const158 {159 IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2;160 return p->QueryInterface(iid, pp);161 }162 };164 class CCoderMixer2165 {166 public:167 virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0;168 virtual void ReInit() = 0;169 virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0;170 };172 }173 #endif