1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 113f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdio.h> 123f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <string.h> 133f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <algorithm> 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16c6d6fed3c0a82bb7a09095381b974e8e5eebcb35pbos@webrtc.org#include "webrtc/system_wrappers/interface/sort.h" 17c6d6fed3c0a82bb7a09095381b974e8e5eebcb35pbos@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h" 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Excellent work polluting the global namespace Visual Studio... 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#undef max 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#undef min 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <limits> 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<typename KeyType> 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct LotsOfData 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KeyType key; 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char data[64]; 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<typename DataType> 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint Compare(const void* dataX, const void* dataY) 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DataType dataX = (DataType)*(const DataType*)dataX; 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DataType dataY = (DataType)*(const DataType*)dataY; 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (dataX > dataY) 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 1; 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (dataX < dataY) 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<typename DataType, typename KeyType> 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint CompareKey(const void* dataX, const void* dataY) 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KeyType keyX = ((const DataType*)dataX)->key; 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KeyType keyY = ((const DataType*)dataY)->key; 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (keyX > keyY) 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 1; 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if (keyX < keyY) 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<typename DataType> 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct KeyLessThan 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool operator()(const DataType &dataX, const DataType &dataY) const 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return dataX.key < dataY.key; 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char* TypeEnumToString(webrtc::Type type) 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch (type) 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org using namespace webrtc; 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_Word8: 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "Word8"; 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_UWord8: 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "UWord8"; 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_Word16: 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "Word16"; 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_UWord16: 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "UWord16"; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_Word32: 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "Word32"; 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_UWord32: 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "UWord32"; 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_Word64: 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "Word64"; 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_UWord64: 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "UWord64"; 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_Float32: 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "Float32"; 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case TYPE_Float64: 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "Float64"; 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org default: 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return "Unrecognized"; 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<typename Type> 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgType TypedRand() 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (std::numeric_limits<Type>::is_integer) 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double floatRand = static_cast<double>(rand()) / RAND_MAX; 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (std::numeric_limits<Type>::is_signed) 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org floatRand -= 0.5; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Uniform [-max()/2, max()/2] for signed 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // [0, max()] for unsigned 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return static_cast<Type>(floatRand * std::numeric_limits<Type>::max()); 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else // Floating point 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Uniform [-0.5, 0.5] 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // The outer cast is to remove template warnings. 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return static_cast<Type>((static_cast<Type>(rand()) / RAND_MAX) - 0.5); 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<typename KeyType> 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid RunSortTest(webrtc::Type sortType, bool keySort) 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org enum { DataLength = 1000 }; 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org enum { NumOfTests = 10000 }; 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KeyType key[DataLength]; 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KeyType keyRef[DataLength]; 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LotsOfData<KeyType> data[DataLength]; 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LotsOfData<KeyType> dataRef[DataLength]; 136c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org int32_t retVal = 0; 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (keySort) 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Running %s KeySort() tests...\n", TypeEnumToString(sortType)); 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Running %s Sort() tests...\n", TypeEnumToString(sortType)); 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TickInterval accTicks; 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < NumOfTests; i++) 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int j = 0; j < DataLength; j++) 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org key[j] = TypedRand<KeyType>(); 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org data[j].key = key[j]; 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Write index to payload. We use this later for verification. 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sprintf(data[j].data, "%d", j); 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memcpy(dataRef, data, sizeof(data)); 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memcpy(keyRef, key, sizeof(key)); 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org retVal = 0; 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TickTime t0 = TickTime::Now(); 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (keySort) 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org retVal = webrtc::KeySort(data, key, DataLength, sizeof(LotsOfData<KeyType>), 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sortType); 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //std::sort(data, data + DataLength, KeyLessThan<KeyType>()); 169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //qsort(data, DataLength, sizeof(LotsOfData<KeyType>), 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // CompareKey<LotsOfData<KeyType>, KeyType>); 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org retVal = webrtc::Sort(key, DataLength, sortType); 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //std::sort(key, key + DataLength); 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //qsort(key, DataLength, sizeof(KeyType), Compare<KeyType>); 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TickTime t1 = TickTime::Now(); 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org accTicks += (t1 - t0); 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (retVal != 0) 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Test failed at iteration %d:\n", i); 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Sort returned an error. "); 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("It likely does not support the requested type\nExiting...\n"); 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org exit(0); 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Reference sort. 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!keySort) 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::sort(keyRef, keyRef + DataLength); 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (keySort) 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int j = 0; j < DataLength - 1; j++) 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (data[j].key > data[j + 1].key) 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Test failed at iteration %d:\n", i); 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Keys are not monotonically increasing\nExiting...\n"); 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org exit(0); 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int index = atoi(data[j].data); 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (index < 0 || index >= DataLength || data[j].key != dataRef[index].key) 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Test failed at iteration %d:\n", i); 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Payload data is corrupt\nExiting...\n"); 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org exit(0); 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int j = 0; j < DataLength - 1; j++) 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (key[j] > key[j + 1]) 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Test failed at iteration %d:\n", i); 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Data is not monotonically increasing\nExiting...\n"); 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org exit(0); 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (memcmp(key, keyRef, sizeof(key)) != 0) 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Test failed at iteration %d:\n", i); 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Sort data differs from std::sort reference\nExiting...\n"); 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org exit(0); 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Compliance test passed over %d iterations\n", NumOfTests); 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 239c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org int64_t executeTime = accTicks.Milliseconds(); 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Execute time: %.2f s\n\n", (float)executeTime / 1000); 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint main() 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Seed rand(). 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org srand(42); 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool keySort = false; 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < 2; i++) { 249c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org RunSortTest<int8_t>(webrtc::TYPE_Word8, keySort); 250c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org RunSortTest<uint8_t>(webrtc::TYPE_UWord8, keySort); 251c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org RunSortTest<int16_t>(webrtc::TYPE_Word16, keySort); 252c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org RunSortTest<uint16_t>(webrtc::TYPE_UWord16, keySort); 253c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org RunSortTest<int32_t>(webrtc::TYPE_Word32, keySort); 254c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org RunSortTest<uint32_t>(webrtc::TYPE_UWord32, keySort); 255c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org RunSortTest<int64_t>(webrtc::TYPE_Word64, keySort); 256c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org RunSortTest<uint64_t>(webrtc::TYPE_UWord64, keySort); 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RunSortTest<float>(webrtc::TYPE_Float32, keySort); 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RunSortTest<double>(webrtc::TYPE_Float64, keySort); 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org keySort = !keySort; 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("All tests passed\n"); 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 267