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