2
* Copyright 2008-2011 NVIDIA Corporation
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
8
* http://www.apache.org/licenses/LICENSE-2.0
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
17
#include <thrust/iterator/reverse_iterator.h>
18
#include <thrust/detail/device/dereference.h>
19
#include <thrust/iterator/iterator_traits.h>
27
template<typename Iterator>
29
Iterator prior(Iterator x)
36
template<typename BidirectionalIterator>
37
reverse_iterator<BidirectionalIterator>
38
::reverse_iterator(BidirectionalIterator x)
41
} // end reverse_iterator::reverse_iterator()
43
template<typename BidirectionalIterator>
44
template<typename OtherBidirectionalIterator>
45
reverse_iterator<BidirectionalIterator>
46
::reverse_iterator(reverse_iterator<OtherBidirectionalIterator> const &r
47
// XXX msvc screws this up
49
, typename thrust::detail::enable_if<
50
thrust::detail::is_convertible<
51
OtherBidirectionalIterator,
59
} // end reverse_iterator::reverse_iterator()
61
template<typename BidirectionalIterator>
62
typename reverse_iterator<BidirectionalIterator>::super_t::reference
63
reverse_iterator<BidirectionalIterator>
64
::dereference(void) const
66
return *thrust::detail::prior(this->base());
67
} // end reverse_iterator::increment()
69
template<typename BidirectionalIterator>
70
void reverse_iterator<BidirectionalIterator>
73
--this->base_reference();
74
} // end reverse_iterator::increment()
76
template<typename BidirectionalIterator>
77
void reverse_iterator<BidirectionalIterator>
80
++this->base_reference();
81
} // end reverse_iterator::decrement()
83
template<typename BidirectionalIterator>
84
void reverse_iterator<BidirectionalIterator>
85
::advance(typename super_t::difference_type n)
87
this->base_reference() += -n;
88
} // end reverse_iterator::advance()
90
template<typename BidirectionalIterator>
91
template<typename OtherBidirectionalIterator>
92
typename reverse_iterator<BidirectionalIterator>::super_t::difference_type
93
reverse_iterator<BidirectionalIterator>
94
::distance_to(reverse_iterator<OtherBidirectionalIterator> const &y) const
96
return this->base_reference() - y.base();
97
} // end reverse_iterator::distance_to()
99
template<typename BidirectionalIterator>
101
reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
103
return reverse_iterator<BidirectionalIterator>(x);
104
} // end make_reverse_iterator()
113
template<typename DeviceBidirectionalIterator>
114
struct dereference_result< thrust::reverse_iterator<DeviceBidirectionalIterator> >
115
: dereference_result<DeviceBidirectionalIterator>
117
}; // end dereference_result
119
template<typename BidirectionalIterator>
120
inline __host__ __device__
121
typename dereference_result< thrust::reverse_iterator<BidirectionalIterator> >::type
122
dereference(const thrust::reverse_iterator<BidirectionalIterator> &iter)
124
return dereference(thrust::detail::prior(iter.base()));
125
} // end dereference()
127
template<typename BidirectionalIterator, typename IndexType>
128
inline __host__ __device__
129
typename dereference_result< thrust::reverse_iterator<BidirectionalIterator> >::type
130
dereference(const thrust::reverse_iterator<BidirectionalIterator> &iter, IndexType n)
132
thrust::reverse_iterator<BidirectionalIterator> temp = iter;
134
return dereference(temp);
135
} // end dereference()