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