Subversion Repositories gelsvn

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 bj 1
#ifndef __CGLA__BITMASK_H__
2
#define __CGLA__BITMASK_H__
3
 
4
#include "Vec3i.h"
5
 
6
namespace CGLA
7
{
8
	const int MASKS[33] = 
9
		{
10
			0x00000000,
11
			0x00000001,
12
			0x00000003,
13
			0x00000007,
14
			0x0000000f,
15
			0x0000001f,
16
			0x0000003f,
17
			0x0000007f,
18
			0x000000ff,
19
			0x000001ff,
20
			0x000003ff,
21
			0x000007ff,
22
			0x00000fff,
23
			0x00001fff,
24
			0x00003fff,
25
			0x00007fff,
26
			0x0000ffff,
27
			0x0001ffff,
28
			0x0003ffff,
29
			0x0007ffff,
30
			0x000fffff,
31
			0x001fffff,
32
			0x003fffff,
33
			0x007fffff,
34
			0x00ffffff,
35
			0x01ffffff,
36
			0x03ffffff,
37
			0x07ffffff,
38
			0x0fffffff,
39
			0x1fffffff,
40
			0x3fffffff,
41
			0x7fffffff,
42
			0xffffffff
43
		};
44
 
45
	/** The BitMask class is mostly a utility class.
46
			The main purpose is to be able to extract a set of bits from
47
			an integer. For instance this can be useful if we traverse
48
			some tree structure and the integer is the index. */
49
	class BitMask
50
	{
51
		int fb, lb, bdiff;
52
		int msk;
53
 
54
	public:
55
 
56
		/** Mask _fb-_lb+1 bits beginning from _fb. First bit is 0.
57
				Say _fb=_lb=0. In this case, mask 1 bit namely 0.*/
58
		BitMask(int _fb, int _lb):
59
			fb(_fb), lb(_lb), 
60
			bdiff(lb-fb+1), msk(MASKS[bdiff]<<fb)
61
		{}
62
 
63
		/// first bit is 0 mask num bits.
64
		BitMask(int num):
65
			fb(0),lb(two_to_what_power(num)-1), 
66
			bdiff(lb-fb+1), msk(MASKS[bdiff]<<fb)
67
		{}
68
 
69
		/// Mask everything.
70
		BitMask():
71
			fb(0), lb(15),
72
			bdiff(lb-fb+1), msk(MASKS[bdiff]<<fb)
73
		{}
74
 
75
		/// get number of first bit in mask
76
		int first_bit() const {return fb;} 
77
 
78
		/// get number of last bit in mask
79
 		int last_bit() const {return lb;}
80
 
81
		/// Return number of masked bits
82
		int no_bits() const {return bdiff;}
83
 
84
		/// Mask a number
85
		int mask(int var) const {return msk&var;}
86
 
87
		/** Mask a number and shift back so the first bit inside
88
				the mask becomes bit 0. */
89
		int mask_shift(int var) const {return (msk&var)>>fb;}
90
 
91
		/** Mask a vector by masking each coordinate. */
92
		Vec3i mask(const Vec3i& v) const 
93
		{
94
			return Vec3i(mask(v[0]),mask(v[1]),mask(v[2]));
95
		}
96
 
97
		/** Mask each coord of a vector and shift */
98
		Vec3i maskshift(const Vec3i& v) const 
99
		{
100
			return Vec3i(mask_shift(v[0]),mask_shift(v[1]),mask_shift(v[2]));
101
		}
102
 
103
	};
104
 
105
}
106
#endif