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