| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | // last_value function object (documented as part of Boost.Signals)// Copyright Frank Mori Hess 2007.// 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#ifndef BOOST_SIGNALS2_LAST_VALUE_HPP#define BOOST_SIGNALS2_LAST_VALUE_HPP#include <boost/core/no_exceptions_support.hpp>#include <boost/optional.hpp>#include <boost/signals2/expired_slot.hpp>#include <boost/throw_exception.hpp>#include <stdexcept>namespace boost {  namespace signals2 {    // no_slots_error is thrown when we are unable to generate a return value    // due to no slots being connected to the signal.    class no_slots_error: public std::exception    {    public:      virtual const char* what() const throw() {return "boost::signals2::no_slots_error";}    };    template<typename T>    class last_value {    public:      typedef T result_type;      template<typename InputIterator>      T operator()(InputIterator first, InputIterator last) const      {        if(first == last)        {          boost::throw_exception(no_slots_error());        }        optional<T> value;        while (first != last)        {          BOOST_TRY          {            value = *first;          }          BOOST_CATCH(const expired_slot &) {}          BOOST_CATCH_END          ++first;        }        if(value) return value.get();        boost::throw_exception(no_slots_error());      }    };    template<>    class last_value<void> {    public:      typedef void result_type;      template<typename InputIterator>        result_type operator()(InputIterator first, InputIterator last) const      {        while (first != last)        {          BOOST_TRY          {            *first;          }          BOOST_CATCH(const expired_slot &) {}          BOOST_CATCH_END          ++first;        }        return;      }    };  } // namespace signals2} // namespace boost#endif // BOOST_SIGNALS2_LAST_VALUE_HPP
 |