~ubuntu-branches/ubuntu/trusty/libthrust/trusty

« back to all changes in this revision

Viewing changes to iterator/detail/reverse_iterator.inl

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Beckmann
  • Date: 2011-05-28 09:32:48 UTC
  • Revision ID: james.westby@ubuntu.com-20110528093248-np3euv5sj7fw3nyv
Tags: upstream-1.4.0
ImportĀ upstreamĀ versionĀ 1.4.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Copyright 2008-2011 NVIDIA Corporation
 
3
 *
 
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
 
7
 *
 
8
 *      http://www.apache.org/licenses/LICENSE-2.0
 
9
 *
 
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.
 
15
 */
 
16
 
 
17
#include <thrust/iterator/reverse_iterator.h>
 
18
#include <thrust/detail/device/dereference.h>
 
19
#include <thrust/iterator/iterator_traits.h>
 
20
 
 
21
namespace thrust
 
22
{
 
23
 
 
24
namespace detail
 
25
{
 
26
 
 
27
template<typename Iterator>
 
28
__host__ __device__
 
29
  Iterator prior(Iterator x)
 
30
{
 
31
  return --x;
 
32
} // end prior()
 
33
 
 
34
} // end detail
 
35
 
 
36
template<typename BidirectionalIterator>
 
37
  reverse_iterator<BidirectionalIterator>
 
38
    ::reverse_iterator(BidirectionalIterator x)
 
39
      :super_t(x)
 
40
{
 
41
} // end reverse_iterator::reverse_iterator()
 
42
 
 
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
 
48
#ifndef _MSC_VER
 
49
                     , typename thrust::detail::enable_if<
 
50
                         thrust::detail::is_convertible<
 
51
                           OtherBidirectionalIterator,
 
52
                           BidirectionalIterator
 
53
                         >::value
 
54
                       >::type *
 
55
#endif // _MSC_VER
 
56
                     )
 
57
        :super_t(r.base())
 
58
{
 
59
} // end reverse_iterator::reverse_iterator()
 
60
 
 
61
template<typename BidirectionalIterator>
 
62
  typename reverse_iterator<BidirectionalIterator>::super_t::reference
 
63
    reverse_iterator<BidirectionalIterator>
 
64
      ::dereference(void) const
 
65
{
 
66
  return *thrust::detail::prior(this->base());
 
67
} // end reverse_iterator::increment()
 
68
 
 
69
template<typename BidirectionalIterator>
 
70
  void reverse_iterator<BidirectionalIterator>
 
71
    ::increment(void)
 
72
{
 
73
  --this->base_reference();
 
74
} // end reverse_iterator::increment()
 
75
 
 
76
template<typename BidirectionalIterator>
 
77
  void reverse_iterator<BidirectionalIterator>
 
78
    ::decrement(void)
 
79
{
 
80
  ++this->base_reference();
 
81
} // end reverse_iterator::decrement()
 
82
 
 
83
template<typename BidirectionalIterator>
 
84
  void reverse_iterator<BidirectionalIterator>
 
85
    ::advance(typename super_t::difference_type n)
 
86
{
 
87
  this->base_reference() += -n;
 
88
} // end reverse_iterator::advance()
 
89
 
 
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
 
95
{
 
96
  return this->base_reference() - y.base();
 
97
} // end reverse_iterator::distance_to()
 
98
 
 
99
template<typename BidirectionalIterator>
 
100
__host__ __device__
 
101
reverse_iterator<BidirectionalIterator> make_reverse_iterator(BidirectionalIterator x)
 
102
{
 
103
  return reverse_iterator<BidirectionalIterator>(x);
 
104
} // end make_reverse_iterator()
 
105
 
 
106
 
 
107
namespace detail
 
108
{
 
109
 
 
110
namespace device
 
111
{
 
112
 
 
113
template<typename DeviceBidirectionalIterator>
 
114
  struct dereference_result< thrust::reverse_iterator<DeviceBidirectionalIterator> >
 
115
    : dereference_result<DeviceBidirectionalIterator>
 
116
{
 
117
}; // end dereference_result
 
118
 
 
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)
 
123
{
 
124
  return dereference(thrust::detail::prior(iter.base()));
 
125
} // end dereference()
 
126
 
 
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)
 
131
{
 
132
  thrust::reverse_iterator<BidirectionalIterator> temp = iter;
 
133
  temp += n;
 
134
  return dereference(temp);
 
135
} // end dereference()
 
136
 
 
137
} // end device
 
138
 
 
139
} // end detail
 
140
 
 
141
} // end thrust
 
142