#include <pubsub.hpp>
Открытые члены | |
Publisher () | |
Создает объект. | |
virtual | ~Publisher () |
Проходит по всем подписчикам и удаляет себя из их списков издателей. | |
bool | subscribe (Subscriber< M > &sub) |
Подписывает переданного подписчика (если он еще не был подписан) и передает ему сообщение о подписке, т.е. | |
bool | unsubscribe (Subscriber< M > &sub) |
Отменяет подписку переданного подписчика (если он был подписан) и передает ему сообщение о прекращении подписки, т.е. | |
bool | isSubscribed (Subscriber< M > &sub) const |
Возвращает true, если переданный подписчик в настоящее время подписан. | |
int | subCount () const |
Возвращает количество подписанных подписчиков. | |
int | send (const M &msg) |
Отправляет переданное сообщение всем подписанным подписчикам, т.е. | |
Закрытые члены | |
Publisher (const Publisher &) | |
запрещаем копирование. | |
Publisher & | operator= (const Publisher &) |
запрещаем присваивание. | |
Закрытые данные | |
PubSub_private::PubImpl | impl |
часть реализации, не зависящая от параметра M | |
Друзья | |
class | Subscriber< M > |
Кроме сообщений, передаваемых из функции send(), Publisher самостоятельно передает сообщения о подписке и прекращении подписки. Им гарантируется, что подписавшийся подписчик всегда получит subscribedMsg() и unsubscribedMsg() сообщения (которые могут служить своего рода аналогами конструктора и деструктора), а все сообщения, передаваемые посредством send(), будут заключены между ними. Деструктор класса Publisher корректно информирует всех подписавшихся о прекращении подписки.
См. определение в файле pubsub.hpp строка 65
|
запрещаем копирование.
|
|
Создает объект.
См. определение в файле pubsub.hpp строка 80
00080 {} |
|
Проходит по всем подписчикам и удаляет себя из их списков издателей. В процессе удаления подписчики получают сообщение о прекращении подписки, т.е. вызывается их функция unsubscribedMsg(). См. определение в файле pubsub.hpp строка 193 Перекрестные ссылки Publisher< M >::impl, Subscriber< M >::pubs, PubSub_private::PubImpl::subs и Subscriber< M >::unsubscribedMsg().
00194 { 00195 for (PubSub_private::PubImpl::list_type::const_iterator cit=impl.subs.begin(), 00196 cend=impl.subs.end(); cit!=cend; ++cit) { 00197 Subscriber<M>* psub=static_cast<Subscriber<M>*>(*cit); 00198 psub->pubs.remove(this); 00199 00200 try { psub->unsubscribedMsg(*this); } 00201 catch (...) {} // игнорируем 00202 } 00203 } |
|
Возвращает true, если переданный подписчик в настоящее время подписан.
См. определение в файле pubsub.hpp строка 107
00108 { 00109 return impl.isSubscribed(&sub); 00110 } |
|
запрещаем присваивание.
|
|
Отправляет переданное сообщение всем подписанным подписчикам, т.е. вызывается функция regularMsg() каждого из них. Если regularMsg() вернет false, то подписчик будет сразу же отписан -- именно поэтому send() не является const функцией. Возвращает количество подписчиков, получивших сообщение. См. определение в файле pubsub.hpp строка 236 Перекрестные ссылки Publisher< M >::impl, Subscriber< M >::regularMsg(), PubSub_private::PubImpl::subs и Publisher< M >::unsubscribe(). Используется в FindTextImpl::found() и FindTextImpl::readLine().
00237 { 00238 int count=0; 00239 for (PubSub_private::PubImpl::list_type::iterator it=impl.subs.begin(), 00240 end=impl.subs.end(); it!=end; count++) { 00241 Subscriber<M>* psub=static_cast<Subscriber<M>*>(*it); 00242 00243 bool ret=1; 00244 try { ret=psub->regularMsg(*this, msg); } 00245 catch (...) {} // игнорируем 00246 00247 ++it; 00248 if (!ret) unsubscribe(*psub); 00249 } 00250 00251 return count; 00252 } |
|
Возвращает количество подписанных подписчиков.
См. определение в файле pubsub.hpp строка 115
|
|
Подписывает переданного подписчика (если он еще не был подписан) и передает ему сообщение о подписке, т.е. вызывается его функция subscribedMsg(). Возвращает false, если он уже был подписан. См. определение в файле pubsub.hpp строка 206 Перекрестные ссылки Publisher< M >::impl, Subscriber< M >::pubs, PubSub_private::PubImpl::subscribe() и Subscriber< M >::subscribedMsg().
00207 { 00208 bool ret=impl.subscribe(&sub); 00209 00210 if (ret) { 00211 sub.pubs.push_back(this); 00212 00213 try { sub.subscribedMsg(*this); } 00214 catch (...) {} // игнорируем 00215 } 00216 00217 return ret; 00218 } |
|
Отменяет подписку переданного подписчика (если он был подписан) и передает ему сообщение о прекращении подписки, т.е. вызывается его функция unsubscribedMsg(). Возвращает false, если подписчик не был подписан. См. определение в файле pubsub.hpp строка 221 Перекрестные ссылки Publisher< M >::impl, Subscriber< M >::pubs, PubSub_private::PubImpl::unsubscribe() и Subscriber< M >::unsubscribedMsg(). Используется в Publisher< M >::send().
00222 { 00223 bool ret=impl.unsubscribe(&sub); 00224 00225 if (ret) { 00226 sub.pubs.remove(this); 00227 00228 try { sub.unsubscribedMsg(*this); } 00229 catch (...) {} // игнорируем 00230 } 00231 00232 return ret; 00233 } |
|
часть реализации, не зависящая от параметра M
См. определение в файле pubsub.hpp строка 69 Используется в Publisher< M >::send(), Publisher< M >::subscribe(), Publisher< M >::unsubscribe() и Publisher< M >::~Publisher(). |