function_output_iterator.hpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // (C) Copyright Jeremy Siek 2001.
  2. // Distributed under the Boost Software License, Version 1.0. (See
  3. // accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. // Revision History:
  6. // 27 Feb 2001 Jeremy Siek
  7. // Initial checkin.
  8. #ifndef BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_
  9. #define BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_
  10. #include <cstddef>
  11. #include <iterator>
  12. #include <type_traits>
  13. namespace boost {
  14. namespace iterators {
  15. template< typename UnaryFunction >
  16. class function_output_iterator
  17. {
  18. private:
  19. class output_proxy
  20. {
  21. public:
  22. explicit output_proxy(UnaryFunction& f) noexcept :
  23. m_f(f)
  24. {}
  25. template< typename T >
  26. typename std::enable_if<
  27. !std::is_same< typename std::remove_cv< typename std::remove_reference< T >::type >::type, output_proxy >::value,
  28. output_proxy const&
  29. >::type operator=(T&& value) const
  30. {
  31. m_f(static_cast< T&& >(value));
  32. return *this;
  33. }
  34. output_proxy(output_proxy const& that) = default;
  35. output_proxy& operator=(output_proxy const&) = delete;
  36. private:
  37. UnaryFunction& m_f;
  38. };
  39. public:
  40. using iterator_category = std::output_iterator_tag;
  41. using value_type = void;
  42. using difference_type = std::ptrdiff_t;
  43. using pointer = void;
  44. using reference = void;
  45. template<
  46. bool Requires = std::is_class< UnaryFunction >::value,
  47. typename = typename std::enable_if< Requires >::type
  48. >
  49. function_output_iterator() :
  50. m_f()
  51. {}
  52. explicit function_output_iterator(UnaryFunction const& f) :
  53. m_f(f)
  54. {}
  55. output_proxy operator*() { return output_proxy(m_f); }
  56. function_output_iterator& operator++() { return *this; }
  57. function_output_iterator& operator++(int) { return *this; }
  58. private:
  59. UnaryFunction m_f;
  60. };
  61. template< typename UnaryFunction >
  62. inline function_output_iterator< UnaryFunction > make_function_output_iterator(UnaryFunction const& f = UnaryFunction())
  63. {
  64. return function_output_iterator< UnaryFunction >(f);
  65. }
  66. } // namespace iterators
  67. using iterators::function_output_iterator;
  68. using iterators::make_function_output_iterator;
  69. } // namespace boost
  70. #endif // BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_