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 namespace MT 28 { 29 template<class T> Min(T a,T b)30 T Min(T a, T b) 31 { 32 return a < b ? a : b; 33 } 34 35 template<class T> Max(T a,T b)36 T Max(T a, T b) 37 { 38 return a < b ? b : a; 39 } 40 41 template<class T> Clamp(T val,T min,T max)42 T Clamp(T val, T min, T max) 43 { 44 return Min(max, Max(min, val)); 45 } 46 47 48 ////////////////////////////////////////////////////////////////////////// 49 class Timer 50 { 51 uint64 startMicroSeconds; 52 public: Timer()53 Timer() : startMicroSeconds(MT::GetTimeMicroSeconds()) 54 { 55 } 56 GetPastMicroSeconds()57 uint32 GetPastMicroSeconds() const 58 { 59 return (uint32)(MT::GetTimeMicroSeconds() - startMicroSeconds); 60 } 61 GetPastMilliSeconds()62 uint32 GetPastMilliSeconds() const 63 { 64 return (uint32)((MT::GetTimeMicroSeconds() - startMicroSeconds) / 1000); 65 } 66 }; 67 68 69 70 //Compile time pow2 check 71 ////////////////////////////////////////////////////////////////////////// 72 template< size_t N, size_t C = 1 > 73 struct IsPow2Recurse 74 { 75 enum 76 { 77 result = IsPow2Recurse< N / 2, C * 2 >::result 78 }; 79 }; 80 81 template< size_t C > 82 struct IsPow2Recurse< 0, C > 83 { 84 enum 85 { 86 result = C 87 }; 88 }; 89 90 91 template< size_t N > 92 struct StaticIsPow2 93 { 94 enum 95 { 96 result = IsPow2Recurse< N - 1 >::result == N ? 1 : 0 97 }; 98 }; 99 100 101 102 } 103 104