Subversion Repositories gelsvn

Rev

Rev 89 | Details | Compare with Previous | 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
 
89 jab 45
	/** \brief The BitMask class is mostly a utility class.
46
 
2 bj 47
			The main purpose is to be able to extract a set of bits from
48
			an integer. For instance this can be useful if we traverse
49
			some tree structure and the integer is the index. */
50
	class BitMask
51
	{
52
		int fb, lb, bdiff;
53
		int msk;
54
 
55
	public:
56
 
57
		/** Mask _fb-_lb+1 bits beginning from _fb. First bit is 0.
58
				Say _fb=_lb=0. In this case, mask 1 bit namely 0.*/
59
		BitMask(int _fb, int _lb):
60
			fb(_fb), lb(_lb), 
61
			bdiff(lb-fb+1), msk(MASKS[bdiff]<<fb)
62
		{}
63
 
64
		/// first bit is 0 mask num bits.
65
		BitMask(int num):
66
			fb(0),lb(two_to_what_power(num)-1), 
67
			bdiff(lb-fb+1), msk(MASKS[bdiff]<<fb)
68
		{}
69
 
70
		/// Mask everything.
71
		BitMask():
72
			fb(0), lb(15),
73
			bdiff(lb-fb+1), msk(MASKS[bdiff]<<fb)
74
		{}
75
 
76
		/// get number of first bit in mask
77
		int first_bit() const {return fb;} 
78
 
79
		/// get number of last bit in mask
80
 		int last_bit() const {return lb;}
81
 
82
		/// Return number of masked bits
83
		int no_bits() const {return bdiff;}
84
 
85
		/// Mask a number
86
		int mask(int var) const {return msk&var;}
87
 
88
		/** Mask a number and shift back so the first bit inside
89
				the mask becomes bit 0. */
90
		int mask_shift(int var) const {return (msk&var)>>fb;}
91
 
92
		/** Mask a vector by masking each coordinate. */
93
		Vec3i mask(const Vec3i& v) const 
94
		{
95
			return Vec3i(mask(v[0]),mask(v[1]),mask(v[2]));
96
		}
97
 
98
		/** Mask each coord of a vector and shift */
99
		Vec3i maskshift(const Vec3i& v) const 
100
		{
101
			return Vec3i(mask_shift(v[0]),mask_shift(v[1]),mask_shift(v[2]));
102
		}
103
 
104
	};
105
 
106
}
107
#endif