1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2015 Jakub Szuppe <j.szuppe@gmail.com>
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
8 // See http://boostorg.github.com/compute for more information.
9 //---------------------------------------------------------------------------//
11 #define BOOST_TEST_MODULE TestStridedIterator
12 #include <boost/test/unit_test.hpp>
16 #include <boost/type_traits.hpp>
17 #include <boost/static_assert.hpp>
19 #include <boost/compute/algorithm/copy.hpp>
20 #include <boost/compute/container/vector.hpp>
21 #include <boost/compute/iterator/buffer_iterator.hpp>
22 #include <boost/compute/iterator/strided_iterator.hpp>
24 #include "check_macros.hpp"
25 #include "context_setup.hpp"
27 namespace bc
= boost::compute
;
29 BOOST_AUTO_TEST_CASE(value_type
)
33 boost::compute::strided_iterator
<
34 boost::compute::buffer_iterator
<int>
41 boost::compute::strided_iterator
<
42 boost::compute::buffer_iterator
<float>
49 BOOST_AUTO_TEST_CASE(base_type
)
53 boost::compute::strided_iterator
<
54 boost::compute::buffer_iterator
<int>
56 boost::compute::buffer_iterator
<int>
61 BOOST_AUTO_TEST_CASE(distance
)
63 int data
[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
64 boost::compute::vector
<int> vec(data
, data
+ 8, queue
);
68 boost::compute::make_strided_iterator(vec
.begin(), 1),
69 boost::compute::make_strided_iterator(vec
.end(), 1)
75 boost::compute::make_strided_iterator(vec
.begin(), 2),
76 boost::compute::make_strided_iterator(vec
.end(), 2)
83 boost::compute::make_strided_iterator(vec
.begin(), 3),
84 boost::compute::make_strided_iterator(vec
.begin()+6, 3)
90 BOOST_AUTO_TEST_CASE(copy
)
92 boost::compute::int_ data
[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
93 boost::compute::vector
<boost::compute::int_
> vec(data
, data
+ 8, queue
);
95 boost::compute::vector
<boost::compute::int_
> result(4, context
);
97 // copy every other element to result
99 boost::compute::make_strided_iterator(vec
.begin(), 2),
100 boost::compute::make_strided_iterator(vec
.end(), 2),
104 CHECK_RANGE_EQUAL(boost::compute::int_
, 4, result
, (1, 3, 5, 7));
106 // copy every 3rd element to result
107 boost::compute::copy(
108 boost::compute::make_strided_iterator(vec
.begin(), 3),
109 boost::compute::make_strided_iterator(vec
.begin()+9, 3),
113 CHECK_RANGE_EQUAL(boost::compute::int_
, 3, result
, (1, 4, 7));
116 BOOST_AUTO_TEST_CASE(make_strided_iterator_end
)
118 boost::compute::int_ data
[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
119 boost::compute::vector
<boost::compute::int_
> vec(data
, data
+ 8, queue
);
122 typedef boost::compute::vector
<boost::compute::int_
>::iterator IterType
;
123 boost::compute::strided_iterator
<IterType
> end
=
124 boost::compute::make_strided_iterator_end(vec
.begin(),
128 // end should be vec.begin() + 9 which is one step after last element
129 // accessible through strided_iterator, i.e. vec.begin()+6
130 BOOST_CHECK(boost::compute::make_strided_iterator(vec
.begin()+9, 3) ==
134 end
= boost::compute::make_strided_iterator_end(vec
.begin(),
137 // end should be vec.end(), because vector size is divisible by 2
138 BOOST_CHECK(boost::compute::make_strided_iterator(vec
.end(), 2) == end
);
140 // stride equals 1000
141 end
= boost::compute::make_strided_iterator_end(vec
.begin(),
144 // end should be vec.begin() + 1000, because stride > vector size
145 BOOST_CHECK(boost::compute::make_strided_iterator(vec
.begin()+1000, 1000) ==
149 // test boost::compute::make_strided_iterator_end with copy(..)
151 boost::compute::vector
<boost::compute::int_
> result(4, context
);
153 // copy every other element to result
154 boost::compute::copy(
155 boost::compute::make_strided_iterator(vec
.begin()+1, 2),
156 boost::compute::make_strided_iterator_end(vec
.begin()+1, vec
.end(), 2),
160 CHECK_RANGE_EQUAL(boost::compute::int_
, 4, result
, (2, 4, 6, 8));
163 BOOST_AUTO_TEST_CASE(iterator_tag
)
165 typedef bc::buffer_iterator
<bc::float_
> i_type
;
167 BOOST_STATIC_ASSERT((
169 std::iterator_traits
<
171 >::iterator_category
,
172 std::iterator_traits
<
173 bc::strided_iterator
<i_type
>
179 BOOST_AUTO_TEST_CASE(std_distance
)
181 bc::vector
<bc::float_
> vec(
187 bc::strided_iterator
<bc::buffer_iterator
<bc::float_
> > begin(vec
.begin(), 1);
188 bc::strided_iterator
<bc::buffer_iterator
<bc::float_
> > end(vec
.end(), 1);
190 BOOST_CHECK_EQUAL(std::distance(begin
, end
), 300);
191 BOOST_CHECK_EQUAL(std::distance(end
, begin
), -300);
194 BOOST_AUTO_TEST_SUITE_END()