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