Титульная страница   Пространства имен   Иерархия классов   Алфавитный указатель   Классы   Файлы   Члены пространства имен   Члены классов   Члены файла  

Шаблон класса Publisher< M >

Данный класс является издателем, передающим сообщения типа M всем подписанным подписчикам (класс Subscriber). Подробнее...

#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 >


Подробное описание

template<class M>
class Publisher< M >

Данный класс является издателем, передающим сообщения типа M всем подписанным подписчикам (класс Subscriber).

Кроме сообщений, передаваемых из функции send(), Publisher самостоятельно передает сообщения о подписке и прекращении подписки. Им гарантируется, что подписавшийся подписчик всегда получит subscribedMsg() и unsubscribedMsg() сообщения (которые могут служить своего рода аналогами конструктора и деструктора), а все сообщения, передаваемые посредством send(), будут заключены между ними. Деструктор класса Publisher корректно информирует всех подписавшихся о прекращении подписки.

См. определение в файле pubsub.hpp строка 65


Конструктор(ы)

template<class M>
Publisher< M >::Publisher const Publisher< M > &   )  [private]
 

запрещаем копирование.

template<class M>
Publisher< M >::Publisher  )  [inline]
 

Создает объект.

См. определение в файле pubsub.hpp строка 80

00080 {}

template<class M>
Publisher< M >::~Publisher  )  [virtual]
 

Проходит по всем подписчикам и удаляет себя из их списков издателей.

В процессе удаления подписчики получают сообщение о прекращении подписки, т.е. вызывается их функция 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 }


Методы

template<class M>
bool Publisher< M >::isSubscribed Subscriber< M > &  sub  )  const [inline]
 

Возвращает true, если переданный подписчик в настоящее время подписан.

См. определение в файле pubsub.hpp строка 107

00108       {
00109        return impl.isSubscribed(&sub);
00110       }

template<class M>
Publisher& Publisher< M >::operator= const Publisher< M > &   )  [private]
 

запрещаем присваивание.

template<class M>
int Publisher< M >::send const M &  msg  ) 
 

Отправляет переданное сообщение всем подписанным подписчикам, т.е.

вызывается функция 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 }

template<class M>
int Publisher< M >::subCount  )  const [inline]
 

Возвращает количество подписанных подписчиков.

См. определение в файле pubsub.hpp строка 115

00115 { return impl.subCount(); }

template<class M>
bool Publisher< M >::subscribe Subscriber< M > &  sub  ) 
 

Подписывает переданного подписчика (если он еще не был подписан) и передает ему сообщение о подписке, т.е.

вызывается его функция 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 }

template<class M>
bool Publisher< M >::unsubscribe Subscriber< M > &  sub  ) 
 

Отменяет подписку переданного подписчика (если он был подписан) и передает ему сообщение о прекращении подписки, т.е.

вызывается его функция 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 }


Данные класса

template<class M>
PubSub_private::PubImpl Publisher< M >::impl [private]
 

часть реализации, не зависящая от параметра M

См. определение в файле pubsub.hpp строка 69

Используется в Publisher< M >::send(), Publisher< M >::subscribe(), Publisher< M >::unsubscribe() и Publisher< M >::~Publisher().


Объявления и описания членов класса находятся в файле:
Документация по ftext. Последние изменения: Sat Mar 20 17:58:15 2004. Создано системой doxygen1.3