1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #ifndef MYGUI_BITWISE_H_
8 #define MYGUI_BITWISE_H_
9 
10 #include "MyGUI_Prerequest.h"
11 
12 namespace MyGUI
13 {
14 
15 	class Bitwise
16 	{
17 	public:
18 		/** Returns the closest power-of-two number greater or equal to value.
19 		*/
20 		template<typename Type>
firstPO2From(Type _value)21 		static inline Type firstPO2From(Type _value)
22 		{
23 			--_value;
24 			_value |= _value >> 16;
25 			_value |= _value >> 8;
26 			_value |= _value >> 4;
27 			_value |= _value >> 2;
28 			_value |= _value >> 1;
29 			++_value;
30 			return _value;
31 		}
32 
33 		/** Determines whether the number is power-of-two or not. */
34 		template<typename Type>
isPO2(Type _value)35 		static inline bool isPO2(Type _value)
36 		{
37 			return (_value & (_value - 1)) == 0;
38 		}
39 
40 		/** Returns the number of bits a pattern must be shifted right by to
41 		remove right-hand zeros.
42 		*/
43 		template<typename Type>
getBitShift(Type _mask)44 		static inline size_t getBitShift(Type _mask)
45 		{
46 			if (_mask == 0)
47 				return 0;
48 
49 			size_t result = 0;
50 			while ((_mask & 1) == 0)
51 			{
52 				++result;
53 				_mask >>= 1;
54 			}
55 			return result;
56 		}
57 	};
58 
59 } // namespace MyGUI
60 
61 #endif // MYGUI_BITWISE_H_
62