1 /*
2  * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sub license, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the
13  * next paragraph) shall be included in all copies or substantial portions
14  * of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 #ifndef TEST_UTILS_H
26 #define TEST_UTILS_H
27 
28 #include <chrono>
29 #include <cstdlib>
30 
31 template <typename T>
32 class RandomValueGenerator
33 {
34 public:
RandomValueGenerator(const T & min,const T & max)35     RandomValueGenerator(const T& min, const T& max)
36         : minVal(min)
37         , maxVal(max)
38     {
39         return;
40     }
41 
operator()42     const T operator()() const
43     {
44         return static_cast<T>(
45             std::rand() % (maxVal + 1 - minVal) + minVal);
46     }
47 
48 private:
49     T minVal;
50     T maxVal;
51 };
52 
53 class Timer
54 {
55 public:
56     typedef typename std::chrono::microseconds us;
57     typedef typename std::chrono::milliseconds ms;
58     typedef typename std::chrono::seconds       s;
59 
Timer()60     Timer() { reset(); }
61 
62     template <typename T = std::chrono::microseconds>
elapsed()63     typename T::rep elapsed() const
64     {
65         return std::chrono::duration_cast<T>(
66             std::chrono::steady_clock::now() - start).count();
67     }
68 
reset()69     void reset()
70     {
71         start = std::chrono::steady_clock::now();
72     }
73 
74 private:
75     std::chrono::steady_clock::time_point start;
76 };
77 
78 #endif // TEST_UTILS_H
79