// UniqBlocks.cpp #include "StdAfx.h" #include "UniqBlocks.h" int CUniqBlocks::AddUniq(const Byte *data, size_t size) { unsigned left = 0, right = Sorted.Size(); while (left != right) { unsigned mid = (left + right) / 2; int index = Sorted[mid]; const CByteBuffer &buf = Bufs[index]; size_t sizeMid = buf.Size(); if (size < sizeMid) right = mid; else if (size > sizeMid) left = mid + 1; else { int cmp = memcmp(data, buf, size); if (cmp == 0) return index; if (cmp < 0) right = mid; else left = mid + 1; } } int index = Bufs.Size(); Sorted.Insert(left, index); CByteBuffer &buf = Bufs.AddNew(); buf.CopyFrom(data, size); return index; } UInt64 CUniqBlocks::GetTotalSizeInBytes() const { UInt64 size = 0; FOR_VECTOR (i, Bufs) size += Bufs[i].Size(); return size; } void CUniqBlocks::GetReverseMap() { unsigned num = Sorted.Size(); BufIndexToSortedIndex.ClearAndSetSize(num); int *p = &BufIndexToSortedIndex[0]; unsigned i; for (i = 0; i < num; i++) p[i] = 0; for (i = 0; i < num; i++) p[Sorted[i]] = i; }