#ifndef OBSERVER_IMPL_BASE_HPP #define OBSERVER_IMPL_BASE_HPP #include #include template class ReceiverImplBase; template class ObserverImplBase { public: virtual void AddReceiver(ReceiverImplBase* receiver) = 0; virtual void RemoveReceiver(ReceiverImplBase* receiver) = 0; virtual ReturnT Broadcast(ParamT param) = 0; virtual ReturnT Notify(ParamT param) = 0; }; template class ReceiverImplBase { public: virtual void AddObserver(ObserverImplBase* observer) = 0; virtual void RemoveObserver() = 0; virtual ReturnT Receive(ParamT param) = 0; virtual ReturnT Respond(ParamT param, ObserverImplBase* observer) = 0; }; template class ReceiverImpl; template class ObserverImpl : public ObserverImplBase { public: ObserverImpl() : count_(0) {} virtual ~ObserverImpl() {} virtual void AddReceiver(ReceiverImplBase* receiver) { if (receiver == NULL) return; receivers_[count_] = receiver; receiver->AddObserver(this); count_++; } virtual void RemoveReceiver(ReceiverImplBase* receiver) { if (receiver == NULL) return; ReceiversMap::iterator it = receivers_.begin(); for (; it != receivers_.end(); ++it) { if (it->second == receiver) { receivers_.erase(it); break; } } } virtual ReturnT Broadcast(ParamT param) { ReceiversMap::iterator it = receivers_.begin(); for (; it != receivers_.end(); ++it) { it->second->Receive(param); } return ReturnT(); } virtual ReturnT Notify(ParamT param) { ReceiversMap::iterator it = receivers_.begin(); for (; it != receivers_.end(); ++it) { it->second->Respond(param, this); } return ReturnT(); } protected: typedef std::map*> ReceiversMap; ReceiversMap receivers_; int count_; }; template class ReceiverImpl : public ReceiverImplBase { public: ReceiverImpl() : count_(0) {} virtual ~ReceiverImpl() {} virtual void AddObserver(ObserverImplBase* observer) { observers_[count_] = observer; count_++; } virtual void RemoveObserver() { ObserversMap::iterator it = observers_.begin(); for (; it != observers_.end(); ++it) { it->second->RemoveReceiver(this); } } virtual ReturnT Receive(ParamT param) { return ReturnT(); } virtual ReturnT Respond(ParamT param, ObserverImplBase* observer) { return ReturnT(); } protected: typedef std::map*> ObserversMap; ObserversMap observers_; int count_; }; #endif // OBSERVER_IMPL_BASE_HPP