Проба
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 01.07.04 19:55
Оценка:
Всем привет!

Предлагаю вниманию критиков вот такой простенький класс, обеспечивающий уведомления о включении и исключении элементов.
Есть какие-нибудь замечания? Ну, указания на подводные грабли или советы, как сделать не так коряво?
Конечно, несмотря на громкое название, это даже близко не 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
Специалист — это варвар, невежество которого не всесторонне :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.