1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
// { dg-options "-std=gnu++20" }
// { dg-do compile { target c++20 } }
// { dg-xfail-if "not supported" { debug_mode } }
#include <vector>
#include <testsuite_hooks.h>
constexpr bool
test_iterators()
{
std::vector<int> v;
VERIFY( v.begin() == v.end() );
v.reserve(1);
VERIFY( v.begin() == v.end() );
v.resize(2);
VERIFY( v.begin() != v.end() );
VERIFY( v.cbegin() == v.begin() );
VERIFY( v.crbegin() == v.rbegin() );
VERIFY( v.cend() == v.end() );
VERIFY( v.crend() == v.rend() );
auto it = v.begin();
VERIFY( &*it == &v.front() );
VERIFY( it++ == v.begin() );
VERIFY( ++it == v.end() );
VERIFY( (it - 2) == v.begin() );
it -= 2;
it += 1;
VERIFY( (it + 1) == v.end() );
auto rit = v.rbegin();
VERIFY( &*rit == &v.back() );
VERIFY( rit++ == v.rbegin() );
VERIFY( ++rit == v.rend() );
VERIFY( (rit - 2) == v.rbegin() );
rit -= 2;
rit += 1;
VERIFY( (rit + 1) == v.rend() );
return true;
}
static_assert(test_iterators());
constexpr bool
test_access()
{
std::vector<int> v{1, 2, 3};
VERIFY( v.at(1) == 2 );
VERIFY( v[2] == 3 );
VERIFY( &v[2] == &v.at(2) );
VERIFY( &v.front() == &v[0] );
VERIFY( &v.back() == &v[2] );
const auto& vc = v;
VERIFY( vc.at(1) == 2 );
VERIFY( &vc.at(1) == &v.at(1) );
VERIFY( &vc.at(1) == &vc[1] );
VERIFY( &vc.front() == &vc[0] );
VERIFY( &vc.back() == &vc[2] );
return true;
}
static_assert(test_access());
template<typename T = int>
constexpr std::false_type
access_empty() { return {}; }
template<typename T = int>
requires (std::bool_constant<(std::vector<T>().at(0), true)>::value)
constexpr std::true_type
access_empty() { return {}; }
template<typename T = int>
requires (std::bool_constant<(std::vector<T>()[0], true)>::value)
constexpr std::true_type
access_empty() { return {}; }
template<typename T = int>
requires (std::bool_constant<(std::vector<T>().front(), true)>::value)
constexpr std::true_type
access_empty() { return {}; }
template<typename T = int>
requires (std::bool_constant<(std::vector<T>().back(), true)>::value)
constexpr std::true_type
access_empty() { return {}; }
static_assert( ! access_empty() );
|