123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- #ifndef BOOST_COMPUTE_ITERATOR_PERMUTATION_ITERATOR_HPP
- #define BOOST_COMPUTE_ITERATOR_PERMUTATION_ITERATOR_HPP
- #include <string>
- #include <cstddef>
- #include <iterator>
- #include <boost/config.hpp>
- #include <boost/iterator/iterator_adaptor.hpp>
- #include <boost/compute/functional.hpp>
- #include <boost/compute/detail/meta_kernel.hpp>
- #include <boost/compute/detail/is_buffer_iterator.hpp>
- #include <boost/compute/detail/read_write_single_value.hpp>
- #include <boost/compute/iterator/detail/get_base_iterator_buffer.hpp>
- #include <boost/compute/type_traits/is_device_iterator.hpp>
- namespace boost {
- namespace compute {
- template<class ElementIterator, class IndexIterator>
- class permutation_iterator;
- namespace detail {
- template<class ElementIterator, class IndexIterator>
- class permutation_iterator_base
- {
- public:
- typedef ::boost::iterator_adaptor<
- ::boost::compute::permutation_iterator<ElementIterator, IndexIterator>,
- ElementIterator
- > type;
- };
- template<class ElementIterator, class IndexIterator, class IndexExpr>
- struct permutation_iterator_access_expr
- {
- typedef typename std::iterator_traits<ElementIterator>::value_type result_type;
- permutation_iterator_access_expr(const ElementIterator &e,
- const IndexIterator &i,
- const IndexExpr &expr)
- : m_element_iter(e),
- m_index_iter(i),
- m_expr(expr)
- {
- }
- const ElementIterator m_element_iter;
- const IndexIterator m_index_iter;
- const IndexExpr m_expr;
- };
- template<class ElementIterator, class IndexIterator, class IndexExpr>
- inline meta_kernel& operator<<(meta_kernel &kernel,
- const permutation_iterator_access_expr<ElementIterator,
- IndexIterator,
- IndexExpr> &expr)
- {
- return kernel << expr.m_element_iter[expr.m_index_iter[expr.m_expr]];
- }
- }
- template<class ElementIterator, class IndexIterator>
- class permutation_iterator
- : public detail::permutation_iterator_base<ElementIterator,
- IndexIterator>::type
- {
- public:
- typedef typename
- detail::permutation_iterator_base<ElementIterator,
- IndexIterator>::type super_type;
- typedef typename super_type::value_type value_type;
- typedef typename super_type::reference reference;
- typedef typename super_type::base_type base_type;
- typedef typename super_type::difference_type difference_type;
- typedef IndexIterator index_iterator;
- permutation_iterator(ElementIterator e, IndexIterator i)
- : super_type(e),
- m_map(i)
- {
- }
- permutation_iterator(const permutation_iterator<ElementIterator,
- IndexIterator> &other)
- : super_type(other),
- m_map(other.m_map)
- {
- }
- permutation_iterator<ElementIterator, IndexIterator>&
- operator=(const permutation_iterator<ElementIterator,
- IndexIterator> &other)
- {
- if(this != &other){
- super_type::operator=(other);
- m_map = other.m_map;
- }
- return *this;
- }
- ~permutation_iterator()
- {
- }
- size_t get_index() const
- {
- return super_type::base().get_index();
- }
- const buffer& get_buffer() const
- {
- return detail::get_base_iterator_buffer(*this);
- }
- template<class IndexExpr>
- detail::permutation_iterator_access_expr<ElementIterator,
- IndexIterator,
- IndexExpr>
- operator[](const IndexExpr &expr) const
- {
- return detail::permutation_iterator_access_expr<ElementIterator,
- IndexIterator,
- IndexExpr>(super_type::base(),
- m_map,
- expr);
- }
- private:
- friend class ::boost::iterator_core_access;
- reference dereference() const
- {
- return reference();
- }
- private:
- IndexIterator m_map;
- };
- template<class ElementIterator, class IndexIterator>
- inline permutation_iterator<ElementIterator, IndexIterator>
- make_permutation_iterator(ElementIterator e, IndexIterator i)
- {
- return permutation_iterator<ElementIterator, IndexIterator>(e, i);
- }
- template<class ElementIterator, class IndexIterator>
- struct is_device_iterator<
- permutation_iterator<ElementIterator, IndexIterator> > : boost::true_type {};
- }
- }
- #endif
|