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