171 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //---------------------------------------------------------------------------//
 | |
| // Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com>
 | |
| //
 | |
| // 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
 | |
| //
 | |
| // See http://boostorg.github.com/compute for more information.
 | |
| //---------------------------------------------------------------------------//
 | |
| 
 | |
| #ifndef BOOST_COMPUTE_ITERATOR_DISCARD_ITERATOR_HPP
 | |
| #define BOOST_COMPUTE_ITERATOR_DISCARD_ITERATOR_HPP
 | |
| 
 | |
| #include <string>
 | |
| #include <cstddef>
 | |
| #include <iterator>
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| #include <boost/iterator/iterator_facade.hpp>
 | |
| 
 | |
| #include <boost/compute/detail/meta_kernel.hpp>
 | |
| #include <boost/compute/type_traits/is_device_iterator.hpp>
 | |
| 
 | |
| namespace boost {
 | |
| namespace compute {
 | |
| 
 | |
| // forward declaration for discard_iterator
 | |
| class discard_iterator;
 | |
| 
 | |
| namespace detail {
 | |
| 
 | |
| // helper class which defines the iterator_facade super-class
 | |
| // type for discard_iterator
 | |
| struct discard_iterator_base
 | |
| {
 | |
|     typedef ::boost::iterator_facade<
 | |
|         ::boost::compute::discard_iterator,
 | |
|         void,
 | |
|         ::std::random_access_iterator_tag,
 | |
|         void *
 | |
|     > type;
 | |
| };
 | |
| 
 | |
| template<class IndexExpr>
 | |
| struct discard_iterator_index_expr
 | |
| {
 | |
|     typedef void result_type;
 | |
| 
 | |
|     discard_iterator_index_expr(const IndexExpr &expr)
 | |
|         : m_expr(expr)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     IndexExpr m_expr;
 | |
| };
 | |
| 
 | |
| template<class IndexExpr>
 | |
| inline meta_kernel& operator<<(meta_kernel &kernel,
 | |
|                                const discard_iterator_index_expr<IndexExpr> &expr)
 | |
| {
 | |
|     (void) expr;
 | |
| 
 | |
|     return kernel;
 | |
| }
 | |
| 
 | |
| } // end detail namespace
 | |
| 
 | |
| /// \class discard_iterator
 | |
| /// \brief An iterator which discards all values written to it.
 | |
| ///
 | |
| /// \see make_discard_iterator(), constant_iterator
 | |
| class discard_iterator : public detail::discard_iterator_base::type
 | |
| {
 | |
| public:
 | |
|     typedef detail::discard_iterator_base::type super_type;
 | |
|     typedef super_type::reference reference;
 | |
|     typedef super_type::difference_type difference_type;
 | |
| 
 | |
|     discard_iterator(size_t index = 0)
 | |
|         : m_index(index)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     discard_iterator(const discard_iterator &other)
 | |
|         : m_index(other.m_index)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     discard_iterator& operator=(const discard_iterator &other)
 | |
|     {
 | |
|         if(this != &other){
 | |
|             m_index = other.m_index;
 | |
|         }
 | |
| 
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     ~discard_iterator()
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     /// \internal_
 | |
|     template<class Expr>
 | |
|     detail::discard_iterator_index_expr<Expr>
 | |
|     operator[](const Expr &expr) const
 | |
|     {
 | |
|         return detail::discard_iterator_index_expr<Expr>(expr);
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     friend class ::boost::iterator_core_access;
 | |
| 
 | |
|     /// \internal_
 | |
|     reference dereference() const
 | |
|     {
 | |
|         return 0;
 | |
|     }
 | |
| 
 | |
|     /// \internal_
 | |
|     bool equal(const discard_iterator &other) const
 | |
|     {
 | |
|         return m_index == other.m_index;
 | |
|     }
 | |
| 
 | |
|     /// \internal_
 | |
|     void increment()
 | |
|     {
 | |
|         m_index++;
 | |
|     }
 | |
| 
 | |
|     /// \internal_
 | |
|     void decrement()
 | |
|     {
 | |
|         m_index--;
 | |
|     }
 | |
| 
 | |
|     /// \internal_
 | |
|     void advance(difference_type n)
 | |
|     {
 | |
|         m_index = static_cast<size_t>(static_cast<difference_type>(m_index) + n);
 | |
|     }
 | |
| 
 | |
|     /// \internal_
 | |
|     difference_type distance_to(const discard_iterator &other) const
 | |
|     {
 | |
|         return static_cast<difference_type>(other.m_index - m_index);
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     size_t m_index;
 | |
| };
 | |
| 
 | |
| /// Returns a new discard_iterator with \p index.
 | |
| ///
 | |
| /// \param index the index of the iterator
 | |
| ///
 | |
| /// \return a \c discard_iterator at \p index
 | |
| inline discard_iterator make_discard_iterator(size_t index = 0)
 | |
| {
 | |
|     return discard_iterator(index);
 | |
| }
 | |
| 
 | |
| /// internal_ (is_device_iterator specialization for discard_iterator)
 | |
| template<>
 | |
| struct is_device_iterator<discard_iterator> : boost::true_type {};
 | |
| 
 | |
| } // end compute namespace
 | |
| } // end boost namespace
 | |
| 
 | |
| #endif // BOOST_COMPUTE_ITERATOR_DISCARD_ITERATOR_HPP
 | 
