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