• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////////////////////////
2 /// OpenGL Mathematics (glm.g-truc.net)
3 ///
4 /// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
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 /// @ref gtx_bit
24 /// @file glm/gtx/bit.hpp
25 /// @date 2007-03-14 / 2011-06-07
26 /// @author Christophe Riccio
27 ///
28 /// @see core (dependence)
29 /// @see gtc_half_float (dependence)
30 ///
31 /// @defgroup gtx_bit GLM_GTX_bit
32 /// @ingroup gtx
33 ///
34 /// @brief Allow to perform bit operations on integer values
35 ///
36 /// <glm/gtx/bit.hpp> need to be included to use these functionalities.
37 ///////////////////////////////////////////////////////////////////////////////////
38 
39 #ifndef GLM_GTX_bit
40 #define GLM_GTX_bit
41 
42 // Dependencies
43 #include "../detail/type_int.hpp"
44 #include "../detail/setup.hpp"
45 #include <cstddef>
46 
47 #if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
48 #	pragma message("GLM: GLM_GTX_bit extension included")
49 #endif
50 
51 namespace glm
52 {
53 	/// @addtogroup gtx_bit
54 	/// @{
55 
56 	/// Build a mask of 'count' bits
57 	/// @see gtx_bit
58 	template <typename genIType>
59 	GLM_FUNC_DECL genIType mask(genIType const & count);
60 
61 	//! Find the highest bit set to 1 in a integer variable and return its value.
62 	/// @see gtx_bit
63 	template <typename genType>
64 	GLM_FUNC_DECL genType highestBitValue(genType const & value);
65 
66 	//! Return true if the value is a power of two number.
67 	/// @see gtx_bit
68 	template <typename genType>
69 	GLM_FUNC_DECL bool isPowerOfTwo(genType const & value);
70 
71 	//! Return the power of two number which value is just higher the input value.
72 	/// @see gtx_bit
73 	template <typename genType>
74 	GLM_FUNC_DECL genType powerOfTwoAbove(genType const & value);
75 
76 	//! Return the power of two number which value is just lower the input value.
77 	/// @see gtx_bit
78 	template <typename genType>
79 	GLM_FUNC_DECL genType powerOfTwoBelow(genType const & value);
80 
81 	//! Return the power of two number which value is the closet to the input value.
82 	/// @see gtx_bit
83 	template <typename genType>
84 	GLM_FUNC_DECL genType powerOfTwoNearest(genType const & value);
85 
86 	//! Revert all bits of any integer based type.
87 	/// @see gtx_bit
88 	template <typename genType>
89 	GLM_DEPRECATED GLM_FUNC_DECL genType bitRevert(genType const & value);
90 
91 	//! Rotate all bits to the right.
92 	/// @see gtx_bit
93 	template <typename genType>
94 	GLM_FUNC_DECL genType bitRotateRight(genType const & In, std::size_t Shift);
95 
96 	//! Rotate all bits to the left.
97 	/// @see gtx_bit
98 	template <typename genType>
99 	GLM_FUNC_DECL genType bitRotateLeft(genType const & In, std::size_t Shift);
100 
101 	//! Set to 1 a range of bits.
102 	/// @see gtx_bit
103 	template <typename genIUType>
104 	GLM_FUNC_DECL genIUType fillBitfieldWithOne(
105 		genIUType const & Value,
106 		int const & FromBit,
107 		int const & ToBit);
108 
109 	//! Set to 0 a range of bits.
110 	/// @see gtx_bit
111 	template <typename genIUType>
112 	GLM_FUNC_DECL genIUType fillBitfieldWithZero(
113 		genIUType const & Value,
114 		int const & FromBit,
115 		int const & ToBit);
116 
117 	/// Interleaves the bits of x and y.
118 	/// The first bit is the first bit of x followed by the first bit of y.
119 	/// The other bits are interleaved following the previous sequence.
120 	///
121 	/// @see gtx_bit
122 	GLM_FUNC_DECL int16 bitfieldInterleave(int8 x, int8 y);
123 
124 	/// Interleaves the bits of x and y.
125 	/// The first bit is the first bit of x followed by the first bit of y.
126 	/// The other bits are interleaved following the previous sequence.
127 	///
128 	/// @see gtx_bit
129 	GLM_FUNC_DECL uint16 bitfieldInterleave(uint8 x, uint8 y);
130 
131 	/// Interleaves the bits of x and y.
132 	/// The first bit is the first bit of x followed by the first bit of y.
133 	/// The other bits are interleaved following the previous sequence.
134 	///
135 	/// @see gtx_bit
136 	GLM_FUNC_DECL int32 bitfieldInterleave(int16 x, int16 y);
137 
138 	/// Interleaves the bits of x and y.
139 	/// The first bit is the first bit of x followed by the first bit of y.
140 	/// The other bits are interleaved following the previous sequence.
141 	///
142 	/// @see gtx_bit
143 	GLM_FUNC_DECL uint32 bitfieldInterleave(uint16 x, uint16 y);
144 
145 	/// Interleaves the bits of x and y.
146 	/// The first bit is the first bit of x followed by the first bit of y.
147 	/// The other bits are interleaved following the previous sequence.
148 	///
149 	/// @see gtx_bit
150 	GLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y);
151 
152 	/// Interleaves the bits of x and y.
153 	/// The first bit is the first bit of x followed by the first bit of y.
154 	/// The other bits are interleaved following the previous sequence.
155 	///
156 	/// @see gtx_bit
157 	GLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y);
158 
159 	/// Interleaves the bits of x, y and z.
160 	/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.
161 	/// The other bits are interleaved following the previous sequence.
162 	///
163 	/// @see gtx_bit
164 	GLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z);
165 
166 	/// Interleaves the bits of x, y and z.
167 	/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.
168 	/// The other bits are interleaved following the previous sequence.
169 	///
170 	/// @see gtx_bit
171 	GLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z);
172 
173 	/// Interleaves the bits of x, y and z.
174 	/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.
175 	/// The other bits are interleaved following the previous sequence.
176 	///
177 	/// @see gtx_bit
178 	GLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z);
179 
180 	/// Interleaves the bits of x, y and z.
181 	/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.
182 	/// The other bits are interleaved following the previous sequence.
183 	///
184 	/// @see gtx_bit
185 	GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z);
186 
187 	/// Interleaves the bits of x, y and z.
188 	/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.
189 	/// The other bits are interleaved following the previous sequence.
190 	///
191 	/// @see gtx_bit
192 	GLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y, int32 z);
193 
194 	/// Interleaves the bits of x, y and z.
195 	/// The first bit is the first bit of x followed by the first bit of y and the first bit of z.
196 	/// The other bits are interleaved following the previous sequence.
197 	///
198 	/// @see gtx_bit
199 	GLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z);
200 
201 	/// Interleaves the bits of x, y, z and w.
202 	/// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w.
203 	/// The other bits are interleaved following the previous sequence.
204 	///
205 	/// @see gtx_bit
206 	GLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w);
207 
208 	/// Interleaves the bits of x, y, z and w.
209 	/// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w.
210 	/// The other bits are interleaved following the previous sequence.
211 	///
212 	/// @see gtx_bit
213 	GLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w);
214 
215 	/// Interleaves the bits of x, y, z and w.
216 	/// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w.
217 	/// The other bits are interleaved following the previous sequence.
218 	///
219 	/// @see gtx_bit
220 	GLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w);
221 
222 	/// Interleaves the bits of x, y, z and w.
223 	/// The first bit is the first bit of x followed by the first bit of y, the first bit of z and finally the first bit of w.
224 	/// The other bits are interleaved following the previous sequence.
225 	///
226 	/// @see gtx_bit
227 	GLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w);
228 
229 	/// @}
230 } //namespace glm
231 
232 #include "bit.inl"
233 
234 #endif//GLM_GTX_bit
235