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 |