1 // The MIT License (MIT) 2 // 3 // Copyright (c) 2015 Sergey Makeev, Vadim Slyusarev 4 // 5 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // of this software and associated documentation files (the "Software"), to deal 7 // in the Software without restriction, including without limitation the rights 8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 // copies of the Software, and to permit persons to whom the Software is 10 // furnished to do so, subject to the following conditions: 11 // 12 // The above copyright notice and this permission notice shall be included in 13 // all copies or substantial portions of the Software. 14 // 15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 // THE SOFTWARE. 22 23 #pragma once 24 #include <MTTypes.h> 25 #include <MTPlatform.h> 26 27 #define UNUSED(T) 28 29 30 namespace MT 31 { 32 template<class T> 33 T Min(T a, T b) 34 { 35 return a < b ? a : b; 36 } 37 38 template<class T> 39 T Max(T a, T b) 40 { 41 return a < b ? b : a; 42 } 43 44 template<class T> 45 T Clamp(T val, T min, T max) 46 { 47 return Min(max, Max(min, val)); 48 } 49 50 51 ////////////////////////////////////////////////////////////////////////// 52 class Timer 53 { 54 uint64 startMicroSeconds; 55 public: 56 Timer() : startMicroSeconds(MT::GetTimeMicroSeconds()) 57 { 58 } 59 60 uint32 GetPastMicroSeconds() const 61 { 62 return (uint32)(MT::GetTimeMicroSeconds() - startMicroSeconds); 63 } 64 65 uint32 GetPastMilliSeconds() const 66 { 67 return (uint32)((MT::GetTimeMicroSeconds() - startMicroSeconds) / 1000); 68 } 69 }; 70 71 72 73 //Compile time pow2 check 74 ////////////////////////////////////////////////////////////////////////// 75 template< size_t N, size_t C = 1 > 76 struct IsPow2Recurse 77 { 78 enum 79 { 80 result = IsPow2Recurse< N / 2, C * 2 >::result 81 }; 82 }; 83 84 template< size_t C > 85 struct IsPow2Recurse< 0, C > 86 { 87 enum 88 { 89 result = C 90 }; 91 }; 92 93 94 template< size_t N > 95 struct StaticIsPow2 96 { 97 enum 98 { 99 result = IsPow2Recurse< N - 1 >::result == N ? 1 : 0 100 }; 101 }; 102 103 104 105 } 106 107