@@ -19,7 +19,7 @@ __host__ __device__ constexpr bool test()
19
19
{
20
20
int buffer[8 ] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 };
21
21
22
- {
22
+ { // Iterators with same base
23
23
using offset_iterator = cuda::offset_iterator<int *>;
24
24
const int offset1 = 4 ;
25
25
const int offset2 = 2 ;
@@ -33,7 +33,7 @@ __host__ __device__ constexpr bool test()
33
33
static_assert (cuda::std::is_same_v<decltype (iter1 - iter2), cuda::std::iter_difference_t <int *>>);
34
34
}
35
35
36
- {
36
+ { // const iterators with same base
37
37
using offset_iterator = cuda::offset_iterator<int *>;
38
38
const int offset1 = 4 ;
39
39
const int offset2 = 2 ;
@@ -47,30 +47,90 @@ __host__ __device__ constexpr bool test()
47
47
static_assert (cuda::std::is_same_v<decltype (iter1 - iter2), cuda::std::iter_difference_t <int *>>);
48
48
}
49
49
50
- {
50
+ { // Iterators with different base
51
+ using offset_iterator = cuda::offset_iterator<int *>;
52
+ const int offset1 = 4 ;
53
+ const int offset2 = 2 ;
54
+ const int base_offset = 3 ;
55
+ offset_iterator iter1 (buffer + base_offset, offset1);
56
+ offset_iterator iter2 (buffer, offset2);
57
+ assert (iter1 - iter2 == offset2 - (offset1 + base_offset));
58
+ assert (iter2 - iter1 == (offset1 + base_offset) - offset2);
59
+ assert (iter1.offset () == offset1);
60
+ assert (iter2.offset () == offset2);
61
+
62
+ static_assert (cuda::std::is_same_v<decltype (iter1 - iter2), cuda::std::iter_difference_t <int *>>);
63
+ }
64
+
65
+ { // const iterators with different base
66
+ using offset_iterator = cuda::offset_iterator<int *>;
67
+ const int offset1 = 4 ;
68
+ const int offset2 = 2 ;
69
+ const int base_offset = 3 ;
70
+ const offset_iterator iter1 (buffer + base_offset, offset1);
71
+ const offset_iterator iter2 (buffer, offset2);
72
+ assert (iter1 - iter2 == offset2 - (offset1 + base_offset));
73
+ assert (iter2 - iter1 == (offset1 + base_offset) - offset2);
74
+ assert (iter1.offset () == offset1);
75
+ assert (iter2.offset () == offset2);
76
+
77
+ static_assert (cuda::std::is_same_v<decltype (iter1 - iter2), cuda::std::iter_difference_t <int *>>);
78
+ }
79
+
80
+ { // Iterators with same base and offset array
51
81
using offset_iterator = cuda::offset_iterator<int *, random_access_iterator<const int *>>;
52
82
const int offset1[] = {4 };
53
83
const int offset2[] = {2 };
54
84
offset_iterator iter1 (buffer, random_access_iterator<const int *>{offset1});
55
85
offset_iterator iter2 (buffer, random_access_iterator<const int *>{offset2});
56
- assert (iter1 - iter2 == - 2 );
57
- assert (iter2 - iter1 == 2 );
58
- assert (iter1.offset () == 4 );
59
- assert (iter2.offset () == 2 );
86
+ assert (iter1 - iter2 == (*offset2 - *offset1) );
87
+ assert (iter2 - iter1 == (*offset1 - *offset2) );
88
+ assert (iter1.offset () == *offset1 );
89
+ assert (iter2.offset () == *offset2 );
60
90
61
91
static_assert (cuda::std::is_same_v<decltype (iter1 - iter2), cuda::std::iter_difference_t <int *>>);
62
92
}
63
93
64
- {
94
+ { // const iterators with same base and offset array
65
95
using offset_iterator = cuda::offset_iterator<int *, random_access_iterator<const int *>>;
66
96
const int offset1[] = {4 };
67
97
const int offset2[] = {2 };
68
98
const offset_iterator iter1 (buffer, random_access_iterator<const int *>{offset1});
69
99
const offset_iterator iter2 (buffer, random_access_iterator<const int *>{offset2});
70
- assert (iter1 - iter2 == -2 );
71
- assert (iter2 - iter1 == 2 );
72
- assert (iter1.offset () == 4 );
73
- assert (iter2.offset () == 2 );
100
+ assert (iter1 - iter2 == (*offset2 - *offset1));
101
+ assert (iter2 - iter1 == (*offset1 - *offset2));
102
+ assert (iter1.offset () == *offset1);
103
+ assert (iter2.offset () == *offset2);
104
+
105
+ static_assert (cuda::std::is_same_v<decltype (iter1 - iter2), cuda::std::iter_difference_t <int *>>);
106
+ }
107
+
108
+ { // Iterators with different base and offset array
109
+ using offset_iterator = cuda::offset_iterator<int *, random_access_iterator<const int *>>;
110
+ const int offset1[] = {4 };
111
+ const int offset2[] = {2 };
112
+ const int base_offset = 3 ;
113
+ offset_iterator iter1 (buffer + base_offset, random_access_iterator<const int *>{offset1});
114
+ offset_iterator iter2 (buffer, random_access_iterator<const int *>{offset2});
115
+ assert (iter1 - iter2 == (*offset2 - (*offset1 + base_offset)));
116
+ assert (iter2 - iter1 == (*offset1 + base_offset) - *offset2);
117
+ assert (iter1.offset () == *offset1);
118
+ assert (iter2.offset () == *offset2);
119
+
120
+ static_assert (cuda::std::is_same_v<decltype (iter1 - iter2), cuda::std::iter_difference_t <int *>>);
121
+ }
122
+
123
+ { // const iterators with different base and offset array
124
+ using offset_iterator = cuda::offset_iterator<int *, random_access_iterator<const int *>>;
125
+ const int offset1[] = {4 };
126
+ const int offset2[] = {2 };
127
+ const int base_offset = 3 ;
128
+ const offset_iterator iter1 (buffer + base_offset, random_access_iterator<const int *>{offset1});
129
+ const offset_iterator iter2 (buffer, random_access_iterator<const int *>{offset2});
130
+ assert (iter1 - iter2 == (*offset2 - (*offset1 + base_offset)));
131
+ assert (iter2 - iter1 == (*offset1 + base_offset) - *offset2);
132
+ assert (iter1.offset () == *offset1);
133
+ assert (iter2.offset () == *offset2);
74
134
75
135
static_assert (cuda::std::is_same_v<decltype (iter1 - iter2), cuda::std::iter_difference_t <int *>>);
76
136
}
0 commit comments