1 // last_value function object (documented as part of Boost.Signals) 2 3 // Copyright Douglas Gregor 2001-2003. Use, modification and 4 // distribution is subject to the Boost Software License, Version 5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 8 // For more information, see http://www.boost.org/libs/signals 9 10 #ifndef BOOST_LAST_VALUE_HPP 11 #define BOOST_LAST_VALUE_HPP 12 13 #include <cassert> 14 #include <boost/config.hpp> 15 16 namespace boost { 17 template<typename T> 18 struct last_value { 19 typedef T result_type; 20 21 template<typename InputIterator> operator ()boost::last_value22 T operator()(InputIterator first, InputIterator last) const 23 { 24 assert(first != last); 25 T value = *first++; 26 while (first != last) 27 value = *first++; 28 return value; 29 } 30 }; 31 32 template<> 33 struct last_value<void> { 34 #ifdef BOOST_NO_VOID_RETURNS 35 struct unusable {}; 36 37 public: 38 typedef unusable result_type; 39 #else 40 public: 41 typedef void result_type; 42 #endif // BOOST_NO_VOID_RETURNS 43 44 template<typename InputIterator> 45 result_type operator ()boost::last_value46 operator()(InputIterator first, InputIterator last) const 47 { 48 while (first != last) 49 *first++; 50 return result_type(); 51 } 52 }; 53 } 54 #endif // BOOST_SIGNALS_LAST_VALUE_HPP 55