signal_n_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 193 行

CPP
193
字号
// Boost.Signals library// Copyright Douglas Gregor 2001-2003. 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 <boost/test/minimal.hpp>#include <boost/signal.hpp>#include <functional>template<typename T>struct max_or_default {  typedef T result_type;  template<typename InputIterator>  typename InputIterator::value_type  operator()(InputIterator first, InputIterator last) const  {    if (first == last)      return T();    T max = *first++;    for (; first != last; ++first)      max = (*first > max)? *first : max;    return max;  }};struct make_int {  make_int(int n, int cn) : N(n), CN(n) {}  int operator()() { return N; }  int operator()() const { return CN; }  int N;  int CN;};template<int N>struct make_increasing_int {  make_increasing_int() : n(N) {}  int operator()() const { return n++; }  mutable int n;};int get_37() { return 37; }static voidtest_zero_args(){  make_int i42(42, 41);  make_int i2(2, 1);  make_int i72(72, 71);  make_int i63(63, 63);  make_int i62(62, 61);  {    boost::signal0<int, max_or_default<int>, std::string> s0;    boost::BOOST_SIGNALS_NAMESPACE::connection c2 = s0.connect(i2);    boost::BOOST_SIGNALS_NAMESPACE::connection c72 = s0.connect("72", i72);    boost::BOOST_SIGNALS_NAMESPACE::connection c62 = s0.connect("6x", i62);    boost::BOOST_SIGNALS_NAMESPACE::connection c42 = s0.connect(i42);    boost::BOOST_SIGNALS_NAMESPACE::connection c37 = s0.connect(&get_37);    BOOST_CHECK(s0() == 72);    s0.disconnect("72");    BOOST_CHECK(s0() == 62);    c72.disconnect(); // Double-disconnect should be safe    BOOST_CHECK(s0() == 62);    s0.disconnect("72"); // Triple-disconect should be safe    BOOST_CHECK(s0() == 62);    // Also connect 63 in the same group as 62    s0.connect("6x", i63);    BOOST_CHECK(s0() == 63);    // Disconnect all of the 60's    s0.disconnect("6x");    BOOST_CHECK(s0() == 42);    c42.disconnect();    BOOST_CHECK(s0() == 37);    c37.disconnect();    BOOST_CHECK(s0() == 2);    c2.disconnect();    BOOST_CHECK(s0() == 0);  }  {    boost::signal0<int, max_or_default<int> > s0;    boost::BOOST_SIGNALS_NAMESPACE::connection c2 = s0.connect(i2);    boost::BOOST_SIGNALS_NAMESPACE::connection c72 = s0.connect(i72);    boost::BOOST_SIGNALS_NAMESPACE::connection c62 = s0.connect(i62);    boost::BOOST_SIGNALS_NAMESPACE::connection c42 = s0.connect(i42);    const boost::signal0<int, max_or_default<int> >& cs0 = s0;    BOOST_CHECK(cs0() == 72);  }  {    make_increasing_int<7> i7;    make_increasing_int<10> i10;    boost::signal0<int, max_or_default<int> > s0;    boost::BOOST_SIGNALS_NAMESPACE::connection c7 = s0.connect(i7);    boost::BOOST_SIGNALS_NAMESPACE::connection c10 = s0.connect(i10);    BOOST_CHECK(s0() == 10);    BOOST_CHECK(s0() == 11);  }}static voidtest_one_arg(){  boost::signal1<int, int, max_or_default<int> > s1;  s1.connect(std::negate<int>());  s1.connect(std::bind1st(std::multiplies<int>(), 2));  BOOST_CHECK(s1(1) == 2);  BOOST_CHECK(s1(-1) == 1);}static voidtest_signal_signal_connect(){  boost::signal1<int, int, max_or_default<int> > s1;  s1.connect(std::negate<int>());  BOOST_CHECK(s1(3) == -3);  {    boost::signal1<int, int, max_or_default<int> > s2;    s1.connect(s2);    s2.connect(std::bind1st(std::multiplies<int>(), 2));    s2.connect(std::bind1st(std::multiplies<int>(), -3));    BOOST_CHECK(s2(-3) == 9);    BOOST_CHECK(s1(3) == 6);  } // s2 goes out of scope and disconnects  BOOST_CHECK(s1(3) == -3);}struct EventCounter{  EventCounter() : count(0) {}  void operator()()  {    ++count;  }  int count;};static voidtest_ref(){  EventCounter ec;  boost::signal0<void> s;  {    boost::BOOST_SIGNALS_NAMESPACE::scoped_connection c = s.connect(boost::ref(ec));    BOOST_CHECK(ec.count == 0);    s();    BOOST_CHECK(ec.count == 1);  }  s();  BOOST_CHECK(ec.count == 1);}inttest_main(int, char* []){  test_zero_args();  test_one_arg();  test_signal_signal_connect();  test_ref();  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?