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