using namespace listener ;
class Message: public Event {
public:
Message(const std::string& m): m_(m) {}
const std::string& message() const {return m_ ;}
private:
std::string m_ ;
} ;
class RadioOff: public Event {
} ;
class RadioStation: public Publisher {
public:
RadioStation(const std::string& name): name_(name) {}
~RadioStation() {igs_emit(RadioOff) ;}
void send(const std::string& m) {igs_emit(Message(name_+": "+m)) ;}
const std::string& name() {return name_ ;}
private:
std::string name_ ;
} ;
class Receiver: public Subscriber {
public:
void message(Message* e) {
std::cerr << e->message() << std::endl ;
}
void radio_off(RadioOff* e) {
RadioStation* s = dynamic_cast<RadioStation*>(e->get_source()) ;
std::cerr << "Radio " << s->name() << " is now off" << std::endl ;
}
} ;
int main() {
RadioStation* radio1 = new RadioStation("105.5") ;
RadioStation* radio2 = new RadioStation("98.3 ") ;
Receiver* r = new Receiver ;
igs_connect(radio1, r, igs_functor(r, Receiver::message)) ;
igs_connect(radio1, r, igs_functor(r, Receiver::radio_off)) ;
igs_connect(radio2, r, igs_functor(r, Receiver::message)) ;
igs_connect(radio2, r, igs_functor(r, Receiver::radio_off)) ;
radio1->send("News") ;
radio2->send("Music") ;
delete radio1 ;
radio2->send("Informations") ;
igs_disconnect(radio2, r, igs_functor(r, Receiver::message)) ;
radio2->send("Variety") ;
delete radio2 ;
}
Will print:
105.5: News 98.3 : Music Radio 105.5 is now off 98.3 : Informations Radio 98.3 is now off