xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/UniqBlocks.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // UniqBlocks.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include <string.h>
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "UniqBlocks.h"
8*f6dc9357SAndroid Build Coastguard Worker 
AddUniq(const Byte * data,size_t size)9*f6dc9357SAndroid Build Coastguard Worker unsigned CUniqBlocks::AddUniq(const Byte *data, size_t size)
10*f6dc9357SAndroid Build Coastguard Worker {
11*f6dc9357SAndroid Build Coastguard Worker   unsigned left = 0, right = Sorted.Size();
12*f6dc9357SAndroid Build Coastguard Worker   while (left != right)
13*f6dc9357SAndroid Build Coastguard Worker   {
14*f6dc9357SAndroid Build Coastguard Worker     const unsigned mid = (unsigned)(((size_t)left + (size_t)right) / 2);
15*f6dc9357SAndroid Build Coastguard Worker     const unsigned index = Sorted[mid];
16*f6dc9357SAndroid Build Coastguard Worker     const CByteBuffer &buf = Bufs[index];
17*f6dc9357SAndroid Build Coastguard Worker     const size_t sizeMid = buf.Size();
18*f6dc9357SAndroid Build Coastguard Worker     if (size < sizeMid)
19*f6dc9357SAndroid Build Coastguard Worker       right = mid;
20*f6dc9357SAndroid Build Coastguard Worker     else if (size > sizeMid)
21*f6dc9357SAndroid Build Coastguard Worker       left = mid + 1;
22*f6dc9357SAndroid Build Coastguard Worker     else
23*f6dc9357SAndroid Build Coastguard Worker     {
24*f6dc9357SAndroid Build Coastguard Worker       if (size == 0)
25*f6dc9357SAndroid Build Coastguard Worker         return index;
26*f6dc9357SAndroid Build Coastguard Worker       const int cmp = memcmp(data, buf, size);
27*f6dc9357SAndroid Build Coastguard Worker       if (cmp == 0)
28*f6dc9357SAndroid Build Coastguard Worker         return index;
29*f6dc9357SAndroid Build Coastguard Worker       if (cmp < 0)
30*f6dc9357SAndroid Build Coastguard Worker         right = mid;
31*f6dc9357SAndroid Build Coastguard Worker       else
32*f6dc9357SAndroid Build Coastguard Worker         left = mid + 1;
33*f6dc9357SAndroid Build Coastguard Worker     }
34*f6dc9357SAndroid Build Coastguard Worker   }
35*f6dc9357SAndroid Build Coastguard Worker   unsigned index = Bufs.Size();
36*f6dc9357SAndroid Build Coastguard Worker   Sorted.Insert(left, index);
37*f6dc9357SAndroid Build Coastguard Worker   Bufs.AddNew().CopyFrom(data, size);
38*f6dc9357SAndroid Build Coastguard Worker   return index;
39*f6dc9357SAndroid Build Coastguard Worker }
40*f6dc9357SAndroid Build Coastguard Worker 
GetTotalSizeInBytes() const41*f6dc9357SAndroid Build Coastguard Worker UInt64 CUniqBlocks::GetTotalSizeInBytes() const
42*f6dc9357SAndroid Build Coastguard Worker {
43*f6dc9357SAndroid Build Coastguard Worker   UInt64 size = 0;
44*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, Bufs)
45*f6dc9357SAndroid Build Coastguard Worker     size += Bufs[i].Size();
46*f6dc9357SAndroid Build Coastguard Worker   return size;
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker 
GetReverseMap()49*f6dc9357SAndroid Build Coastguard Worker void CUniqBlocks::GetReverseMap()
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker   unsigned num = Sorted.Size();
52*f6dc9357SAndroid Build Coastguard Worker   BufIndexToSortedIndex.ClearAndSetSize(num);
53*f6dc9357SAndroid Build Coastguard Worker   unsigned *p = &BufIndexToSortedIndex[0];
54*f6dc9357SAndroid Build Coastguard Worker   const unsigned *sorted = &Sorted[0];
55*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < num; i++)
56*f6dc9357SAndroid Build Coastguard Worker     p[sorted[i]] = i;
57*f6dc9357SAndroid Build Coastguard Worker }
58