Skip to content

Commit

Permalink
Fixed|libdeng2: Improvements to the Observers template
Browse files Browse the repository at this point in the history
It is not a good idea to release the _members set at any time; it
might be in use in loop iteration when the last member is removed.
Now _members is deleted only in the Loop destructor.
  • Loading branch information
skyjake committed Apr 27, 2013
1 parent f2730ca commit 60199ac
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions doomsday/libdeng2/include/de/data/observers.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,11 +144,14 @@ namespace de
_next = observers.begin();
next();
}
~Loop() {
_observers.releaseMembersIfEmpty();
}
bool done() {
return _current == _observers.end();
}
void next() {
_current = _next;
_current = _next;
if(_next != _observers.end())
{
++_next;
Expand All @@ -169,6 +172,8 @@ namespace de
iterator _current;
iterator _next;
};

friend class Loop;

public:
Observers() : _members(0) {}
Expand All @@ -187,8 +192,6 @@ namespace de
}

Observers<Type> &operator = (Observers<Type> const &other) {
// If _members already exists, the instance is retained
// in case someone is using it.
if(other._members) {
checkExists();
_members->clear();
Expand Down Expand Up @@ -227,10 +230,6 @@ namespace de
void remove(Type *observer) {
if(_members) {
_members->erase(observer);
if(!_members->size()) {
delete _members;
_members = 0;
}
}
}

Expand Down Expand Up @@ -290,7 +289,15 @@ namespace de
_members = new Members;
}
}


void releaseMembersIfEmpty() {
// This shouldn't be called if the set is being iterated.
if(!_members->size()) {
delete _members;
_members = 0;
}
}

private:
Members *_members;
};
Expand Down

0 comments on commit 60199ac

Please sign in to comment.