Home | History | Annotate | Download | only in array
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <array>
     11 
     12 // iterator, const_iterator
     13 
     14 #include <array>
     15 #include <iterator>
     16 #include <cassert>
     17 
     18 #include "test_macros.h"
     19 
     20 // std::array is explicitly allowed to be initialized with A a = { init-list };.
     21 // Disable the missing braces warning for this reason.
     22 #include "disable_missing_braces_warning.h"
     23 
     24 int main()
     25 {
     26     {
     27     typedef std::array<int, 5> C;
     28     C c;
     29     C::iterator i;
     30     i = c.begin();
     31     C::const_iterator j;
     32     j = c.cbegin();
     33     assert(i == j);
     34     }
     35     {
     36     typedef std::array<int, 0> C;
     37     C c;
     38     C::iterator i;
     39     i = c.begin();
     40     C::const_iterator j;
     41     j = c.cbegin();
     42     assert(i == j);
     43     }
     44 
     45 #if TEST_STD_VER > 11
     46     { // N3644 testing
     47         {
     48         typedef std::array<int, 5> C;
     49         C::iterator ii1{}, ii2{};
     50         C::iterator ii4 = ii1;
     51         C::const_iterator cii{};
     52         assert ( ii1 == ii2 );
     53         assert ( ii1 == ii4 );
     54         assert ( ii1 == cii );
     55 
     56         assert ( !(ii1 != ii2 ));
     57         assert ( !(ii1 != cii ));
     58 
     59         C c;
     60         assert ( c.begin()   == std::begin(c));
     61         assert ( c.cbegin()  == std::cbegin(c));
     62         assert ( c.rbegin()  == std::rbegin(c));
     63         assert ( c.crbegin() == std::crbegin(c));
     64         assert ( c.end()     == std::end(c));
     65         assert ( c.cend()    == std::cend(c));
     66         assert ( c.rend()    == std::rend(c));
     67         assert ( c.crend()   == std::crend(c));
     68 
     69         assert ( std::begin(c)   != std::end(c));
     70         assert ( std::rbegin(c)  != std::rend(c));
     71         assert ( std::cbegin(c)  != std::cend(c));
     72         assert ( std::crbegin(c) != std::crend(c));
     73         }
     74         {
     75         typedef std::array<int, 0> C;
     76         C::iterator ii1{}, ii2{};
     77         C::iterator ii4 = ii1;
     78         C::const_iterator cii{};
     79         assert ( ii1 == ii2 );
     80         assert ( ii1 == ii4 );
     81 
     82         assert (!(ii1 != ii2 ));
     83 
     84         assert ( (ii1 == cii ));
     85         assert ( (cii == ii1 ));
     86         assert (!(ii1 != cii ));
     87         assert (!(cii != ii1 ));
     88         assert (!(ii1 <  cii ));
     89         assert (!(cii <  ii1 ));
     90         assert ( (ii1 <= cii ));
     91         assert ( (cii <= ii1 ));
     92         assert (!(ii1 >  cii ));
     93         assert (!(cii >  ii1 ));
     94         assert ( (ii1 >= cii ));
     95         assert ( (cii >= ii1 ));
     96         assert (cii - ii1 == 0);
     97         assert (ii1 - cii == 0);
     98 
     99         C c;
    100         assert ( c.begin()   == std::begin(c));
    101         assert ( c.cbegin()  == std::cbegin(c));
    102         assert ( c.rbegin()  == std::rbegin(c));
    103         assert ( c.crbegin() == std::crbegin(c));
    104         assert ( c.end()     == std::end(c));
    105         assert ( c.cend()    == std::cend(c));
    106         assert ( c.rend()    == std::rend(c));
    107         assert ( c.crend()   == std::crend(c));
    108 
    109         assert ( std::begin(c)   == std::end(c));
    110         assert ( std::rbegin(c)  == std::rend(c));
    111         assert ( std::cbegin(c)  == std::cend(c));
    112         assert ( std::crbegin(c) == std::crend(c));
    113         }
    114     }
    115 #endif
    116 #if TEST_STD_VER > 14
    117     {
    118         typedef std::array<int, 5> C;
    119         constexpr C c{0,1,2,3,4};
    120 
    121         static_assert ( c.begin()   == std::begin(c), "");
    122         static_assert ( c.cbegin()  == std::cbegin(c), "");
    123         static_assert ( c.end()     == std::end(c), "");
    124         static_assert ( c.cend()    == std::cend(c), "");
    125 
    126         static_assert ( c.rbegin()  == std::rbegin(c), "");
    127         static_assert ( c.crbegin() == std::crbegin(c), "");
    128         static_assert ( c.rend()    == std::rend(c), "");
    129         static_assert ( c.crend()   == std::crend(c), "");
    130 
    131         static_assert ( std::begin(c)   != std::end(c), "");
    132         static_assert ( std::rbegin(c)  != std::rend(c), "");
    133         static_assert ( std::cbegin(c)  != std::cend(c), "");
    134         static_assert ( std::crbegin(c) != std::crend(c), "");
    135 
    136         static_assert ( *c.begin()  == 0, "");
    137         static_assert ( *c.rbegin()  == 4, "");
    138 
    139         static_assert ( *std::begin(c)   == 0, "" );
    140         static_assert ( *std::cbegin(c)  == 0, "" );
    141         static_assert ( *std::rbegin(c)  == 4, "" );
    142         static_assert ( *std::crbegin(c) == 4, "" );
    143     }
    144 #endif
    145 }
    146