109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//===----------------------------------------------------------------------===//
209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//
309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//                     The LLVM Compiler Infrastructure
409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//
509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// This file is dual licensed under the MIT and the University of Illinois Open
609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// Source Licenses. See LICENSE.TXT for details.
709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//
809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//===----------------------------------------------------------------------===//
909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
1009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// <iterator>
1109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// template <class C> auto begin(C& c) -> decltype(c.begin());
1209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// template <class C> auto begin(const C& c) -> decltype(c.begin());
1309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// template <class C> auto end(C& c) -> decltype(c.end());
1409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// template <class C> auto end(const C& c) -> decltype(c.end());
1509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il);
1609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow// template <class E> reverse_iterator<const E*> rend(initializer_list<E> il);
1709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
1809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#include <__config>
1909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
2009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#if __cplusplus >= 201103L
2109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#include <iterator>
2209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#include <cassert>
2309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#include <vector>
2409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#include <array>
2509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#include <list>
2609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#include <initializer_list>
2709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
2809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowtemplate<typename C>
2909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowvoid test_const_container( const C & c, typename C::value_type val ) {
3009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::begin(c)   == c.begin());
3109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert (*std::begin(c)   ==  val );
3209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::begin(c)   != c.end());
3309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::end(c)     == c.end());
3409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#if _LIBCPP_STD_VER > 11
3509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::cbegin(c)  == c.cbegin());
3609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::cbegin(c)  != c.cend());
3709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::cend(c)    == c.cend());
3809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::rbegin(c)  == c.rbegin());
3909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::rbegin(c)  != c.rend());
4009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::rend(c)    == c.rend());
4109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::crbegin(c) == c.crbegin());
4209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::crbegin(c) != c.crend());
4309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::crend(c)   == c.crend());
4409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#endif
4509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    }
4609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
4709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowtemplate<typename T>
4809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowvoid test_const_container( const std::initializer_list<T> & c, T val ) {
4909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::begin(c)   == c.begin());
5009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert (*std::begin(c)   ==  val );
5109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::begin(c)   != c.end());
5209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::end(c)     == c.end());
5309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#if _LIBCPP_STD_VER > 11
5409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//  initializer_list doesn't have cbegin/cend/rbegin/rend
559dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow//  but std::cbegin(),etc work (b/c they're general fn templates)
5609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::cbegin(c)  == c.cbegin());
5709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::cbegin(c)  != c.cend());
5809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::cend(c)    == c.cend());
5909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::rbegin(c)  == c.rbegin());
6009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::rbegin(c)  != c.rend());
6109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::rend(c)    == c.rend());
6209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::crbegin(c) == c.crbegin());
6309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::crbegin(c) != c.crend());
6409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::crend(c)   == c.crend());
6509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#endif
6609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    }
6709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
6809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowtemplate<typename C>
6909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowvoid test_container( C & c, typename C::value_type val ) {
7009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::begin(c)   == c.begin());
7109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert (*std::begin(c)   ==  val );
7209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::begin(c)   != c.end());
7309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::end(c)     == c.end());
7409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#if _LIBCPP_STD_VER > 11
7509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::cbegin(c)  == c.cbegin());
7609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::cbegin(c)  != c.cend());
7709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::cend(c)    == c.cend());
7809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::rbegin(c)  == c.rbegin());
7909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::rbegin(c)  != c.rend());
8009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::rend(c)    == c.rend());
8109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::crbegin(c) == c.crbegin());
8209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::crbegin(c) != c.crend());
8309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::crend(c)   == c.crend());
8409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#endif
8509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    }
8609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
8709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowtemplate<typename T>
8809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowvoid test_container( std::initializer_list<T> & c, T val ) {
8909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::begin(c)   == c.begin());
9009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert (*std::begin(c)   ==  val );
9109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::begin(c)   != c.end());
9209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    assert ( std::end(c)     == c.end());
9309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#if _LIBCPP_STD_VER > 11
9409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//  initializer_list doesn't have cbegin/cend/rbegin/rend
9509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::cbegin(c)  == c.cbegin());
9609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::cbegin(c)  != c.cend());
9709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::cend(c)    == c.cend());
9809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::rbegin(c)  == c.rbegin());
9909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::rbegin(c)  != c.rend());
10009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::rend(c)    == c.rend());
10109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::crbegin(c) == c.crbegin());
10209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::crbegin(c) != c.crend());
10309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow//     assert ( std::crend(c)   == c.crend());
10409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#endif
10509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    }
10609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
1079dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clowtemplate<typename T, size_t Sz>
1089dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clowvoid test_const_array( const T (&array)[Sz] ) {
1099dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    assert ( std::begin(array)  == array );
1109dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    assert (*std::begin(array)  ==  array[0] );
1119dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    assert ( std::begin(array)  != std::end(array));
1129dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    assert ( std::end(array)    == array + Sz);
1139dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow#if _LIBCPP_STD_VER > 11
1149dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    assert ( std::cbegin(array) == array );
1159dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    assert (*std::cbegin(array) == array[0] );
1169dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    assert ( std::cbegin(array) != std::cend(array));
1179dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    assert ( std::cend(array)   == array + Sz);
1189dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow#endif
1199dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    }
1209dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow
12109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowint main(){
12209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    std::vector<int> v; v.push_back(1);
12309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    std::list<int> l;   l.push_back(2);
12409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    std::array<int, 1> a; a[0] = 3;
12509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    std::initializer_list<int> il = { 4 };
12609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
12709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    test_container ( v, 1 );
12809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    test_container ( l, 2 );
12909da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    test_container ( a, 3 );
13009da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    test_container ( il, 4 );
13109da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
13209da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    test_const_container ( v, 1 );
13309da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    test_const_container ( l, 2 );
13409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    test_const_container ( a, 3 );
13509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow    test_const_container ( il, 4 );
1369dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow
1379dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    static constexpr int arrA [] { 1, 2, 3 };
1389dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    test_const_array ( arrA );
1399dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow#if _LIBCPP_STD_VER > 11
1409dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    constexpr const int *b = std::cbegin(arrA);
1419dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    constexpr const int *e = std::cend(arrA);
1429dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow    static_assert(e - b == 3, "");
1439dacb2f7139ca928b0dc4a5bd32f4a22bf993c29Marshall Clow#endif
14409da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow}
14509da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow
14609da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#else
14709da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clowint main(){}
14809da3c053c74abc41bdaaaa20213d6269a68f44dMarshall Clow#endif
149