Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Common/Vector.h')
-rwxr-xr-xCommon/Vector.h64
1 files changed, 46 insertions, 18 deletions
diff --git a/Common/Vector.h b/Common/Vector.h
index 858e53d3..984fddc1 100755
--- a/Common/Vector.h
+++ b/Common/Vector.h
@@ -70,14 +70,46 @@ public:
T& Front() { return operator[](0); }
const T& Back() const { return operator[](_size - 1); }
T& Back() { return operator[](_size - 1); }
- static int
- #ifdef _MSC_VER
- __cdecl
- #endif
- CompareRecordItems(const void *a1, const void *a2)
- { return MyCompare(*((const T *)a1), *((const T *)a2)); }
- void Sort()
- { qsort(&Front(), Size(), _itemSize, CompareRecordItems); }
+
+ void Swap(int i, int j)
+ {
+ T temp = operator[](i);
+ operator[](i) = operator[](j);
+ operator[](j) = temp;
+ }
+
+ void Sort(int left, int right)
+ {
+ if (right - left < 2)
+ return;
+ Swap(left, (left + right) / 2);
+ int last = left;
+ for (int i = left; i < right; i++)
+ if (operator[](i) < operator[](left))
+ Swap(++last, i);
+ Swap(left, last);
+ Sort(left, last);
+ Sort(last + 1, right);
+ }
+ void Sort() { Sort(0, Size()); }
+ void Sort(int left, int right, int (*compare)(const T*, const T*, void *), void *param)
+ {
+ if (right - left < 2)
+ return;
+ Swap(left, (left + right) / 2);
+ int last = left;
+ for (int i = left; i < right; i++)
+ if (compare(&operator[](i), &operator[](left), param) < 0)
+ Swap(++last, i);
+ Swap(left, last);
+ Sort(left, last, compare, param);
+ Sort(last + 1, right, compare, param);
+ }
+
+ void Sort(int (*compare)(const T*, const T*, void *), void *param)
+ {
+ Sort(0, Size(), compare, param);
+ }
};
typedef CRecordVector<int> CIntVector;
@@ -167,17 +199,13 @@ public:
Insert(right, item);
return right;
}
- static int
- #ifdef _MSC_VER
- __cdecl
- #endif
- CompareObjectItems(const void *a1, const void *a2)
+
+ void Sort(int (*compare)(void *const *, void *const *, void *), void *param)
+ { CPointerVector::Sort(compare, param); }
+
+ static int CompareObjectItems(void *const *a1, void *const *a2, void *param)
{ return MyCompare(*(*((const T **)a1)), *(*((const T **)a2))); }
- void Sort()
- {
- CPointerVector &pointerVector = *this;
- qsort(&pointerVector[0], Size(), sizeof(void *), CompareObjectItems);
- }
+ void Sort() { CPointerVector::Sort(CompareObjectItems, 0); }
};
#endif