@@ -255,6 +255,64 @@ TEST(ArrayRefTest, ArrayRefFromStdArray) {
255
255
}
256
256
}
257
257
258
+ struct TestRandomAccessIterator {
259
+ using iterator_category = std::random_access_iterator_tag;
260
+ };
261
+
262
+ static_assert (!std::is_constructible_v<
263
+ ArrayRef<int >, iterator_range<TestRandomAccessIterator>>,
264
+ " cannot construct from iterator range with non-pointer iterator" );
265
+ static_assert (!std::is_constructible_v<ArrayRef<int >, iterator_range<int >>,
266
+ " cannot construct from iterator range with non-pointer iterator" );
267
+
268
+ class TestBase {};
269
+
270
+ class TestDerived : public TestBase {};
271
+
272
+ static_assert (
273
+ !std::is_constructible_v<ArrayRef<TestDerived>, iterator_range<TestBase *>>,
274
+ " cannot construct ArrayRef with derived type" );
275
+ static_assert (
276
+ !std::is_constructible_v<ArrayRef<TestBase>, iterator_range<TestDerived *>>,
277
+ " cannot construct ArrayRef base type" );
278
+ static_assert (!std::is_constructible_v<ArrayRef<TestBase *>,
279
+ iterator_range<TestDerived **>>,
280
+ " cannot construct ArrayRef pointer of base type" );
281
+
282
+ static_assert (
283
+ !std::is_constructible_v<ArrayRef<int >, iterator_range<const int *>>,
284
+ " cannot construct ArrayRef with non-const elements from const iterator "
285
+ " range" );
286
+ static_assert (
287
+ std::is_constructible_v<ArrayRef<char *>, iterator_range<char **>>,
288
+ " should be able to construct ArrayRef from iterator_range over pointers" );
289
+ static_assert (
290
+ !std::is_constructible_v<ArrayRef<char *>, iterator_range<char *const *>>,
291
+ " should be able to construct ArrayRef from iterator_range over pointers" );
292
+
293
+ TEST (ArrayRefTest, ArrayRefFromIteratorRange) {
294
+ std::array<int , 5 > A1{{42 , -5 , 0 , 1000000 , -1000000 }};
295
+ ArrayRef<int > A2 = make_range (A1.begin (), A1.end ());
296
+
297
+ EXPECT_EQ (A1.size (), A2.size ());
298
+ for (std::size_t i = 0 ; i < A1.size (); ++i)
299
+ EXPECT_EQ (A1[i], A2[i]);
300
+
301
+ ArrayRef<const int > A3 = make_range (A1.begin (), A1.end ());
302
+ EXPECT_EQ (A1.size (), A3.size ());
303
+ for (std::size_t i = 0 ; i < A1.size (); ++i)
304
+ EXPECT_EQ (A1[i], A3[i]);
305
+ }
306
+
307
+ TEST (ArrayRefTest, ArrayRefFromIteratorConstRange) {
308
+ std::array<const int , 5 > A1{{42 , -5 , 0 , 1000000 , -1000000 }};
309
+ ArrayRef<const int > A2 = make_range (A1.begin (), A1.end ());
310
+
311
+ EXPECT_EQ (A1.size (), A2.size ());
312
+ for (std::size_t i = 0 ; i < A1.size (); ++i)
313
+ EXPECT_EQ (A1[i], A2[i]);
314
+ }
315
+
258
316
static_assert (std::is_trivially_copyable_v<ArrayRef<int >>,
259
317
" trivially copyable" );
260
318
0 commit comments