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