Всем привет!
Предлагаю вниманию критиков вот такой простенький класс, обеспечивающий уведомления о включении и исключении элементов.
Есть какие-нибудь замечания? Ну, указания на подводные грабли или советы, как сделать не так коряво?
Конечно, несмотря на громкое название, это даже близко не vector по богатству возможностей использования
События не стал полностью сливать в 1 класс: если захочу ввести какое-либо новое уведомление, ему, возможно, нужно будет передавать уже не index, а какие-то другие данные. Т.е. сигнатура функции OnXXXX будет уже другая.
template<typename T>
class ObservedVector {
std::vector<T> vec;
class EventHandler {
protected:
std::vector<EventHandler*> subscribers;
void AddSubscriber (EventHandler *adding) { //non-checked method
// needs to be wrapped
subscribers.push_back(adding);
}
void operator -= (EventHandler *removing) {
subscribers.erase(
std::find(subscribers.begin(),subscribers.end(),removing));
}
};
public:
int count() { return vec.size(); }
T& operator[] (int index) { return vec[index]; }
int include(T value) {
vec.push_back(value);
EventAfterInclusion.OnAfterInclusion(*this, vec.size()-1);
return vec.size()-1;
}
void exclude(int index) {
EventBeforeExclusion.OnBeforeExclusion(*this, index);
vec.erase( vec.begin()+index );
}
class AfterInclusionHandler : public EventHandler {
public:
virtual void OnAfterInclusion (ObservedVector<T> &sender, int index) {
for (int i=0; i<subscribers.size(); i++)
((AfterInclusionHandler*)subscribers[i])->OnAfterInclusion(sender, index);
};
void operator += (AfterInclusionHandler *adding) { AddSubscriber(adding); }
} EventAfterInclusion;
class BeforeExclusionHandler : public EventHandler {
public:
virtual void OnBeforeExclusion (ObservedVector<T> &sender, int index) {
for (int i=0; i<subscribers.size(); i++)
((BeforeExclusionHandler*)subscribers[i])->OnBeforeExclusion(sender, index);
};
void operator += (BeforeExclusionHandler *adding) { AddSubscriber(adding); }
} EventBeforeExclusion;
};
Slicer