123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- // Document/View sample for Boost.Signals2.
- // Expands on doc_view.cpp example by using automatic
- // connection management.
- //
- // Copyright Keith MacDonald 2005.
- // Copyright Frank Mori Hess 2009.
- //
- // Use, modification and
- // distribution is subject to the Boost Software License, Version
- // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- // For more information, see http://www.boost.org
- #include <iostream>
- #include <string>
- #include <boost/bind.hpp>
- #include <boost/io/ios_state.hpp>
- #include <boost/signals2/signal.hpp>
- #include <boost/shared_ptr.hpp>
- class Document
- {
- public:
- typedef boost::signals2::signal<void ()> signal_t;
- public:
- Document()
- {}
- /* connect a slot to the signal which will be emitted whenever
- text is appended to the document. */
- boost::signals2::connection connect(const signal_t::slot_type &subscriber)
- {
- return m_sig.connect(subscriber);
- }
- void append(const char* s)
- {
- m_text += s;
- m_sig();
- }
- const std::string& getText() const
- {
- return m_text;
- }
- private:
- signal_t m_sig;
- std::string m_text;
- };
- class TextView
- {
- public:
- // static factory function that sets up automatic connection tracking
- static boost::shared_ptr<TextView> create(Document& doc)
- {
- boost::shared_ptr<TextView> new_view(new TextView(doc));
- {
- typedef Document::signal_t::slot_type slot_type;
- slot_type myslot(&TextView::refresh, new_view.get());
- doc.connect(myslot.track(new_view));
- }
- return new_view;
- }
- void refresh() const
- {
- std::cout << "TextView: " << m_document.getText() << std::endl;
- }
- private:
- // private constructor to force use of static factory function
- TextView(Document &doc): m_document(doc)
- {}
- Document& m_document;
- };
- class HexView
- {
- public:
- // static factory function that sets up automatic connection tracking
- static boost::shared_ptr<HexView> create(Document& doc)
- {
- boost::shared_ptr<HexView> new_view(new HexView(doc));
- {
- typedef Document::signal_t::slot_type slot_type;
- slot_type myslot(&HexView::refresh, new_view.get());
- doc.connect(myslot.track(new_view));
- }
- return new_view;
- }
- void refresh() const
- {
- boost::io::ios_flags_saver ifs(std::cout);
- const std::string& s = m_document.getText();
- std::cout << "HexView:";
- for (std::string::const_iterator it = s.begin(); it != s.end(); ++it)
- std::cout << ' ' << std::hex << static_cast<int>(*it);
- std::cout << std::endl;
- }
- private:
- // private constructor to force use of static factory function
- HexView(Document& doc): m_document(doc)
- {}
- Document& m_document;
- };
- int main(int argc, char* argv[])
- {
- Document doc;
- boost::shared_ptr<TextView> v1 = TextView::create(doc);
- boost::shared_ptr<HexView> v2 = HexView::create(doc);
- doc.append(argc >= 2 ? argv[1] : "Hello world!");
- v2.reset(); // destroy the HexView, automatically disconnecting
- doc.append(" HexView should no longer be connected.");
- return 0;
- }
|