mirror of https://gitee.com/bigwinds/arangodb
114 lines
2.2 KiB
C++
114 lines
2.2 KiB
C++
// Document/View sample for Boost.Signals
|
|
// Copyright Keith MacDonald 2005. 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/signal.hpp>
|
|
#include <boost/bind.hpp>
|
|
|
|
class Document
|
|
{
|
|
public:
|
|
typedef boost::signal<void (bool)> signal_t;
|
|
typedef boost::signals::connection connection_t;
|
|
|
|
public:
|
|
Document()
|
|
{}
|
|
|
|
connection_t connect(signal_t::slot_function_type subscriber)
|
|
{
|
|
return m_sig.connect(subscriber);
|
|
}
|
|
|
|
void disconnect(connection_t subscriber)
|
|
{
|
|
subscriber.disconnect();
|
|
}
|
|
|
|
void append(const char* s)
|
|
{
|
|
m_text += s;
|
|
m_sig(true);
|
|
}
|
|
|
|
const std::string& getText() const
|
|
{
|
|
return m_text;
|
|
}
|
|
|
|
private:
|
|
signal_t m_sig;
|
|
std::string m_text;
|
|
};
|
|
|
|
class View
|
|
{
|
|
public:
|
|
View(Document& m)
|
|
: m_document(m)
|
|
{
|
|
m_connection = m_document.connect(boost::bind(&View::refresh, this, _1));
|
|
}
|
|
|
|
virtual ~View()
|
|
{
|
|
m_document.disconnect(m_connection);
|
|
}
|
|
|
|
virtual void refresh(bool bExtended) const = 0;
|
|
|
|
protected:
|
|
Document& m_document;
|
|
|
|
private:
|
|
Document::connection_t m_connection;
|
|
};
|
|
|
|
class TextView : public View
|
|
{
|
|
public:
|
|
TextView(Document& doc)
|
|
: View(doc)
|
|
{}
|
|
|
|
virtual void refresh(bool bExtended) const
|
|
{
|
|
std::cout << "TextView: " << m_document.getText() << std::endl;
|
|
}
|
|
};
|
|
|
|
class HexView : public View
|
|
{
|
|
public:
|
|
HexView(Document& doc)
|
|
: View(doc)
|
|
{}
|
|
|
|
virtual void refresh(bool bExtended) const
|
|
{
|
|
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;
|
|
}
|
|
};
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
Document doc;
|
|
TextView v1(doc);
|
|
HexView v2(doc);
|
|
|
|
doc.append(argc == 2 ? argv[1] : "Hello world!");
|
|
return 0;
|
|
}
|