annotate src/win32/7zip/7z/CPP/7zip/Archive/Common/CoderMixer2.cpp @ 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 // CoderMixer2.cpp
rlm@1 2
rlm@1 3 #include "StdAfx.h"
rlm@1 4
rlm@1 5 #include "CoderMixer2.h"
rlm@1 6
rlm@1 7 namespace NCoderMixer {
rlm@1 8
rlm@1 9 CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo):
rlm@1 10 _srcBindInfo(srcBindInfo)
rlm@1 11 {
rlm@1 12 srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams);
rlm@1 13
rlm@1 14 UInt32 j;
rlm@1 15 for (j = 0; j < NumSrcInStreams; j++)
rlm@1 16 {
rlm@1 17 _srcInToDestOutMap.Add(0);
rlm@1 18 DestOutToSrcInMap.Add(0);
rlm@1 19 }
rlm@1 20 for (j = 0; j < _numSrcOutStreams; j++)
rlm@1 21 {
rlm@1 22 _srcOutToDestInMap.Add(0);
rlm@1 23 _destInToSrcOutMap.Add(0);
rlm@1 24 }
rlm@1 25
rlm@1 26 UInt32 destInOffset = 0;
rlm@1 27 UInt32 destOutOffset = 0;
rlm@1 28 UInt32 srcInOffset = NumSrcInStreams;
rlm@1 29 UInt32 srcOutOffset = _numSrcOutStreams;
rlm@1 30
rlm@1 31 for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--)
rlm@1 32 {
rlm@1 33 const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i];
rlm@1 34
rlm@1 35 srcInOffset -= srcCoderInfo.NumInStreams;
rlm@1 36 srcOutOffset -= srcCoderInfo.NumOutStreams;
rlm@1 37
rlm@1 38 UInt32 j;
rlm@1 39 for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++)
rlm@1 40 {
rlm@1 41 UInt32 index = srcInOffset + j;
rlm@1 42 _srcInToDestOutMap[index] = destOutOffset;
rlm@1 43 DestOutToSrcInMap[destOutOffset] = index;
rlm@1 44 }
rlm@1 45 for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++)
rlm@1 46 {
rlm@1 47 UInt32 index = srcOutOffset + j;
rlm@1 48 _srcOutToDestInMap[index] = destInOffset;
rlm@1 49 _destInToSrcOutMap[destInOffset] = index;
rlm@1 50 }
rlm@1 51 }
rlm@1 52 }
rlm@1 53
rlm@1 54 void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo)
rlm@1 55 {
rlm@1 56 destBindInfo.Coders.Clear();
rlm@1 57 destBindInfo.BindPairs.Clear();
rlm@1 58 destBindInfo.InStreams.Clear();
rlm@1 59 destBindInfo.OutStreams.Clear();
rlm@1 60
rlm@1 61 int i;
rlm@1 62 for (i = _srcBindInfo.Coders.Size() - 1; i >= 0; i--)
rlm@1 63 {
rlm@1 64 const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i];
rlm@1 65 CCoderStreamsInfo destCoderInfo;
rlm@1 66 destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams;
rlm@1 67 destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams;
rlm@1 68 destBindInfo.Coders.Add(destCoderInfo);
rlm@1 69 }
rlm@1 70 for (i = _srcBindInfo.BindPairs.Size() - 1; i >= 0; i--)
rlm@1 71 {
rlm@1 72 const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i];
rlm@1 73 CBindPair destBindPair;
rlm@1 74 destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex];
rlm@1 75 destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex];
rlm@1 76 destBindInfo.BindPairs.Add(destBindPair);
rlm@1 77 }
rlm@1 78 for (i = 0; i < _srcBindInfo.InStreams.Size(); i++)
rlm@1 79 destBindInfo.OutStreams.Add(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]);
rlm@1 80 for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++)
rlm@1 81 destBindInfo.InStreams.Add(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]);
rlm@1 82 }
rlm@1 83
rlm@1 84 CCoderInfo2::CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams):
rlm@1 85 NumInStreams(numInStreams),
rlm@1 86 NumOutStreams(numOutStreams)
rlm@1 87 {
rlm@1 88 InSizes.Reserve(NumInStreams);
rlm@1 89 InSizePointers.Reserve(NumInStreams);
rlm@1 90 OutSizePointers.Reserve(NumOutStreams);
rlm@1 91 OutSizePointers.Reserve(NumOutStreams);
rlm@1 92 }
rlm@1 93
rlm@1 94 static void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes,
rlm@1 95 CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems)
rlm@1 96 {
rlm@1 97 sizes.Clear();
rlm@1 98 sizePointers.Clear();
rlm@1 99 for(UInt32 i = 0; i < numItems; i++)
rlm@1 100 {
rlm@1 101 if (srcSizes == 0 || srcSizes[i] == NULL)
rlm@1 102 {
rlm@1 103 sizes.Add(0);
rlm@1 104 sizePointers.Add(NULL);
rlm@1 105 }
rlm@1 106 else
rlm@1 107 {
rlm@1 108 sizes.Add(*srcSizes[i]);
rlm@1 109 sizePointers.Add(&sizes.Back());
rlm@1 110 }
rlm@1 111 }
rlm@1 112 }
rlm@1 113
rlm@1 114 void CCoderInfo2::SetCoderInfo(const UInt64 **inSizes,
rlm@1 115 const UInt64 **outSizes)
rlm@1 116 {
rlm@1 117 SetSizes(inSizes, InSizes, InSizePointers, NumInStreams);
rlm@1 118 SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams);
rlm@1 119 }
rlm@1 120
rlm@1 121 }