Chris@16: // optional_last_value function object (documented as part of Boost.Signals2) Chris@16: Chris@16: // Copyright Frank Mori Hess 2007-2008. Chris@16: // Copyright Douglas Gregor 2001-2003. Chris@16: // Distributed under the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/signals2 for library home page. Chris@16: Chris@16: #ifndef BOOST_SIGNALS2_OPTIONAL_LAST_VALUE_HPP Chris@16: #define BOOST_SIGNALS2_OPTIONAL_LAST_VALUE_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace signals2 { Chris@16: Chris@16: template Chris@16: class optional_last_value Chris@16: { Chris@16: public: Chris@16: typedef optional result_type; Chris@16: Chris@16: template Chris@16: optional operator()(InputIterator first, InputIterator last) const Chris@16: { Chris@16: optional value; Chris@16: while (first != last) Chris@16: { Chris@16: try Chris@16: { Chris@16: value = *first; Chris@16: } Chris@16: catch(const expired_slot &) {} Chris@16: ++first; Chris@16: } Chris@16: return value; Chris@16: } Chris@16: }; Chris@16: Chris@16: template<> Chris@16: class optional_last_value Chris@16: { Chris@16: public: Chris@16: typedef void result_type; Chris@16: template Chris@16: result_type operator()(InputIterator first, InputIterator last) const Chris@16: { Chris@16: while (first != last) Chris@16: { Chris@16: try Chris@16: { Chris@16: *first; Chris@16: } Chris@16: catch(const expired_slot &) {} Chris@16: ++first; Chris@16: } Chris@16: return; Chris@16: } Chris@16: }; Chris@16: } // namespace signals2 Chris@16: } // namespace boost Chris@16: #endif // BOOST_SIGNALS2_OPTIONAL_LAST_VALUE_HPP