// Various simple examples involving disconnecting and blocking slots.
// Copyright Douglas Gregor 2001-2004.
// 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 <boost/signals2/signal.hpp>
#include <boost/signals2/shared_connection_block.hpp>

struct HelloWorld
{
  void operator()() const
  {
    std::cout << "Hello, World!" << std::endl;
  }
};

void disconnect_example()
{
  boost::signals2::signal<void ()> sig;

//[ disconnect_code_snippet
  boost::signals2::connection c = sig.connect(HelloWorld());
  std::cout << "c is connected\n";
  sig(); // Prints "Hello, World!"

  c.disconnect(); // Disconnect the HelloWorld object
  std::cout << "c is disconnected\n";
  sig(); // Does nothing: there are no connected slots
//]
}

void block_example()
{
  boost::signals2::signal<void ()> sig;

//[ block_code_snippet
  boost::signals2::connection c = sig.connect(HelloWorld());
  std::cout << "c is not blocked.\n";
  sig(); // Prints "Hello, World!"

  {
    boost::signals2::shared_connection_block block(c); // block the slot
    std::cout << "c is blocked.\n";
    sig(); // No output: the slot is blocked
  } // shared_connection_block going out of scope unblocks the slot
  std::cout << "c is not blocked.\n";
  sig(); // Prints "Hello, World!"}
//]
}

struct ShortLived
{
  void operator()() const
  {
    std::cout << "Life is short!" << std::endl;
  }
};

void scoped_connection_example()
{
  boost::signals2::signal<void ()> sig;

//[ scoped_connection_code_snippet
  {
    boost::signals2::scoped_connection c(sig.connect(ShortLived()));
    sig(); // will call ShortLived function object
  } // scoped_connection goes out of scope and disconnects

  sig(); // ShortLived function object no longer connected to sig
//]
}

//[ disconnect_by_slot_def_code_snippet
void foo() { std::cout << "foo"; }
void bar() { std::cout << "bar\n"; }
//]

void disconnect_by_slot_example()
{
  boost::signals2::signal<void()> sig;

//[ disconnect_by_slot_usage_code_snippet
  sig.connect(&foo);
  sig.connect(&bar);
  sig();

  // disconnects foo, but not bar
  sig.disconnect(&foo);
  sig();
//]
}

int main()
{
  std::cout << "Disconnect example:\n";
  disconnect_example();

  std::cout << "\nBlock example:\n";
  block_example();

  std::cout << "\nScoped connection example:\n";
  scoped_connection_example();

  std::cout << "\nDisconnect by slot example:\n";
  disconnect_by_slot_example();

  return 0;
};
