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_test_const ( const dynarray<T> &dyn, const std::initializer_list<T> &vals ) {
3027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    const T *data = dyn.data ();
3127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    auto it = vals.begin ();
3227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    for ( size_t i = 0; i < dyn.size(); ++i, ++it ) {
3327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow        assert ( data + i == &dyn[i]);
3427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow        assert ( *it == dyn[i]);
3527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow        }
3627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    }
3727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
3827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T>
396b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowvoid dyn_test ( dynarray<T> &dyn, const std::initializer_list<T> &vals ) {
4027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    T *data = dyn.data ();
4127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    auto it = vals.begin ();
4227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    for ( size_t i = 0; i < dyn.size(); ++i, ++it ) {
4327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow        assert ( data + i == &dyn[i]);
4427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow        assert ( *it == dyn[i]);
4527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow        }
4627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    }
4727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
4827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
4927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T>
5027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowvoid test ( std::initializer_list<T> vals ) {
516b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clow    typedef dynarray<T> dynA;
5227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
5327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dynA d1 ( vals );
5427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dyn_test ( d1, vals );
5527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dyn_test_const ( d1, vals );
5627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    }
5727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
5827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowint main()
5927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow{
6027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test ( { 1, 1, 2, 3, 5, 8 } );
6127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test ( { 1., 1., 2., 3., 5., 8. } );
6227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test ( { std::string("1"), std::string("1"), std::string("2"), std::string("3"),
6327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow                std::string("5"), std::string("8")} );
6427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
6527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test<int> ( {} );
6627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test<std::complex<double>> ( {} );
6727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test<std::string> ( {} );
6827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow}
6927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#else
7027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowint main() {}
7127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#endif
72