127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow//===----------------------------------------------------------------------===// 227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// 327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// The LLVM Compiler Infrastructure 427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// 527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open 627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// Source Licenses. See LICENSE.TXT for details. 727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// 827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow//===----------------------------------------------------------------------===// 927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 1027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// dynarray.overview 1127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 1227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_reference at(size_type n) const; 1327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// reference at(size_type n); 1427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 1527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <__config> 1627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 1727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#if _LIBCPP_STD_VER > 11 1827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 196b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clow#include <experimental/dynarray> 2027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <cassert> 2127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 2227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <algorithm> 2327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <complex> 2427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <string> 2527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 266b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowusing std::experimental::dynarray; 276b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clow 2827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T> 296b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowvoid dyn_at_fail ( dynarray<T> &dyn, size_t sz ) { 3027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow try { dyn.at (sz); } 3127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow catch (const std::out_of_range &) { return; } 3227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow assert ( false ); 3327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow } 3427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 3527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T> 366b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowvoid dyn_at_fail_const ( const dynarray<T> &dyn, size_t sz ) { 3727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow try { dyn.at (sz); } 3827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow catch (const std::out_of_range &) { return; } 3927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow assert ( false ); 4027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow } 4127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 4227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 4327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T> 446b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowvoid dyn_test_const ( const dynarray<T> &dyn, const std::initializer_list<T> &vals ) { 4527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow const T *data = dyn.data (); 4627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow auto it = vals.begin (); 4727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow for ( size_t i = 0; i < dyn.size(); ++i, ++it ) { 4827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow assert ( data + i == &dyn.at(i)); 4927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow assert ( *it == dyn.at(i)); 5027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow } 5127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 5227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dyn_at_fail_const ( dyn, dyn.size ()); 5327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dyn_at_fail_const ( dyn, 2*dyn.size ()); 5427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dyn_at_fail_const ( dyn, size_t (-1)); 5527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow } 5627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 5727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T> 586b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowvoid dyn_test ( dynarray<T> &dyn, const std::initializer_list<T> &vals ) { 5927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow T *data = dyn.data (); 6027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow auto it = vals.begin (); 6127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow for ( size_t i = 0; i < dyn.size(); ++i, ++it ) { 6227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow assert ( data + i == &dyn.at(i)); 6327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow assert ( *it == dyn.at(i)); 6427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow } 6527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 6627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dyn_at_fail ( dyn, dyn.size ()); 6727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dyn_at_fail ( dyn, 2*dyn.size ()); 6827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dyn_at_fail ( dyn, size_t (-1)); 6927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow } 7027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 7127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 7227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T> 7327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowvoid test ( std::initializer_list<T> vals ) { 746b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clow typedef dynarray<T> dynA; 7527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 7627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dynA d1 ( vals ); 7727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dyn_test ( d1, vals ); 7827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow dyn_test_const ( d1, vals ); 7927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow } 8027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 8127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowint main() 8227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow{ 8327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow test ( { 1, 1, 2, 3, 5, 8 } ); 8427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow test ( { 1., 1., 2., 3., 5., 8. } ); 8527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow test ( { std::string("1"), std::string("1"), std::string("2"), std::string("3"), 8627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow std::string("5"), std::string("8")} ); 8727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow 8827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow test<int> ( {} ); 8927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow test<std::complex<double>> ( {} ); 9027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow test<std::string> ( {} ); 9127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow} 9227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#else 9327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowint main() {} 9427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#endif 95