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 // <list>
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 <list>
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 
main(int,char **)31*2df59c50SJF Bastien int main(int, char**)
325a83710eSEric Fiselier {
335a83710eSEric Fiselier     {
345a83710eSEric Fiselier         typedef int T;
355a83710eSEric Fiselier         typedef std::list<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::list<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::list<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::list<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::list<T> C;
775a83710eSEric Fiselier         C::iterator i;
785a83710eSEric Fiselier         C::const_iterator j;
795a83710eSEric Fiselier     }
80f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
815a83710eSEric Fiselier     {
825a83710eSEric Fiselier         typedef int T;
835a83710eSEric Fiselier         typedef std::list<T, min_allocator<T>> C;
845a83710eSEric Fiselier         C c;
855a83710eSEric Fiselier         C::iterator i = c.begin();
865a83710eSEric Fiselier         C::iterator j = c.end();
875a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
885a83710eSEric Fiselier         assert(i == j);
895a83710eSEric Fiselier     }
905a83710eSEric Fiselier     {
915a83710eSEric Fiselier         typedef int T;
925a83710eSEric Fiselier         typedef std::list<T, min_allocator<T>> C;
935a83710eSEric Fiselier         const C c;
945a83710eSEric Fiselier         C::const_iterator i = c.begin();
955a83710eSEric Fiselier         C::const_iterator j = c.end();
965a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
975a83710eSEric Fiselier         assert(i == j);
985a83710eSEric Fiselier     }
995a83710eSEric Fiselier     {
1005a83710eSEric Fiselier         typedef int T;
1015a83710eSEric Fiselier         typedef std::list<T, min_allocator<T>> C;
1025a83710eSEric Fiselier         C c;
1035a83710eSEric Fiselier         C::const_iterator i = c.cbegin();
1045a83710eSEric Fiselier         C::const_iterator j = c.cend();
1055a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
1065a83710eSEric Fiselier         assert(i == j);
1075a83710eSEric Fiselier         assert(i == c.end());
1085a83710eSEric Fiselier     }
1095a83710eSEric Fiselier     {
1105a83710eSEric Fiselier         typedef int T;
1115a83710eSEric Fiselier         typedef std::list<T, min_allocator<T>> C;
1125a83710eSEric Fiselier         const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
1135a83710eSEric Fiselier         C c(std::begin(t), std::end(t));
1145a83710eSEric Fiselier         C::iterator i = c.begin();
1155a83710eSEric Fiselier         assert(*i == 0);
1165a83710eSEric Fiselier         ++i;
1175a83710eSEric Fiselier         assert(*i == 1);
1185a83710eSEric Fiselier         *i = 10;
1195a83710eSEric Fiselier         assert(*i == 10);
1205a83710eSEric Fiselier         assert(std::distance(c.begin(), c.end()) == 10);
1215a83710eSEric Fiselier     }
1225a83710eSEric Fiselier     {
1235a83710eSEric Fiselier         typedef int T;
1245a83710eSEric Fiselier         typedef std::list<T, min_allocator<T>> C;
1255a83710eSEric Fiselier         C::iterator i;
1265a83710eSEric Fiselier         C::const_iterator j;
1275a83710eSEric Fiselier     }
1285a83710eSEric Fiselier     {
1295a83710eSEric Fiselier         typedef A T;
1305a83710eSEric Fiselier         typedef std::list<T, min_allocator<T>> C;
1315a83710eSEric Fiselier         C c = {A{1, 2}};
1325a83710eSEric Fiselier         C::iterator i = c.begin();
1335a83710eSEric Fiselier         i->first = 3;
1345a83710eSEric Fiselier         C::const_iterator j = i;
1355a83710eSEric Fiselier         assert(j->first == 3);
1365a83710eSEric Fiselier     }
1375a83710eSEric Fiselier #endif
1380f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
1395a83710eSEric Fiselier     {
1405a83710eSEric Fiselier         std::list<int>::iterator ii1{}, ii2{};
1415a83710eSEric Fiselier         std::list<int>::iterator ii4 = ii1;
1425a83710eSEric Fiselier         std::list<int>::const_iterator cii{};
1435a83710eSEric Fiselier         assert ( ii1 == ii2 );
1445a83710eSEric Fiselier         assert ( ii1 == ii4 );
1455a83710eSEric Fiselier 
1465a83710eSEric Fiselier         assert (!(ii1 != ii2 ));
1475a83710eSEric Fiselier 
1485a83710eSEric Fiselier         assert ( (ii1 == cii ));
1495a83710eSEric Fiselier         assert ( (cii == ii1 ));
1505a83710eSEric Fiselier         assert (!(ii1 != cii ));
1515a83710eSEric Fiselier         assert (!(cii != ii1 ));
1525a83710eSEric Fiselier     }
1535a83710eSEric Fiselier #endif
1545a83710eSEric Fiselier 
155*2df59c50SJF Bastien 
156*2df59c50SJF Bastien   return 0;
1575a83710eSEric Fiselier }
158