function_output_iterator.hpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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
  9. #define BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP
  10. #include <iterator>
  11. #include <boost/config.hpp>
  12. #include <boost/core/enable_if.hpp>
  13. #include <boost/type_traits/is_same.hpp>
  14. #include <boost/type_traits/remove_cv.hpp>
  15. #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  16. #include <boost/type_traits/remove_reference.hpp>
  17. #endif
  18. namespace boost {
  19. namespace iterators {
  20. template <class UnaryFunction>
  21. class function_output_iterator {
  22. private:
  23. typedef function_output_iterator self;
  24. class output_proxy {
  25. public:
  26. explicit output_proxy(UnaryFunction& f) BOOST_NOEXCEPT : m_f(f) { }
  27. #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
  28. template <class T>
  29. typename boost::disable_if_c<
  30. boost::is_same< typename boost::remove_cv< T >::type, output_proxy >::value,
  31. output_proxy&
  32. >::type operator=(const T& value) {
  33. m_f(value);
  34. return *this;
  35. }
  36. #else
  37. template <class T>
  38. typename boost::disable_if_c<
  39. boost::is_same< typename boost::remove_cv< typename boost::remove_reference< T >::type >::type, output_proxy >::value,
  40. output_proxy&
  41. >::type operator=(T&& value) {
  42. m_f(static_cast< T&& >(value));
  43. return *this;
  44. }
  45. #endif
  46. BOOST_DEFAULTED_FUNCTION(output_proxy(output_proxy const& that), BOOST_NOEXCEPT : m_f(that.m_f) {})
  47. BOOST_DELETED_FUNCTION(output_proxy& operator=(output_proxy const&))
  48. private:
  49. UnaryFunction& m_f;
  50. };
  51. public:
  52. typedef std::output_iterator_tag iterator_category;
  53. typedef void value_type;
  54. typedef void difference_type;
  55. typedef void pointer;
  56. typedef void reference;
  57. explicit function_output_iterator() {}
  58. explicit function_output_iterator(const UnaryFunction& f)
  59. : m_f(f) {}
  60. output_proxy operator*() { return output_proxy(m_f); }
  61. self& operator++() { return *this; }
  62. self& operator++(int) { return *this; }
  63. private:
  64. UnaryFunction m_f;
  65. };
  66. template <class UnaryFunction>
  67. inline function_output_iterator<UnaryFunction>
  68. make_function_output_iterator(const UnaryFunction& f = UnaryFunction()) {
  69. return function_output_iterator<UnaryFunction>(f);
  70. }
  71. } // namespace iterators
  72. using iterators::function_output_iterator;
  73. using iterators::make_function_output_iterator;
  74. } // namespace boost
  75. #endif // BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP