Changeset d318a18 for src/Common
- Timestamp:
- Jul 18, 2018, 5:18:29 PM (7 years ago)
- Branches:
- new-env
- Children:
- eff03a94
- Parents:
- 5c14030
- Location:
- src/Common
- Files:
-
- 4 edited
-
GC.cc (modified) (2 diffs)
-
GC.h (modified) (1 diff)
-
PersistentDisjointSet.h (modified) (3 diffs)
-
PersistentMap.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Common/GC.cc
r5c14030 rd318a18 41 41 42 42 const GC& GC::operator<< (const GC_Object* obj) const { 43 if( obj ) 44 { 43 if( obj ) { 45 44 if( obj->mark != this->mark ) { 46 45 obj->mark = this->mark; … … 49 48 } 50 49 return *this; 50 } 51 52 bool GC::notrace_mark(const GC_Object* obj) const { 53 if ( obj && obj->mark != this->mark ) { 54 obj->mark = this->mark; 55 return true; 56 } 57 return false; 51 58 } 52 59 -
src/Common/GC.h
r5c14030 rd318a18 38 38 /// Traces a traceable object 39 39 const GC& operator<< (const GC_Object*) const; 40 41 /// No-trace mark; returns true if the object exists and was not already marked 42 bool notrace_mark(const GC_Object*) const; 40 43 41 44 /// Adds a new object to garbage collection -
src/Common/PersistentDisjointSet.h
r5c14030 rd318a18 281 281 const Base& rerooted() const { 282 282 reroot(); 283 assertf(mode == BASE, "reroot results in base"); 283 284 return as<Base>(); 284 285 } … … 332 333 } 333 334 334 /// Adds fresh class including only one item; returns updated map 335 /// Adds fresh class including only one item; returns updated map (or self if no change) 335 336 template<typename E> 336 337 Self* add(E&& i) { 337 338 reroot(); 338 339 // transfer map to new node 340 Self* ret = new Self{ BASE, take_as<Base>() }; 339 340 // add new element to node 341 Base base_map = take_as<Base>(); 342 bool added = base_map.emplace( i, Node{ i } ).second; 343 344 // fail early on node already present 345 if ( ! added ) { 346 as<Base>() = std::move(base_map); 347 return this; 348 } 349 350 // make new return node and reset self as REM node 351 Self* ret = new Self{ BASE, std::move(base_map) }; 341 352 reset_as_base(); 342 343 // set self to REM node344 353 init<Add>( ret, i ); 345 354 mode = REM; 346 347 // add element in returned map348 Base& base_map = ret->as<Base>();349 bool added = base_map.emplace( i, Node{ std::forward<E>(i) } ).second;350 assertf(added, "added element already present in map");351 355 352 356 return ret; … … 460 464 const Base& self = rerooted(); 461 465 462 Elm crnt = i; 463 do { 466 // exit early if class not present 467 auto it = self.find( i ); 468 if ( it == self.end() ) return; 469 470 // apply f to each member of class 471 f( i ); 472 for ( Elm crnt = it->second.next; crnt != i; crnt = it->second.next ) { 464 473 f( crnt ); 465 autoit = self.find( crnt );474 it = self.find( crnt ); 466 475 assertf( it != self.end(), "current node must exist in base" ); 467 crnt = it->second.next; 468 } while ( crnt != i ); 476 } 469 477 } 470 478 -
src/Common/PersistentMap.h
r5c14030 rd318a18 141 141 gc.maybe_trace( entry.first, entry.second ); 142 142 } 143 return; 144 } 143 } break; 145 144 case REM: { 146 145 const Rem& self = as<Rem>(); 147 146 gc << self.base; 148 147 gc.maybe_trace( self.key ); 149 return; 150 } 148 } break; 151 149 case INS: case UPD: { 152 150 const Ins& self = as<Ins>(); 153 151 gc << self.base; 154 152 gc.maybe_trace( self.key, self.val ); 155 return; 156 } 153 } break; 157 154 default: assertf(false, "invalid mode"); 158 155 } … … 198 195 199 196 base_map.erase( it ); 200 break; 201 } 197 } break; 202 198 case INS: { 203 199 Ins& self = mut_this->as<Ins>(); … … 207 203 208 204 base_map.emplace( std::move(self.key), std::move(self.val) ); 209 break; 210 } 205 } break; 211 206 case UPD: { 212 207 Ins& self = mut_this->as<Ins>(); … … 218 213 219 214 it->second = std::move(self.val); 220 break; 221 } 215 } break; 222 216 default: assertf(false, "invalid mode"); 223 217 }
Note:
See TracChangeset
for help on using the changeset viewer.