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 Workerunsigned 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 WorkerUInt64 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 Workervoid 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