#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(). |
1.3