xref: /haiku/headers/private/shared/binary-utils.h (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 /*
2  * Copyright 2009, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Brecht Machiels, brecht@mos6581.org
7  */
8 
9 #ifndef _BINARY_UTILS_H
10 #define _BINARY_UTILS_H
11 
12 
13 /* macro for a one-bit bitmask
14 */
15 
16 #define BIT(n)	(1ULL << n)
17 
18 /* macro/templates to create bitmasks
19 */
20 
21 #define BITMASK(high, low)	((unsigned long long)(BitMask<high, low>::value))
22 
23 template<int h, int l>
24 struct BitMask
25 {
26 	enum { value = (BitMask<h-l-1,0>::value +
27 		(1ULL << h - l)) << l };
28 };
29 
30 
31 template<>
32 struct BitMask<-1,0>
33 {
34 	enum { value = 0ULL };
35 };
36 
37 
38 /* macro/templates to enter binary constants
39 */
40 
41 #define BINARY(binstring)	((unsigned long long)(Binary<0##binstring>::value))
42 
43 // http://www.eptacom.net/pubblicazioni/pub_eng/binary.html
44 template<const unsigned long long N> struct Binary
45 {
46 	enum { value = (N % 8ULL) + 2ULL * Binary<N / 8ULL>::value };
47 };
48 
49 
50 template<>
51 struct Binary<0>
52 {
53 	enum { value = 0ULL } ;
54 };
55 
56 
57 /* macro/templates to determine offset
58 
59    NOTE: broken for high bit indices
60 */
61 
62 #define MASKOFFSET(mask)	(MaskOffset<mask, (mask & 1UL)>::count)
63 
64 template<const unsigned long mask, unsigned int firstBit>
65 struct MaskOffset
66 {
67 	enum { count = MaskOffset<(mask >> 1), ((mask >> 1) & 1UL)>::count + 1 };
68 };
69 
70 
71 template<const unsigned long mask>
72 struct MaskOffset<mask, 1>
73 {
74 	enum { count = 0 };
75 };
76 
77 #endif // _BINARY_UTILS_H
78 
79