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 
tests()25*c74059c5SNikolas Klauser TEST_CONSTEXPR_CXX20 bool tests()
265a83710eSEric Fiselier {
27907ed12dSNikolas Klauser     using IterRefT = std::iterator_traits<std::vector<bool>::iterator>::reference;
28907ed12dSNikolas Klauser     ASSERT_SAME_TYPE(IterRefT, std::vector<bool>::reference);
29907ed12dSNikolas Klauser 
30907ed12dSNikolas Klauser     using ConstIterRefT = std::iterator_traits<std::vector<bool>::const_iterator>::reference;
31907ed12dSNikolas Klauser #if !defined(_LIBCPP_VERSION) || defined(_LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL)
32907ed12dSNikolas Klauser     ASSERT_SAME_TYPE(ConstIterRefT, bool);
33907ed12dSNikolas Klauser #else
34907ed12dSNikolas Klauser     ASSERT_SAME_TYPE(ConstIterRefT, std::__bit_const_reference<std::vector<bool> >);
35907ed12dSNikolas Klauser #endif
365a83710eSEric Fiselier     {
375a83710eSEric Fiselier         typedef bool T;
385a83710eSEric Fiselier         typedef std::vector<T> C;
395a83710eSEric Fiselier         C c;
405a83710eSEric Fiselier         C::iterator i = c.begin();
415a83710eSEric Fiselier         C::iterator j = c.end();
425a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
435a83710eSEric Fiselier         assert(i == j);
445a83710eSEric Fiselier     }
455a83710eSEric Fiselier     {
465a83710eSEric Fiselier         typedef bool T;
475a83710eSEric Fiselier         typedef std::vector<T> C;
485a83710eSEric Fiselier         const C c;
495a83710eSEric Fiselier         C::const_iterator i = c.begin();
505a83710eSEric Fiselier         C::const_iterator j = c.end();
515a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
525a83710eSEric Fiselier         assert(i == j);
535a83710eSEric Fiselier     }
545a83710eSEric Fiselier     {
555a83710eSEric Fiselier         typedef bool T;
565a83710eSEric Fiselier         typedef std::vector<T> C;
575a83710eSEric Fiselier         C c;
585a83710eSEric Fiselier         C::const_iterator i = c.cbegin();
595a83710eSEric Fiselier         C::const_iterator j = c.cend();
605a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
615a83710eSEric Fiselier         assert(i == j);
625a83710eSEric Fiselier         assert(i == c.end());
635a83710eSEric Fiselier     }
645a83710eSEric Fiselier     {
655a83710eSEric Fiselier         typedef bool T;
665a83710eSEric Fiselier         typedef std::vector<T> C;
675a83710eSEric Fiselier         C::iterator i;
685a83710eSEric Fiselier         C::const_iterator j;
69*c74059c5SNikolas Klauser         (void) i;
70*c74059c5SNikolas Klauser         (void) j;
715a83710eSEric Fiselier     }
72f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
735a83710eSEric Fiselier     {
745a83710eSEric Fiselier         typedef bool T;
755a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
765a83710eSEric Fiselier         C c;
775a83710eSEric Fiselier         C::iterator i = c.begin();
785a83710eSEric Fiselier         C::iterator j = c.end();
795a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
805a83710eSEric Fiselier         assert(i == j);
815a83710eSEric Fiselier     }
825a83710eSEric Fiselier     {
835a83710eSEric Fiselier         typedef bool T;
845a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
855a83710eSEric Fiselier         const C c;
865a83710eSEric Fiselier         C::const_iterator i = c.begin();
875a83710eSEric Fiselier         C::const_iterator j = c.end();
885a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
895a83710eSEric Fiselier         assert(i == j);
905a83710eSEric Fiselier     }
915a83710eSEric Fiselier     {
925a83710eSEric Fiselier         typedef bool T;
935a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
945a83710eSEric Fiselier         C c;
955a83710eSEric Fiselier         C::const_iterator i = c.cbegin();
965a83710eSEric Fiselier         C::const_iterator j = c.cend();
975a83710eSEric Fiselier         assert(std::distance(i, j) == 0);
985a83710eSEric Fiselier         assert(i == j);
995a83710eSEric Fiselier         assert(i == c.end());
1005a83710eSEric Fiselier     }
1015a83710eSEric Fiselier     {
1025a83710eSEric Fiselier         typedef bool T;
1035a83710eSEric Fiselier         typedef std::vector<T, min_allocator<T>> C;
1045a83710eSEric Fiselier         C::iterator i;
1055a83710eSEric Fiselier         C::const_iterator j;
106*c74059c5SNikolas Klauser         (void) i;
107*c74059c5SNikolas Klauser         (void) j;
1085a83710eSEric Fiselier     }
1095a83710eSEric Fiselier #endif
1100f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
1115a83710eSEric Fiselier     { // N3644 testing
1125a83710eSEric Fiselier         std::vector<bool>::iterator ii1{}, ii2{};
1135a83710eSEric Fiselier         std::vector<bool>::iterator ii4 = ii1;
1145a83710eSEric Fiselier         std::vector<bool>::const_iterator cii{};
1155a83710eSEric Fiselier         assert ( ii1 == ii2 );
1165a83710eSEric Fiselier         assert ( ii1 == ii4 );
1175a83710eSEric Fiselier 
1185a83710eSEric Fiselier         assert (!(ii1 != ii2 ));
1195a83710eSEric Fiselier 
1205a83710eSEric Fiselier         assert ( (ii1 == cii ));
1215a83710eSEric Fiselier         assert ( (cii == ii1 ));
1225a83710eSEric Fiselier         assert (!(ii1 != cii ));
1235a83710eSEric Fiselier         assert (!(cii != ii1 ));
1245a83710eSEric Fiselier         assert (!(ii1 <  cii ));
1255a83710eSEric Fiselier         assert (!(cii <  ii1 ));
1265a83710eSEric Fiselier         assert ( (ii1 <= cii ));
1275a83710eSEric Fiselier         assert ( (cii <= ii1 ));
1285a83710eSEric Fiselier         assert (!(ii1 >  cii ));
1295a83710eSEric Fiselier         assert (!(cii >  ii1 ));
1305a83710eSEric Fiselier         assert ( (ii1 >= cii ));
1315a83710eSEric Fiselier         assert ( (cii >= ii1 ));
1325a83710eSEric Fiselier         assert (cii - ii1 == 0);
1335a83710eSEric Fiselier         assert (ii1 - cii == 0);
1345a83710eSEric Fiselier     }
1355a83710eSEric Fiselier #endif
1362df59c50SJF Bastien 
137*c74059c5SNikolas Klauser     return true;
138*c74059c5SNikolas Klauser }
139*c74059c5SNikolas Klauser 
main(int,char **)140*c74059c5SNikolas Klauser int main(int, char**)
141*c74059c5SNikolas Klauser {
142*c74059c5SNikolas Klauser     tests();
143*c74059c5SNikolas Klauser #if TEST_STD_VER > 17
144*c74059c5SNikolas Klauser     static_assert(tests());
145*c74059c5SNikolas Klauser #endif
1462df59c50SJF Bastien     return 0;
1475a83710eSEric Fiselier }
148