1 // Document/View sample for Boost.Signals2. 2 // Expands on doc_view.cpp example by using automatic 3 // connection management. 4 // 5 // Copyright Keith MacDonald 2005. 6 // Copyright Frank Mori Hess 2009. 7 // 8 // Use, modification and 9 // distribution is subject to the Boost Software License, Version 10 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at 11 // http://www.boost.org/LICENSE_1_0.txt) 12 // For more information, see http://www.boost.org 13 14 #include <iostream> 15 #include <string> 16 #include <boost/bind.hpp> 17 #include <boost/io/ios_state.hpp> 18 #include <boost/signals2/signal.hpp> 19 #include <boost/shared_ptr.hpp> 20 21 class Document 22 { 23 public: 24 typedef boost::signals2::signal<void ()> signal_t; 25 26 public: Document()27 Document() 28 {} 29 30 /* connect a slot to the signal which will be emitted whenever 31 text is appended to the document. */ connect(const signal_t::slot_type & subscriber)32 boost::signals2::connection connect(const signal_t::slot_type &subscriber) 33 { 34 return m_sig.connect(subscriber); 35 } 36 append(const char * s)37 void append(const char* s) 38 { 39 m_text += s; 40 m_sig(); 41 } 42 getText() const43 const std::string& getText() const 44 { 45 return m_text; 46 } 47 48 private: 49 signal_t m_sig; 50 std::string m_text; 51 }; 52 53 class TextView 54 { 55 public: 56 // static factory function that sets up automatic connection tracking create(Document & doc)57 static boost::shared_ptr<TextView> create(Document& doc) 58 { 59 boost::shared_ptr<TextView> new_view(new TextView(doc)); 60 { 61 typedef Document::signal_t::slot_type slot_type; 62 slot_type myslot(&TextView::refresh, new_view.get()); 63 doc.connect(myslot.track(new_view)); 64 } 65 return new_view; 66 } 67 refresh() const68 void refresh() const 69 { 70 std::cout << "TextView: " << m_document.getText() << std::endl; 71 } 72 private: 73 // private constructor to force use of static factory function TextView(Document & doc)74 TextView(Document &doc): m_document(doc) 75 {} 76 77 Document& m_document; 78 }; 79 80 class HexView 81 { 82 public: 83 // static factory function that sets up automatic connection tracking create(Document & doc)84 static boost::shared_ptr<HexView> create(Document& doc) 85 { 86 boost::shared_ptr<HexView> new_view(new HexView(doc)); 87 { 88 typedef Document::signal_t::slot_type slot_type; 89 slot_type myslot(&HexView::refresh, new_view.get()); 90 doc.connect(myslot.track(new_view)); 91 } 92 return new_view; 93 } 94 refresh() const95 void refresh() const 96 { 97 boost::io::ios_flags_saver ifs(std::cout); 98 const std::string& s = m_document.getText(); 99 100 std::cout << "HexView:"; 101 102 for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) 103 std::cout << ' ' << std::hex << static_cast<int>(*it); 104 105 std::cout << std::endl; 106 } 107 private: 108 // private constructor to force use of static factory function HexView(Document & doc)109 HexView(Document& doc): m_document(doc) 110 {} 111 112 Document& m_document; 113 }; 114 main(int argc,char * argv[])115int main(int argc, char* argv[]) 116 { 117 Document doc; 118 boost::shared_ptr<TextView> v1 = TextView::create(doc); 119 boost::shared_ptr<HexView> v2 = HexView::create(doc); 120 121 doc.append(argc >= 2 ? argv[1] : "Hello world!"); 122 123 v2.reset(); // destroy the HexView, automatically disconnecting 124 doc.append(" HexView should no longer be connected."); 125 126 return 0; 127 } 128