1 /* 2 * Copyright 2010-2019 Branimir Karadzic. All rights reserved. 3 * License: https://github.com/bkaradzic/bx#license-bsd-2-clause 4 */ 5 6 #ifndef BX_H_HEADER_GUARD 7 #define BX_H_HEADER_GUARD 8 9 #include <alloca.h> // alloca 10 #include <stdarg.h> // va_list 11 #include <stdint.h> // uint32_t 12 #include <stdlib.h> // size_t 13 #include <stddef.h> // ptrdiff_t 14 15 #include "platform.h" 16 #include "config.h" 17 #include "macros.h" 18 19 /// 20 #define BX_COUNTOF(_x) sizeof(bx::CountOfRequireArrayArgumentT(_x) ) 21 22 /// 23 #define BX_IGNORE_C4127(_x) bx::ignoreC4127(!!(_x) ) 24 25 /// 26 #define BX_ENABLED(_x) bx::isEnabled<!!(_x)>() 27 28 namespace bx 29 { 30 constexpr int32_t kExitSuccess = 0; 31 constexpr int32_t kExitFailure = 1; 32 33 /// Template for avoiding MSVC: C4127: conditional expression is constant 34 template<bool> 35 constexpr bool isEnabled(); 36 37 /// 38 template<class Ty> 39 constexpr bool isTriviallyCopyable(); 40 41 /// Swap two values. 42 template<typename Ty> 43 void swap(Ty& _a, Ty& _b); 44 45 /// Swap memory. 46 void swap(void* _a, void* _b, size_t _numBytes); 47 48 /// Returns minimum of two values. 49 template<typename Ty> 50 constexpr Ty min(const Ty& _a, const Ty& _b); 51 52 /// Returns maximum of two values. 53 template<typename Ty> 54 constexpr Ty max(const Ty& _a, const Ty& _b); 55 56 /// Returns minimum of three values. 57 template<typename Ty> 58 constexpr Ty min(const Ty& _a, const Ty& _b, const Ty& _c); 59 60 /// Returns maximum of three values. 61 template<typename Ty> 62 constexpr Ty max(const Ty& _a, const Ty& _b, const Ty& _c); 63 64 /// Returns middle of three values. 65 template<typename Ty> 66 constexpr Ty mid(const Ty& _a, const Ty& _b, const Ty& _c); 67 68 /// Returns clamped value between min/max. 69 template<typename Ty> 70 constexpr Ty clamp(const Ty& _a, const Ty& _min, const Ty& _max); 71 72 /// Returns true if value is power of 2. 73 template<typename Ty> 74 constexpr bool isPowerOf2(Ty _a); 75 76 /// Copy memory block. 77 /// 78 /// @param _dst Destination pointer. 79 /// @param _src Source pointer. 80 /// @param _numBytes Number of bytes to copy. 81 /// 82 /// @remark Source and destination memory blocks must not overlap. 83 /// 84 void memCopy(void* _dst, const void* _src, size_t _numBytes); 85 86 /// Copy strided memory block. 87 /// 88 /// @param _dst Destination pointer. 89 /// @param _dstStride Destination stride. 90 /// @param _src Source pointer. 91 /// @param _srcStride Source stride. 92 /// @param _stride Number of bytes per stride to copy. 93 /// @param _num Number of strides. 94 /// 95 /// @remark Source and destination memory blocks must not overlap. 96 /// 97 void memCopy( 98 void* _dst 99 , uint32_t _dstStride 100 , const void* _src 101 , uint32_t _srcStride 102 , uint32_t _stride 103 , uint32_t _num 104 ); 105 106 /// 107 void memMove(void* _dst, const void* _src, size_t _numBytes); 108 109 /// 110 void memMove( 111 void* _dst 112 , uint32_t _dstStride 113 , const void* _src 114 , uint32_t _srcStride 115 , uint32_t _stride 116 , uint32_t _num 117 ); 118 119 /// 120 void memSet(void* _dst, uint8_t _ch, size_t _numBytes); 121 122 /// 123 void memSet(void* _dst, uint32_t _dstStride, uint8_t _ch, uint32_t _stride, uint32_t _num); 124 125 /// 126 int32_t memCmp(const void* _lhs, const void* _rhs, size_t _numBytes); 127 128 /// 129 void gather( 130 void* _dst 131 , const void* _src 132 , uint32_t _srcStride 133 , uint32_t _stride 134 , uint32_t _num 135 ); 136 137 /// 138 void scatter( 139 void* _dst 140 , uint32_t _dstStride 141 , const void* _src 142 , uint32_t _stride 143 , uint32_t _num 144 ); 145 146 } // namespace bx 147 148 #include "inline/bx.inl" 149 150 #endif // BX_H_HEADER_GUARD 151