| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // (C) Copyright Jeremy Siek 2001.
- // Distributed under 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)
- // Revision History:
- // 27 Feb 2001 Jeremy Siek
- // Initial checkin.
- #ifndef BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_
- #define BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_
- #include <cstddef>
- #include <iterator>
- #include <type_traits>
- namespace boost {
- namespace iterators {
- template< typename UnaryFunction >
- class function_output_iterator
- {
- private:
- class output_proxy
- {
- public:
- explicit output_proxy(UnaryFunction& f) noexcept :
- m_f(f)
- {}
- template< typename T >
- typename std::enable_if<
- !std::is_same< typename std::remove_cv< typename std::remove_reference< T >::type >::type, output_proxy >::value,
- output_proxy const&
- >::type operator=(T&& value) const
- {
- m_f(static_cast< T&& >(value));
- return *this;
- }
- output_proxy(output_proxy const& that) = default;
- output_proxy& operator=(output_proxy const&) = delete;
- private:
- UnaryFunction& m_f;
- };
- public:
- using iterator_category = std::output_iterator_tag;
- using value_type = void;
- using difference_type = std::ptrdiff_t;
- using pointer = void;
- using reference = void;
- template<
- bool Requires = std::is_class< UnaryFunction >::value,
- typename = typename std::enable_if< Requires >::type
- >
- function_output_iterator() :
- m_f()
- {}
- explicit function_output_iterator(UnaryFunction const& f) :
- m_f(f)
- {}
- output_proxy operator*() { return output_proxy(m_f); }
- function_output_iterator& operator++() { return *this; }
- function_output_iterator& operator++(int) { return *this; }
- private:
- UnaryFunction m_f;
- };
- template< typename UnaryFunction >
- inline function_output_iterator< UnaryFunction > make_function_output_iterator(UnaryFunction const& f = UnaryFunction())
- {
- return function_output_iterator< UnaryFunction >(f);
- }
- } // namespace iterators
- using iterators::function_output_iterator;
- using iterators::make_function_output_iterator;
- } // namespace boost
- #endif // BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_
|