Changeset 361:ab0899df30d2 in lemon-0.x
- Timestamp:
- 04/21/04 17:46:40 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@489
- Location:
- src/work/klao
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/work/klao/iter_map.h
r347 r361 17 17 /// \todo Decide whether we need all the range checkings!!! 18 18 19 template<typename KeyIntMap, uint8_t N >19 template<typename KeyIntMap, uint8_t N, typename Val = uint8_t> 20 20 class IterableMap { 21 21 public: 22 22 23 23 typedef typename KeyIntMap::KeyType KeyType; 24 typedef uint8_tValueType;24 typedef Val ValueType; 25 25 26 26 typedef typename std::vector<KeyType>::const_iterator iterator; … … 30 30 std::vector<KeyType> data; 31 31 size_t bounds[N]; 32 Val def_val; 32 33 33 uint8_t find(size_t a) const { 34 uint8_t n=0; 35 for(; n<N && bounds[n]<=a; ++n); 36 return n; 34 Val find(size_t a) const { 35 for(uint8_t n=0; n<N; ++n) { 36 if(bounds[n] > a) 37 return n; 38 } 39 return def_val; 37 40 } 38 41 … … 67 70 public: 68 71 69 IterableMap(KeyIntMap &_base ) : base(_base) {72 IterableMap(KeyIntMap &_base, Val d = N+1) : base(_base), def_val(d) { 70 73 memset(bounds, 0, sizeof(bounds)); 71 74 // for(int i=0; i<N; ++i) { bounds[i]=0; } 72 75 } 73 76 74 uint8_toperator[](const KeyType& k) const {77 Val operator[](const KeyType& k) const { 75 78 return find(base[k]); 76 79 } 77 80 78 void set(const KeyType& k, uint8_t n) { 81 void set(const KeyType& k, Val n) { 82 // FIXME: n < N ??? 79 83 size_t a = base[k]; 80 if(a < bounds[N-1] ) {84 if(a < bounds[N-1] && n < N) { 81 85 base.set(k, move(a, find(a), n)); 82 86 } 83 87 } 84 88 85 void insert(const KeyType& k, uint8_tn) {86 if(n <N) {89 void insert(const KeyType& k, Val n) { 90 if(n < N) { 87 91 data.push_back(k); 88 92 base.set(k, move(bounds[N-1]++, N-1, n)); … … 90 94 } 91 95 92 iterator begin( uint8_tn) const {96 iterator begin(Val n) const { 93 97 if(n < N) 94 98 return data.begin() + (n ? bounds[n-1] : 0); … … 97 101 } 98 102 99 iterator end( uint8_tn) const {103 iterator end(Val n) const { 100 104 if(n < N) 101 105 return data.begin() + bounds[n]; … … 104 108 } 105 109 106 size_t size( uint8_tn) const {110 size_t size(Val n) const { 107 111 if(n < N) 108 112 return bounds[n] - (n ? bounds[n-1] : 0); … … 118 122 }; 119 123 124 125 126 127 template<typename KeyIntMap> 128 class IterableBoolMap : public IterableMap<KeyIntMap, 2, bool> { 129 typedef IterableMap<KeyIntMap, 2, bool> Parent; 130 131 public: 132 IterableBoolMap(KeyIntMap &_base, bool d = false) : Parent(_base, d) {} 133 }; 134 120 135 } 121 136 #endif -
src/work/klao/iter_map_test.cc
r347 r361 11 11 typedef StdMap<int,int> BaseMap; 12 12 typedef IterableMap<BaseMap, N> TestMap; 13 14 15 void print(TestMap const& m) { 13 typedef IterableBoolMap<BaseMap> TestBoolMap; 14 15 16 template<typename TM> 17 void print(TM const& m, int N = 3) { 16 18 cout << "Size of the map: " << m.size() << endl; 17 19 for(int i=0; i<N; ++i) { 18 20 cout << " Class " << i << ". (size=" << m.size(i) << "): " << flush; 19 21 cout << " "; 20 for( TestMap::iterator j = m.begin(i); j!=m.end(i); ++j) {22 for(typename TM::iterator j = m.begin(i); j!=m.end(i); ++j) { 21 23 cout << " " << *j; 22 24 } … … 29 31 int main() { 30 32 31 BaseMap base(344); 32 TestMap test(base); 33 34 35 print(test); 36 37 cout << "Inserting 12 to class 2...\n"; 38 test.insert(12,2); 39 print(test); 40 41 42 cout << "Inserting 22 to class 2...\n"; 43 test.insert(22,2); 44 print(test); 45 46 cout << "Testing some map values:\n"; 47 cout << " 12: " << int(test[12]) << endl; 48 49 cout << "Inserting 10 to class 0...\n"; 50 test.insert(10,0); 51 print(test); 52 53 cout << "Testing some map values:\n"; 54 cout << " 12: " << int(test[12]) << endl; 55 56 cout << "Inserting 11 to class 1...\n"; 57 test.insert(11,1); 58 print(test); 59 60 cout << "Testing some map values:\n"; 61 cout << " 12: " << int(test[12]) << endl; 62 cout << " 22: " << int(test[22]) << endl; 63 cout << " 10: " << int(test[10]) << endl; 64 cout << " 11: " << int(test[11]) << endl; 65 cout << " 42: " << int(test[42]) << endl; 66 67 cout << "Inserting 21 to class 1...\n"; 68 test.insert(21,1); 69 print(test); 70 71 cout << "Inserting 20 to class 1...\n"; 72 test.insert(20,0); 73 print(test); 74 75 cout << "Testing some map values:\n"; 76 cout << " 12: " << int(test[12]) << endl; 77 cout << " 22: " << int(test[22]) << endl; 78 cout << " 10: " << int(test[10]) << endl; 79 cout << " 20: " << int(test[20]) << endl; 80 cout << " 11: " << int(test[11]) << endl; 81 cout << " 21: " << int(test[21]) << endl; 82 cout << " 42: " << int(test[42]) << endl; 83 84 cout << "Setting 20 to class 2...\n"; 85 test.set(20,2); 86 print(test); 87 88 cout << "Setting 10 to class 1...\n"; 89 test.set(10,1); 90 print(test); 91 92 cout << "Setting 11 to class 1...\n"; 93 test.set(11,1); 94 print(test); 95 96 cout << "Setting 12 to class 1...\n"; 97 test.set(12,1); 98 print(test); 99 100 cout << "Setting 21 to class 2...\n"; 101 test.set(21,2); 102 print(test); 103 104 cout << "Setting 22 to class 2...\n"; 105 test.set(22,2); 106 print(test); 107 108 cout << "Testing some map values:\n"; 109 cout << " 12: " << int(test[12]) << endl; 110 cout << " 22: " << int(test[22]) << endl; 111 cout << " 10: " << int(test[10]) << endl; 112 cout << " 20: " << int(test[20]) << endl; 113 cout << " 11: " << int(test[11]) << endl; 114 cout << " 21: " << int(test[21]) << endl; 115 cout << " 42: " << int(test[42]) << endl; 116 33 { 34 BaseMap base(344); 35 TestMap test(base); 36 37 38 print(test); 39 40 cout << "Inserting 12 to class 2...\n"; 41 test.insert(12,2); 42 print(test); 43 44 45 cout << "Inserting 22 to class 2...\n"; 46 test.insert(22,2); 47 print(test); 48 49 cout << "Testing some map values:\n"; 50 cout << " 12: " << int(test[12]) << endl; 51 52 cout << "Inserting 10 to class 0...\n"; 53 test.insert(10,0); 54 print(test); 55 56 cout << "Testing some map values:\n"; 57 cout << " 12: " << int(test[12]) << endl; 58 59 cout << "Inserting 11 to class 1...\n"; 60 test.insert(11,1); 61 print(test); 62 63 cout << "Testing some map values:\n"; 64 cout << " 12: " << int(test[12]) << endl; 65 cout << " 22: " << int(test[22]) << endl; 66 cout << " 10: " << int(test[10]) << endl; 67 cout << " 11: " << int(test[11]) << endl; 68 cout << " 42: " << int(test[42]) << endl; 69 70 cout << "Inserting 21 to class 1...\n"; 71 test.insert(21,1); 72 print(test); 73 74 cout << "Inserting 20 to class 1...\n"; 75 test.insert(20,0); 76 print(test); 77 78 cout << "Testing some map values:\n"; 79 cout << " 12: " << int(test[12]) << endl; 80 cout << " 22: " << int(test[22]) << endl; 81 cout << " 10: " << int(test[10]) << endl; 82 cout << " 20: " << int(test[20]) << endl; 83 cout << " 11: " << int(test[11]) << endl; 84 cout << " 21: " << int(test[21]) << endl; 85 cout << " 42: " << int(test[42]) << endl; 86 87 cout << "Setting 20 to class 2...\n"; 88 test.set(20,2); 89 print(test); 90 91 cout << "Setting 10 to class 1...\n"; 92 test.set(10,1); 93 print(test); 94 95 cout << "Setting 11 to class 1...\n"; 96 test.set(11,1); 97 print(test); 98 99 cout << "Setting 12 to class 1...\n"; 100 test.set(12,1); 101 print(test); 102 103 cout << "Setting 21 to class 2...\n"; 104 test.set(21,2); 105 print(test); 106 107 cout << "Setting 22 to class 2...\n"; 108 test.set(22,2); 109 print(test); 110 111 cout << "Testing some map values:\n"; 112 cout << " 12: " << int(test[12]) << endl; 113 cout << " 22: " << int(test[22]) << endl; 114 cout << " 10: " << int(test[10]) << endl; 115 cout << " 20: " << int(test[20]) << endl; 116 cout << " 11: " << int(test[11]) << endl; 117 cout << " 21: " << int(test[21]) << endl; 118 cout << " 42: " << int(test[42]) << endl; 119 } 120 121 { 122 cout << "Testing the IterableBoolMap...\n"; 123 124 BaseMap base(344); 125 TestBoolMap test(base); 126 127 128 print(test,2); 129 130 cout << "Inserting 12 to class true...\n"; 131 test.insert(12,true); 132 print(test,2); 133 134 135 cout << "Inserting 22 to class true...\n"; 136 test.insert(22,true); 137 print(test,2); 138 139 cout << "Testing some map values:\n"; 140 cout << " 12: " << test[12] << endl; 141 142 cout << "Inserting 10 to class false...\n"; 143 test.insert(10,false); 144 print(test,2); 145 146 cout << "Testing some map values:\n"; 147 cout << " 12: " << test[12] << endl; 148 149 cout << "Inserting 11 to class false...\n"; 150 test.insert(11,false); 151 print(test,2); 152 153 cout << "Testing some map values:\n"; 154 cout << " 12: " << test[12] << endl; 155 cout << " 22: " << test[22] << endl; 156 cout << " 10: " << test[10] << endl; 157 cout << " 11: " << test[11] << endl; 158 cout << " 42: " << test[42] << endl; 159 160 cout << "Inserting 21 to class 1...\n"; 161 test.insert(21,1); 162 print(test,2); 163 164 cout << "Inserting 20 to class 1...\n"; 165 test.insert(20,0); 166 print(test,2); 167 168 cout << "Testing some map values:\n"; 169 cout << " 12: " << test[12] << endl; 170 cout << " 22: " << test[22] << endl; 171 cout << " 10: " << test[10] << endl; 172 cout << " 20: " << test[20] << endl; 173 cout << " 11: " << test[11] << endl; 174 cout << " 21: " << test[21] << endl; 175 cout << " 42: " << test[42] << endl; 176 177 cout << "Setting 20 to class 2...\n"; 178 test.set(20,2); 179 print(test,2); 180 181 cout << "Setting 10 to class 1...\n"; 182 test.set(10,1); 183 print(test,2); 184 185 cout << "Setting 11 to class 1...\n"; 186 test.set(11,1); 187 print(test,2); 188 189 cout << "Setting 12 to class 1...\n"; 190 test.set(12,1); 191 print(test,2); 192 193 cout << "Setting 21 to class 2...\n"; 194 test.set(21,2); 195 print(test,2); 196 197 cout << "Setting 22 to class 2...\n"; 198 test.set(22,2); 199 print(test,2); 200 201 cout << "Testing some map values:\n"; 202 cout << " 12: " << test[12] << endl; 203 cout << " 22: " << test[22] << endl; 204 cout << " 10: " << test[10] << endl; 205 cout << " 20: " << test[20] << endl; 206 cout << " 11: " << test[11] << endl; 207 cout << " 21: " << test[21] << endl; 208 cout << " 42: " << test[42] << endl; 209 210 } 117 211 }
Note: See TracChangeset
for help on using the changeset viewer.