diff 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
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/win32/7zip/7z/CPP/7zip/Archive/Common/CoderMixer2.cpp	Sat Mar 03 10:31:27 2012 -0600
     1.3 @@ -0,0 +1,121 @@
     1.4 +// CoderMixer2.cpp
     1.5 +
     1.6 +#include "StdAfx.h"
     1.7 +
     1.8 +#include "CoderMixer2.h"
     1.9 +
    1.10 +namespace NCoderMixer {
    1.11 +
    1.12 +CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo):
    1.13 +  _srcBindInfo(srcBindInfo)
    1.14 +{
    1.15 +  srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams);
    1.16 +
    1.17 +  UInt32  j;
    1.18 +  for (j = 0; j < NumSrcInStreams; j++)
    1.19 +  {
    1.20 +    _srcInToDestOutMap.Add(0);
    1.21 +    DestOutToSrcInMap.Add(0);
    1.22 +  }
    1.23 +  for (j = 0; j < _numSrcOutStreams; j++)
    1.24 +  {
    1.25 +    _srcOutToDestInMap.Add(0);
    1.26 +    _destInToSrcOutMap.Add(0);
    1.27 +  }
    1.28 +
    1.29 +  UInt32 destInOffset = 0;
    1.30 +  UInt32 destOutOffset = 0;
    1.31 +  UInt32 srcInOffset = NumSrcInStreams;
    1.32 +  UInt32 srcOutOffset = _numSrcOutStreams;
    1.33 +
    1.34 +  for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--)
    1.35 +  {
    1.36 +    const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i];
    1.37 +
    1.38 +    srcInOffset -= srcCoderInfo.NumInStreams;
    1.39 +    srcOutOffset -= srcCoderInfo.NumOutStreams;
    1.40 +    
    1.41 +    UInt32 j;
    1.42 +    for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++)
    1.43 +    {
    1.44 +      UInt32 index = srcInOffset + j;
    1.45 +      _srcInToDestOutMap[index] = destOutOffset;
    1.46 +      DestOutToSrcInMap[destOutOffset] = index;
    1.47 +    }
    1.48 +    for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++)
    1.49 +    {
    1.50 +      UInt32 index = srcOutOffset + j;
    1.51 +      _srcOutToDestInMap[index] = destInOffset;
    1.52 +      _destInToSrcOutMap[destInOffset] = index;
    1.53 +    }
    1.54 +  }
    1.55 +}
    1.56 +
    1.57 +void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo)
    1.58 +{
    1.59 +  destBindInfo.Coders.Clear();
    1.60 +  destBindInfo.BindPairs.Clear();
    1.61 +  destBindInfo.InStreams.Clear();
    1.62 +  destBindInfo.OutStreams.Clear();
    1.63 +
    1.64 +  int i;
    1.65 +  for (i = _srcBindInfo.Coders.Size() - 1; i >= 0; i--)
    1.66 +  {
    1.67 +    const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i];
    1.68 +    CCoderStreamsInfo destCoderInfo;
    1.69 +    destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams;
    1.70 +    destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams;
    1.71 +    destBindInfo.Coders.Add(destCoderInfo);
    1.72 +  }
    1.73 +  for (i = _srcBindInfo.BindPairs.Size() - 1; i >= 0; i--)
    1.74 +  {
    1.75 +    const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i];
    1.76 +    CBindPair destBindPair;
    1.77 +    destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex];
    1.78 +    destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex];
    1.79 +    destBindInfo.BindPairs.Add(destBindPair);
    1.80 +  }
    1.81 +  for (i = 0; i < _srcBindInfo.InStreams.Size(); i++)
    1.82 +    destBindInfo.OutStreams.Add(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]);
    1.83 +  for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++)
    1.84 +    destBindInfo.InStreams.Add(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]);
    1.85 +}
    1.86 +
    1.87 +CCoderInfo2::CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams):
    1.88 +    NumInStreams(numInStreams),
    1.89 +    NumOutStreams(numOutStreams)
    1.90 +{
    1.91 +  InSizes.Reserve(NumInStreams);
    1.92 +  InSizePointers.Reserve(NumInStreams);
    1.93 +  OutSizePointers.Reserve(NumOutStreams);
    1.94 +  OutSizePointers.Reserve(NumOutStreams);
    1.95 +}
    1.96 +
    1.97 +static void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes,
    1.98 +    CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems)
    1.99 +{
   1.100 +  sizes.Clear();
   1.101 +  sizePointers.Clear();
   1.102 +  for(UInt32 i = 0; i < numItems; i++)
   1.103 +  {
   1.104 +    if (srcSizes == 0 || srcSizes[i] == NULL)
   1.105 +    {
   1.106 +      sizes.Add(0);
   1.107 +      sizePointers.Add(NULL);
   1.108 +    }
   1.109 +    else
   1.110 +    {
   1.111 +      sizes.Add(*srcSizes[i]);
   1.112 +      sizePointers.Add(&sizes.Back());
   1.113 +    }
   1.114 +  }
   1.115 +}
   1.116 +
   1.117 +void CCoderInfo2::SetCoderInfo(const UInt64 **inSizes,
   1.118 +      const UInt64 **outSizes)
   1.119 +{
   1.120 +  SetSizes(inSizes, InSizes, InSizePointers, NumInStreams);
   1.121 +  SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams);
   1.122 +}
   1.123 +
   1.124 +}