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