brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 150ade5 Raw
101 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <algorithm>10 11// template<BidirectionalIterator InIter, OutputIterator<auto, InIter::reference> OutIter>12//   constexpr OutIter          // constexpr after C++1713//   reverse_copy(InIter first, InIter last, OutIter result);14 15#include <algorithm>16#include <cassert>17 18#include "test_macros.h"19#include "test_iterators.h"20 21#if TEST_STD_VER > 1722TEST_CONSTEXPR bool test_constexpr() {23    int ia[] = {1, 3, 5, 2, 5, 6};24    int ib[std::size(ia)] = {0};25 26    auto it = std::reverse_copy(std::begin(ia), std::end(ia), std::begin(ib));27 28    return std::distance(std::begin(ib), it) == static_cast<int>(std::size(ia))29        && std::equal   (std::begin(ia), std::end(ia), std::rbegin(ib))30           ;31    }32#endif33 34template <class InIter, class OutIter>35void36test()37{38    const int ia[] = {0};39    const unsigned sa = sizeof(ia)/sizeof(ia[0]);40    int ja[sa] = {-1};41    OutIter r = std::reverse_copy(InIter(ia), InIter(ia), OutIter(ja));42    assert(base(r) == ja);43    assert(ja[0] == -1);44    r = std::reverse_copy(InIter(ia), InIter(ia+sa), OutIter(ja));45    assert(ja[0] == 0);46 47    const int ib[] = {0, 1};48    const unsigned sb = sizeof(ib)/sizeof(ib[0]);49    int jb[sb] = {-1};50    r = std::reverse_copy(InIter(ib), InIter(ib+sb), OutIter(jb));51    assert(base(r) == jb+sb);52    assert(jb[0] == 1);53    assert(jb[1] == 0);54 55    const int ic[] = {0, 1, 2};56    const unsigned sc = sizeof(ic)/sizeof(ic[0]);57    int jc[sc] = {-1};58    r = std::reverse_copy(InIter(ic), InIter(ic+sc), OutIter(jc));59    assert(base(r) == jc+sc);60    assert(jc[0] == 2);61    assert(jc[1] == 1);62    assert(jc[2] == 0);63 64    int id[] = {0, 1, 2, 3};65    const unsigned sd = sizeof(id)/sizeof(id[0]);66    int jd[sd] = {-1};67    r = std::reverse_copy(InIter(id), InIter(id+sd), OutIter(jd));68    assert(base(r) == jd+sd);69    assert(jd[0] == 3);70    assert(jd[1] == 2);71    assert(jd[2] == 1);72    assert(jd[3] == 0);73}74 75int main(int, char**)76{77    test<bidirectional_iterator<const int*>, cpp17_output_iterator<int*> >();78    test<bidirectional_iterator<const int*>, forward_iterator<int*> >();79    test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();80    test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();81    test<bidirectional_iterator<const int*>, int*>();82 83    test<random_access_iterator<const int*>, cpp17_output_iterator<int*> >();84    test<random_access_iterator<const int*>, forward_iterator<int*> >();85    test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();86    test<random_access_iterator<const int*>, random_access_iterator<int*> >();87    test<random_access_iterator<const int*>, int*>();88 89    test<const int*, cpp17_output_iterator<int*> >();90    test<const int*, forward_iterator<int*> >();91    test<const int*, bidirectional_iterator<int*> >();92    test<const int*, random_access_iterator<int*> >();93    test<const int*, int*>();94 95#if TEST_STD_VER > 1796    static_assert(test_constexpr());97#endif98 99  return 0;100}101