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