15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <vector>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // iterator       begin();
125a83710eSEric Fiselier // iterator       end();
135a83710eSEric Fiselier // const_iterator begin()  const;
145a83710eSEric Fiselier // const_iterator end()    const;
155a83710eSEric Fiselier // const_iterator cbegin() const;
165a83710eSEric Fiselier // const_iterator cend()   const;
175a83710eSEric Fiselier 
185a83710eSEric Fiselier #include <vector>
195a83710eSEric Fiselier #include <cassert>
205a83710eSEric Fiselier #include <iterator>
215a83710eSEric Fiselier 
220f901c7eSStephan T. Lavavej #include "test_macros.h"
235a83710eSEric Fiselier #include "min_allocator.h"
245a83710eSEric Fiselier 
255a83710eSEric Fiselier struct A
265a83710eSEric Fiselier {
275a83710eSEric Fiselier     int first;
285a83710eSEric Fiselier     int second;
295a83710eSEric Fiselier };
305a83710eSEric Fiselier 
tests()31*c74059c5SNikolas Klauser TEST_CONSTEXPR_CXX20 bool tests()
325a83710eSEric Fiselier {
335a83710eSEric Fiselier     {
345a83710eSEric Fiselier         typedef int T;
355a83710eSEric Fiselier         typedef std::vector<T> C;
365a83710eSEric Fiselier         C c;
375a83710eSEric Fiselier         C::iterator i = c.begin();
385a83710eSEric Fiselier         C::iterator j = c.end();
395a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
405a83710eSEric Fiselier         assert(i == j);
415a83710eSEric Fiselier     }
425a83710eSEric Fiselier     {
435a83710eSEric Fiselier         typedef int T;
445a83710eSEric Fiselier         typedef std::vector<T> C;
455a83710eSEric Fiselier         const C c;
465a83710eSEric Fiselier         C::const_iterator i = c.begin();
475a83710eSEric Fiselier         C::const_iterator j = c.end();
485a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
495a83710eSEric Fiselier         assert(i == j);
505a83710eSEric Fiselier     }
515a83710eSEric Fiselier     {
525a83710eSEric Fiselier         typedef int T;
535a83710eSEric Fiselier         typedef std::vector<T> C;
545a83710eSEric Fiselier         C c;
555a83710eSEric Fiselier         C::const_iterator i = c.cbegin();
565a83710eSEric Fiselier         C::const_iterator j = c.cend();
575a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
585a83710eSEric Fiselier         assert(i == j);
595a83710eSEric Fiselier         assert(i == c.end());
605a83710eSEric Fiselier     }
615a83710eSEric Fiselier     {
625a83710eSEric Fiselier         typedef int T;
635a83710eSEric Fiselier         typedef std::vector<T> C;
645a83710eSEric Fiselier         const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
655a83710eSEric Fiselier         C c(std::begin(t), std::end(t));
665a83710eSEric Fiselier         C::iterator i = c.begin();
675a83710eSEric Fiselier         assert(*i == 0);
685a83710eSEric Fiselier         ++i;
695a83710eSEric Fiselier         assert(*i == 1);
705a83710eSEric Fiselier         *i = 10;
715a83710eSEric Fiselier         assert(*i == 10);
725a83710eSEric Fiselier         assert(std::distance(c.begin(), c.end()) == 10);
735a83710eSEric Fiselier     }
745a83710eSEric Fiselier     {
755a83710eSEric Fiselier         typedef int T;
765a83710eSEric Fiselier         typedef std::vector<T> C;
775a83710eSEric Fiselier         C::iterator i;
785a83710eSEric Fiselier         C::const_iterator j;
793f7d2090SMarshall Clow         (void) i;
803f7d2090SMarshall Clow         (void) j;
815a83710eSEric Fiselier     }
82f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
835a83710eSEric Fiselier     {
845a83710eSEric Fiselier         typedef int T;
855a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
865a83710eSEric Fiselier         C c;
875a83710eSEric Fiselier         C::iterator i = c.begin();
885a83710eSEric Fiselier         C::iterator j = c.end();
895a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
905a83710eSEric Fiselier         assert(i == j);
915a83710eSEric Fiselier     }
925a83710eSEric Fiselier     {
935a83710eSEric Fiselier         typedef int T;
945a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
955a83710eSEric Fiselier         const C c;
965a83710eSEric Fiselier         C::const_iterator i = c.begin();
975a83710eSEric Fiselier         C::const_iterator j = c.end();
985a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
995a83710eSEric Fiselier         assert(i == j);
1005a83710eSEric Fiselier     }
1015a83710eSEric Fiselier     {
1025a83710eSEric Fiselier         typedef int T;
1035a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
1045a83710eSEric Fiselier         C c;
1055a83710eSEric Fiselier         C::const_iterator i = c.cbegin();
1065a83710eSEric Fiselier         C::const_iterator j = c.cend();
1075a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
1085a83710eSEric Fiselier         assert(i == j);
1095a83710eSEric Fiselier         assert(i == c.end());
1105a83710eSEric Fiselier     }
1115a83710eSEric Fiselier     {
1125a83710eSEric Fiselier         typedef int T;
1135a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
1145a83710eSEric Fiselier         const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
1155a83710eSEric Fiselier         C c(std::begin(t), std::end(t));
1165a83710eSEric Fiselier         C::iterator i = c.begin();
1175a83710eSEric Fiselier         assert(*i == 0);
1185a83710eSEric Fiselier         ++i;
1195a83710eSEric Fiselier         assert(*i == 1);
1205a83710eSEric Fiselier         *i = 10;
1215a83710eSEric Fiselier         assert(*i == 10);
1225a83710eSEric Fiselier         assert(std::distance(c.begin(), c.end()) == 10);
1235a83710eSEric Fiselier     }
1245a83710eSEric Fiselier     {
1255a83710eSEric Fiselier         typedef int T;
1265a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
1275a83710eSEric Fiselier         C::iterator i;
1285a83710eSEric Fiselier         C::const_iterator j;
1293f7d2090SMarshall Clow         (void) i;
1303f7d2090SMarshall Clow         (void) j;
1315a83710eSEric Fiselier     }
1325a83710eSEric Fiselier     {
1335a83710eSEric Fiselier         typedef A T;
1345a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
1355a83710eSEric Fiselier         C c = {A{1, 2}};
1365a83710eSEric Fiselier         C::iterator i = c.begin();
1375a83710eSEric Fiselier         i->first = 3;
1385a83710eSEric Fiselier         C::const_iterator j = i;
1395a83710eSEric Fiselier         assert(j->first == 3);
1405a83710eSEric Fiselier     }
1415a83710eSEric Fiselier #endif
1420f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
1435a83710eSEric Fiselier     { // N3644 testing
1445a83710eSEric Fiselier         typedef std::vector<int> C;
1455a83710eSEric Fiselier         C::iterator ii1{}, ii2{};
1465a83710eSEric Fiselier         C::iterator ii4 = ii1;
1475a83710eSEric Fiselier         C::const_iterator cii{};
1485a83710eSEric Fiselier         assert ( ii1 == ii2 );
1495a83710eSEric Fiselier         assert ( ii1 == ii4 );
1505a83710eSEric Fiselier 
1515a83710eSEric Fiselier         assert (!(ii1 != ii2 ));
1525a83710eSEric Fiselier 
1535a83710eSEric Fiselier         assert ( (ii1 == cii ));
1545a83710eSEric Fiselier         assert ( (cii == ii1 ));
1555a83710eSEric Fiselier         assert (!(ii1 != cii ));
1565a83710eSEric Fiselier         assert (!(cii != ii1 ));
1575a83710eSEric Fiselier         assert (!(ii1 <  cii ));
1585a83710eSEric Fiselier         assert (!(cii <  ii1 ));
1595a83710eSEric Fiselier         assert ( (ii1 <= cii ));
1605a83710eSEric Fiselier         assert ( (cii <= ii1 ));
1615a83710eSEric Fiselier         assert (!(ii1 >  cii ));
1625a83710eSEric Fiselier         assert (!(cii >  ii1 ));
1635a83710eSEric Fiselier         assert ( (ii1 >= cii ));
1645a83710eSEric Fiselier         assert ( (cii >= ii1 ));
1655a83710eSEric Fiselier         assert (cii - ii1 == 0);
1665a83710eSEric Fiselier         assert (ii1 - cii == 0);
1675a83710eSEric Fiselier     }
1685a83710eSEric Fiselier #endif
1692df59c50SJF Bastien 
170*c74059c5SNikolas Klauser     return true;
171*c74059c5SNikolas Klauser }
172*c74059c5SNikolas Klauser 
main(int,char **)173*c74059c5SNikolas Klauser int main(int, char**)
174*c74059c5SNikolas Klauser {
175*c74059c5SNikolas Klauser     tests();
176*c74059c5SNikolas Klauser #if TEST_STD_VER > 17
177*c74059c5SNikolas Klauser     static_assert(tests());
178*c74059c5SNikolas Klauser #endif
1792df59c50SJF Bastien     return 0;
1805a83710eSEric Fiselier }
181