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
1327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// iterator       begin()        noexcept;
1427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_iterator begin()  const noexcept;
1527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_iterator cbegin() const noexcept;
1627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// iterator       end()          noexcept;
1727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_iterator end()    const noexcept;
1827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_iterator cend()   const noexcept;
1927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow//
2027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// reverse_iterator       rbegin()        noexcept;
2127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_reverse_iterator rbegin()  const noexcept;
2227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_reverse_iterator crbegin() const noexcept;
2327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// reverse_iterator       rend()          noexcept;
2427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_reverse_iterator rend()    const noexcept;
2527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow// const_reverse_iterator crend()   const noexcept;
2627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
2727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
2827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <__config>
2927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
3027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#if _LIBCPP_STD_VER > 11
3127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
326b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clow#include <experimental/dynarray>
3327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <cassert>
3427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
3527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <algorithm>
3627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <complex>
3727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#include <string>
3827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
396b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowusing std::experimental::dynarray;
406b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clow
4127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T>
426b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowvoid dyn_test_const ( const dynarray<T> &dyn ) {
4327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    const T *data = dyn.data ();
4427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( data == &*dyn.begin ());
4527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( data == &*dyn.cbegin ());
4627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
4727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( data + dyn.size() - 1 == &*dyn.rbegin ());
4827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( data + dyn.size() - 1 == &*dyn.crbegin ());
4927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
5027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( dyn.size () == std::distance ( dyn.begin(), dyn.end()));
5127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( dyn.size () == std::distance ( dyn.cbegin(), dyn.cend()));
5227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( dyn.size () == std::distance ( dyn.rbegin(), dyn.rend()));
5327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( dyn.size () == std::distance ( dyn.crbegin(), dyn.crend()));
5427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
5527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert (   dyn.begin ()  ==   dyn.cbegin ());
5627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( &*dyn.begin ()  == &*dyn.cbegin ());
5727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert (   dyn.rbegin () ==   dyn.crbegin ());
5827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( &*dyn.rbegin () == &*dyn.crbegin ());
5927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert (   dyn.end ()    ==   dyn.cend ());
6027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert (   dyn.rend ()   ==   dyn.crend ());
6127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    }
6227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
6327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T>
646b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clowvoid dyn_test ( dynarray<T> &dyn ) {
6527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    T *data = dyn.data ();
6627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( data == &*dyn.begin ());
6727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( data == &*dyn.cbegin ());
6827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
6927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( data + dyn.size() - 1 == &*dyn.rbegin ());
7027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( data + dyn.size() - 1 == &*dyn.crbegin ());
7127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
7227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( dyn.size () == std::distance ( dyn.begin(), dyn.end()));
7327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( dyn.size () == std::distance ( dyn.cbegin(), dyn.cend()));
7427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( dyn.size () == std::distance ( dyn.rbegin(), dyn.rend()));
7527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( dyn.size () == std::distance ( dyn.crbegin(), dyn.crend()));
7627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
7727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert (   dyn.begin ()  ==   dyn.cbegin ());
7827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( &*dyn.begin ()  == &*dyn.cbegin ());
7927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert (   dyn.rbegin () ==   dyn.crbegin ());
8027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert ( &*dyn.rbegin () == &*dyn.crbegin ());
8127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert (   dyn.end ()    ==   dyn.cend ());
8227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    assert (   dyn.rend ()   ==   dyn.crend ());
8327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    }
8427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
8527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
8627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowtemplate <class T>
8727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowvoid test ( const T &val ) {
886b7c2aeb004cc8e499f1a2281c356bee0bfc9061Marshall Clow    typedef dynarray<T> dynA;
8927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
9027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dynA d1 ( 4 );
9127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dyn_test ( d1 );
9227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dyn_test_const ( d1 );
9327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
9427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dynA d2 ( 7, val );
9527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dyn_test ( d2 );
9627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    dyn_test_const ( d2 );
9727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    }
9827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow
9927a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowint main()
10027a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow{
10127a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test<int> ( 14 );
10227a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test<double> ( 14.0 );
10327a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test<std::complex<double>> ( std::complex<double> ( 14, 0 ));
10427a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow    test<std::string> ( "fourteen" );
10527a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow}
10627a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#else
10727a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clowint main() {}
10827a1c252e3f2c0d1192e1e275ce3489b9f0025f9Marshall Clow#endif
109