Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(394)

Unified Diff: webrtc/system_wrappers/source/sort.cc

Issue 2546863003: Delete unused spreadsort implementation. (Closed)
Patch Set: Delete TestSort.cc too. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/system_wrappers/include/sort.h ('k') | webrtc/system_wrappers/source/spreadsortlib/constants.hpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/system_wrappers/source/sort.cc
diff --git a/webrtc/system_wrappers/source/sort.cc b/webrtc/system_wrappers/source/sort.cc
deleted file mode 100644
index f166f953112b4542414a4425026dfcbc8ed4bc62..0000000000000000000000000000000000000000
--- a/webrtc/system_wrappers/source/sort.cc
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// When the platform supports STL, the functions are implemented using a
-// templated spreadsort algorithm (http://sourceforge.net/projects/spreadsort/),
-// part of the Boost C++ library collection. Otherwise, the C standard library's
-// qsort() will be used.
-
-#include "webrtc/system_wrappers/include/sort.h"
-
-#include <assert.h>
-#include <string.h> // memcpy
-
-#include <new> // nothrow new
-
-#ifdef NO_STL
-#include <stdlib.h> // qsort
-#else
-#include <algorithm> // std::sort
-#include <vector>
-
-// TODO(ajm) upgrade to spreadsort v2.
-#include "webrtc/system_wrappers/source/spreadsortlib/spreadsort.hpp"
-#endif
-
-#ifdef NO_STL
-#define COMPARE_DEREFERENCED(XT, YT) \
- do { \
- if ((XT) > (YT)) { \
- return 1; \
- } \
- else if ((XT) < (YT)) { \
- return -1; \
- } \
- return 0; \
- } while(0)
-
-#define COMPARE_FOR_QSORT(X, Y, TYPE) \
- do { \
- TYPE xT = static_cast<TYPE>(*static_cast<const TYPE*>(X)); \
- TYPE yT = static_cast<TYPE>(*static_cast<const TYPE*>(Y)); \
- COMPARE_DEREFERENCED(xT, yT); \
- } while(0)
-
-#define COMPARE_KEY_FOR_QSORT(SORT_KEY_X, SORT_KEY_Y, TYPE) \
- do { \
- TYPE xT = static_cast<TYPE>( \
- *static_cast<TYPE*>(static_cast<const SortKey*>(SORT_KEY_X)->key_)); \
- TYPE yT = static_cast<TYPE>( \
- *static_cast<TYPE*>(static_cast<const SortKey*>(SORT_KEY_Y)->key_)); \
- COMPARE_DEREFERENCED(xT, yT); \
- } while(0)
-
-#define KEY_QSORT(SORT_KEY, KEY, NUM_OF_ELEMENTS, KEY_TYPE, COMPARE_FUNC) \
- do { \
- KEY_TYPE* key_type = (KEY_TYPE*)(key); \
- for (uint32_t i = 0; i < (NUM_OF_ELEMENTS); ++i) { \
- ptr_sort_key[i].key_ = &key_type[i]; \
- ptr_sort_key[i].index_ = i; \
- } \
- qsort((SORT_KEY), (NUM_OF_ELEMENTS), sizeof(SortKey), (COMPARE_FUNC)); \
- } while(0)
-#endif
-
-namespace webrtc {
-
-#ifdef NO_STL
-struct SortKey {
- void* key_;
- uint32_t index_;
-};
-#else
-template<typename KeyType>
-struct SortKey {
- KeyType key_;
- uint32_t index_;
-};
-#endif
-
-namespace { // Unnamed namespace provides internal linkage.
-
-#ifdef NO_STL
-int CompareWord8(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, int8_t);
-}
-
-int CompareUWord8(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, uint8_t);
-}
-
-int CompareWord16(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, int16_t);
-}
-
-int CompareUWord16(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, uint16_t);
-}
-
-int CompareWord32(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, int32_t);
-}
-
-int CompareUWord32(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, uint32_t);
-}
-
-int CompareWord64(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, int64_t);
-}
-
-int CompareUWord64(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, uint64_t);
-}
-
-int CompareFloat32(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, float);
-}
-
-int CompareFloat64(const void* x, const void* y) {
- COMPARE_FOR_QSORT(x, y, double);
-}
-
-int CompareKeyWord8(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, int8_t);
-}
-
-int CompareKeyUWord8(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, uint8_t);
-}
-
-int CompareKeyWord16(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, int16_t);
-}
-
-int CompareKeyUWord16(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, uint16_t);
-}
-
-int CompareKeyWord32(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, int32_t);
-}
-
-int CompareKeyUWord32(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, uint32_t);
-}
-
-int CompareKeyWord64(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, int64_t);
-}
-
-int CompareKeyUWord64(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, uint64_t);
-}
-
-int CompareKeyFloat32(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, float);
-}
-
-int CompareKeyFloat64(const void* sort_key_x, const void* sort_key_y) {
- COMPARE_KEY_FOR_QSORT(sort_key_x, sort_key_y, double);
-}
-#else
-template <typename KeyType>
-struct KeyLessThan {
- bool operator()(const SortKey<KeyType>& sort_key_x,
- const SortKey<KeyType>& sort_key_y) const {
- return sort_key_x.key_ < sort_key_y.key_;
- }
-};
-
-template <typename KeyType>
-struct KeyRightShift {
- KeyType operator()(const SortKey<KeyType>& sort_key,
- const unsigned offset) const {
- return sort_key.key_ >> offset;
- }
-};
-
-template <typename DataType>
-inline void IntegerSort(void* data, uint32_t num_of_elements) {
- DataType* data_type = static_cast<DataType*>(data);
- boost::integer_sort(data_type, data_type + num_of_elements);
-}
-
-template <typename DataType, typename IntegerType>
-inline void FloatSort(void* data, uint32_t num_of_elements) {
- DataType* data_type = static_cast<DataType*>(data);
- IntegerType c_val = 0;
- boost::float_sort_cast(data_type, data_type + num_of_elements, c_val);
-}
-
-template <typename DataType>
-inline void StdSort(void* data, uint32_t num_of_elements) {
- DataType* data_type = static_cast<DataType*>(data);
- std::sort(data_type, data_type + num_of_elements);
-}
-
-template<typename KeyType>
-inline int32_t SetupKeySort(void* key,
- SortKey<KeyType>*& ptr_sort_key,
- uint32_t num_of_elements) {
- ptr_sort_key = new(std::nothrow) SortKey<KeyType>[num_of_elements];
- if (ptr_sort_key == NULL) {
- return -1;
- }
-
- KeyType* key_type = static_cast<KeyType*>(key);
- for (uint32_t i = 0; i < num_of_elements; i++) {
- ptr_sort_key[i].key_ = key_type[i];
- ptr_sort_key[i].index_ = i;
- }
-
- return 0;
-}
-
-template<typename KeyType>
-inline int32_t TeardownKeySort(void* data,
- SortKey<KeyType>* ptr_sort_key,
- uint32_t num_of_elements,
- uint32_t size_of_element) {
- uint8_t* ptr_data = static_cast<uint8_t*>(data);
- uint8_t* ptr_data_sorted =
- new(std::nothrow) uint8_t[num_of_elements * size_of_element];
- if (ptr_data_sorted == NULL) {
- return -1;
- }
-
- for (uint32_t i = 0; i < num_of_elements; i++) {
- memcpy(ptr_data_sorted + i * size_of_element, ptr_data +
- ptr_sort_key[i].index_ * size_of_element, size_of_element);
- }
- memcpy(ptr_data, ptr_data_sorted, num_of_elements * size_of_element);
- delete[] ptr_sort_key;
- delete[] ptr_data_sorted;
- return 0;
-}
-
-template<typename KeyType>
-inline int32_t IntegerKeySort(void* data, void* key,
- uint32_t num_of_elements,
- uint32_t size_of_element) {
- SortKey<KeyType>* ptr_sort_key;
- if (SetupKeySort<KeyType>(key, ptr_sort_key, num_of_elements) != 0) {
- return -1;
- }
-
- boost::integer_sort(ptr_sort_key, ptr_sort_key + num_of_elements,
- KeyRightShift<KeyType>(), KeyLessThan<KeyType>());
-
- if (TeardownKeySort<KeyType>(data, ptr_sort_key, num_of_elements,
- size_of_element) != 0) {
- return -1;
- }
-
- return 0;
-}
-
-template<typename KeyType>
-inline int32_t StdKeySort(void* data, void* key,
- uint32_t num_of_elements,
- uint32_t size_of_element) {
- SortKey<KeyType>* ptr_sort_key;
- if (SetupKeySort<KeyType>(key, ptr_sort_key, num_of_elements) != 0) {
- return -1;
- }
-
- std::sort(ptr_sort_key, ptr_sort_key + num_of_elements,
- KeyLessThan<KeyType>());
-
- if (TeardownKeySort<KeyType>(data, ptr_sort_key, num_of_elements,
- size_of_element) != 0) {
- return -1;
- }
-
- return 0;
-}
-#endif
-}
-
-int32_t Sort(void* data, uint32_t num_of_elements, Type type) {
- if (data == NULL) {
- return -1;
- }
-
-#ifdef NO_STL
- switch (type) {
- case TYPE_Word8:
- qsort(data, num_of_elements, sizeof(int8_t), CompareWord8);
- break;
- case TYPE_UWord8:
- qsort(data, num_of_elements, sizeof(uint8_t), CompareUWord8);
- break;
- case TYPE_Word16:
- qsort(data, num_of_elements, sizeof(int16_t), CompareWord16);
- break;
- case TYPE_UWord16:
- qsort(data, num_of_elements, sizeof(uint16_t), CompareUWord16);
- break;
- case TYPE_Word32:
- qsort(data, num_of_elements, sizeof(int32_t), CompareWord32);
- break;
- case TYPE_UWord32:
- qsort(data, num_of_elements, sizeof(uint32_t), CompareUWord32);
- break;
- case TYPE_Word64:
- qsort(data, num_of_elements, sizeof(int64_t), CompareWord64);
- break;
- case TYPE_UWord64:
- qsort(data, num_of_elements, sizeof(uint64_t), CompareUWord64);
- break;
- case TYPE_Float32:
- qsort(data, num_of_elements, sizeof(float), CompareFloat32);
- break;
- case TYPE_Float64:
- qsort(data, num_of_elements, sizeof(double), CompareFloat64);
- break;
- default:
- return -1;
- }
-#else
- // Fall back to std::sort for 64-bit types and floats due to compiler
- // warnings and VS 2003 build crashes respectively with spreadsort.
- switch (type) {
- case TYPE_Word8:
- IntegerSort<int8_t>(data, num_of_elements);
- break;
- case TYPE_UWord8:
- IntegerSort<uint8_t>(data, num_of_elements);
- break;
- case TYPE_Word16:
- IntegerSort<int16_t>(data, num_of_elements);
- break;
- case TYPE_UWord16:
- IntegerSort<uint16_t>(data, num_of_elements);
- break;
- case TYPE_Word32:
- IntegerSort<int32_t>(data, num_of_elements);
- break;
- case TYPE_UWord32:
- IntegerSort<uint32_t>(data, num_of_elements);
- break;
- case TYPE_Word64:
- StdSort<int64_t>(data, num_of_elements);
- break;
- case TYPE_UWord64:
- StdSort<uint64_t>(data, num_of_elements);
- break;
- case TYPE_Float32:
- StdSort<float>(data, num_of_elements);
- break;
- case TYPE_Float64:
- StdSort<double>(data, num_of_elements);
- break;
- }
-#endif
- return 0;
-}
-
-int32_t KeySort(void* data, void* key, uint32_t num_of_elements,
- uint32_t size_of_element, Type key_type) {
- if (data == NULL) {
- return -1;
- }
-
- if (key == NULL) {
- return -1;
- }
-
- if ((uint64_t)num_of_elements * size_of_element > 0xffffffff) {
- return -1;
- }
-
-#ifdef NO_STL
- SortKey* ptr_sort_key = new(std::nothrow) SortKey[num_of_elements];
- if (ptr_sort_key == NULL) {
- return -1;
- }
-
- switch (key_type) {
- case TYPE_Word8:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, int8_t,
- CompareKeyWord8);
- break;
- case TYPE_UWord8:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, uint8_t,
- CompareKeyUWord8);
- break;
- case TYPE_Word16:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, int16_t,
- CompareKeyWord16);
- break;
- case TYPE_UWord16:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, uint16_t,
- CompareKeyUWord16);
- break;
- case TYPE_Word32:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, int32_t,
- CompareKeyWord32);
- break;
- case TYPE_UWord32:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, uint32_t,
- CompareKeyUWord32);
- break;
- case TYPE_Word64:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, int64_t,
- CompareKeyWord64);
- break;
- case TYPE_UWord64:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, uint64_t,
- CompareKeyUWord64);
- break;
- case TYPE_Float32:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, float,
- CompareKeyFloat32);
- break;
- case TYPE_Float64:
- KEY_QSORT(ptr_sort_key, key, num_of_elements, double,
- CompareKeyFloat64);
- break;
- default:
- return -1;
- }
-
- // Shuffle into sorted position based on index map.
- uint8_t* ptr_data = static_cast<uint8_t*>(data);
- uint8_t* ptr_data_sorted =
- new(std::nothrow) uint8_t[num_of_elements * size_of_element];
- if (ptr_data_sorted == NULL) {
- return -1;
- }
-
- for (uint32_t i = 0; i < num_of_elements; i++) {
- memcpy(ptr_data_sorted + i * size_of_element, ptr_data +
- ptr_sort_key[i].index_ * size_of_element, size_of_element);
- }
- memcpy(ptr_data, ptr_data_sorted, num_of_elements * size_of_element);
-
- delete[] ptr_sort_key;
- delete[] ptr_data_sorted;
-
- return 0;
-#else
- // Fall back to std::sort for 64-bit types and floats due to compiler
- // warnings and errors respectively with spreadsort.
- switch (key_type) {
- case TYPE_Word8:
- return IntegerKeySort<int8_t>(data, key, num_of_elements,
- size_of_element);
- case TYPE_UWord8:
- return IntegerKeySort<uint8_t>(data, key, num_of_elements,
- size_of_element);
- case TYPE_Word16:
- return IntegerKeySort<int16_t>(data, key, num_of_elements,
- size_of_element);
- case TYPE_UWord16:
- return IntegerKeySort<uint16_t>(data, key, num_of_elements,
- size_of_element);
- case TYPE_Word32:
- return IntegerKeySort<int32_t>(data, key, num_of_elements,
- size_of_element);
- case TYPE_UWord32:
- return IntegerKeySort<uint32_t>(data, key, num_of_elements,
- size_of_element);
- case TYPE_Word64:
- return StdKeySort<int64_t>(data, key, num_of_elements,
- size_of_element);
- case TYPE_UWord64:
- return StdKeySort<uint64_t>(data, key, num_of_elements,
- size_of_element);
- case TYPE_Float32:
- return StdKeySort<float>(data, key, num_of_elements, size_of_element);
- case TYPE_Float64:
- return StdKeySort<double>(data, key, num_of_elements, size_of_element);
- }
- assert(false);
- return -1;
-#endif
-}
-
-} // namespace webrtc
« no previous file with comments | « webrtc/system_wrappers/include/sort.h ('k') | webrtc/system_wrappers/source/spreadsortlib/constants.hpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698