1 #ifndef __BOOLVECTOR__
2 #define __BOOLVECTOR__
3 
4 #include <vector>
5 
6 struct BoolVector{
BoolVectorBoolVector7 	BoolVector():mode(false){}
8 
9 	/* mode = 0, the set of marked elements are contained in the vector marked_elements		*/
10 	/* mode = 1, the set of marked elements correspond to truth value containedin is_marked */
11 	bool mode;
12 
13 	std::vector<unsigned int> marked_elements;
14 	std::vector<bool> is_marked;
15 
SetModeBoolVector16 	void SetMode(bool _mode){
17 								if(mode==_mode) return;
18 
19 								if(!mode){
20 									if(!marked_elements.empty()){
21 										std::sort(marked_elements.begin(),marked_elements.end());
22 										int max_value = marked_elements.back();
23 										is_marked.resize(max_value+1);
24 										unsigned int i = 0, j = 0;
25 										for(std::vector<unsigned int>::iterator  id = marked_elements.begin(); id != marked_elements.end();++id,++i){
26 											for( ; j < (*id);++j)  is_marked[j] = false;
27 											is_marked[(*id)] = true;
28 											++j;
29 										}
30 									}
31 								}else{
32 									marked_elements.clear();
33 									unsigned int i = 0;
34 									for(i = 0; i <is_marked.size(); ++i)
35 										if(is_marked[i])
36 											marked_elements.push_back(i);
37 								}
38 								mode = _mode;
39 	}
40 
SetAsVectorOfBoolBoolVector41 	void SetAsVectorOfBool(){SetMode(true);};
SetAsVectorOfMarkedBoolVector42 	void SetAsVectorOfMarked(){SetMode(false);};
43 
IsMarkedBoolVector44 	bool IsMarked(const unsigned int & i){
45 		assert(mode);						// disallow query when the vector is used (inefficient)
46 
47 		return	(i >= is_marked.size())?	// if the index is greater of than the size of the vector it is
48 				false:is_marked[i];			// false for sure (i.e. it has not been marked
49 	}
50 
SetMarkedBoolVector51 	void SetMarked(const unsigned int & i, bool value){
52 		if(!mode){
53 			RAssert(value);			// disallow unsetting when the vector is used
54 			// if(value)
55 			  marked_elements.push_back(i);
56 			return;
57 		}else{
58 			if(i >= is_marked.size())
59 				is_marked.resize(i+1);
60 			if(!is_marked[i] && value)         // marked_elements is kept valid as long as the are only setting to true
61 				marked_elements.push_back(i);
62 			is_marked[i] = value;
63 		}
64 	}
65 
ClearBoolVector66 	void Clear(){
67 		is_marked.clear();
68 		marked_elements.clear();
69 		}
EmptyBoolVector70 	bool Empty(){
71 		if(mode) return is_marked.empty();
72 		else return marked_elements.empty();
73 		}
74 
IsModeVectorOfMarkedBoolVector75 	bool IsModeVectorOfMarked(){return !mode;}
IsModeVectorOfBoolBoolVector76 	bool IsModeVectorOfBool(){return mode;}
77 };
78 
79 #endif
80