- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Patterns/ObservedIterator.hpp
rf2cefdb rf2bb0f 36 36 37 37 ObservedIterator(_Iter iter,Observable *obs) : 38 iter(iter), 39 collection(obs), 40 protector(0) 41 {} 38 iter(iter) 39 { 40 // for this we actually get a lock on the heap, 41 // so we can copy ourselves 42 protector = new Observable::_Observable_protector(obs); 43 } 42 44 43 45 ObservedIterator(const ObservedIterator &dest) : 44 iter(dest.iter) ,45 collection(dest.collection),46 protector (dest.copyLock())47 {}46 iter(dest.iter) 47 { 48 protector = new Observable::_Observable_protector(*dest.protector); 49 } 48 50 49 51 ~ObservedIterator(){ … … 56 58 if(&dest !=this){ 57 59 // get the new lock first, in case the two locks point to the same observable 58 Observable::_Observable_protector *newLock = dest.copyLock(); 59 if(protector) 60 delete protector; 60 Observable::_Observable_protector *newLock = new Observable::_Observable_protector(*dest.protector); 61 delete protector; 61 62 protector = newLock; 62 63 // After the new lock is aquired we can safely set the iterator 63 64 iter = dest.iter; 64 // we need to know the collection, in case we still have to set the lock65 collection = dest.collection;66 65 } 67 66 return *this; … … 84 83 { 85 84 --iter; 86 return *this;87 85 } 88 86 … … 103 101 104 102 value_type operator*(){ 105 // access is requested... time to get the lock106 acquireLock();107 103 return (*iter); 108 104 } … … 115 111 116 112 private: 117 118 /**119 * gets the lock for the collection when needed120 *121 * The lock is only acquired when the first change is done, so we can be free to do122 * anything with the iterator before that. I.e. step forward, turn into a const_iterator123 * etc.124 */125 void acquireLock(){126 if(!protector)127 protector = new Observable::_Observable_protector(collection);128 }129 130 Observable::_Observable_protector *copyLock() const{131 // we only copy if we actually carry a lock132 if(protector){133 return new Observable::_Observable_protector(*protector);134 }135 else{136 return 0;137 }138 }139 140 113 _Iter iter; 141 Observable *collection;142 114 Observable::_Observable_protector *protector; 143 115 };
Note:
See TracChangeset
for help on using the changeset viewer.