brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 8e356cc Raw
152 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<ForwardIterator InIter, OutputIterator<auto, InIter::reference> OutIter>12//   constexpr OutIter          // constexpr since C++2013//   rotate_copy(InIter first, InIter middle, InIter last, OutIter result);14 15#include <algorithm>16#include <cassert>17 18#include "test_macros.h"19#include "test_iterators.h"20#include "type_algorithms.h"21 22struct TestIter {23  template <class InIter>24  TEST_CONSTEXPR_CXX20 void operator()() const {25    types::for_each(26        types::concatenate_t<types::forward_iterator_list<int*>, types::type_list<cpp17_output_iterator<int*> > >(),27        TestImpl<InIter>());28  }29 30  template <class InIter>31  struct TestImpl {32    template <class OutIter>33    TEST_CONSTEXPR_CXX20 void operator()() const {34      int ia[]          = {0, 1, 2, 3};35      const unsigned sa = sizeof(ia) / sizeof(ia[0]);36      int ib[sa]        = {0};37 38      OutIter r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia), OutIter(ib));39      assert(base(r) == ib);40 41      r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia + 1), OutIter(ib));42      assert(base(r) == ib + 1);43      assert(ib[0] == 0);44 45      r = std::rotate_copy(InIter(ia), InIter(ia + 1), InIter(ia + 1), OutIter(ib));46      assert(base(r) == ib + 1);47      assert(ib[0] == 0);48 49      r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia + 2), OutIter(ib));50      assert(base(r) == ib + 2);51      assert(ib[0] == 0);52      assert(ib[1] == 1);53 54      r = std::rotate_copy(InIter(ia), InIter(ia + 1), InIter(ia + 2), OutIter(ib));55      assert(base(r) == ib + 2);56      assert(ib[0] == 1);57      assert(ib[1] == 0);58 59      r = std::rotate_copy(InIter(ia), InIter(ia + 2), InIter(ia + 2), OutIter(ib));60      assert(base(r) == ib + 2);61      assert(ib[0] == 0);62      assert(ib[1] == 1);63 64      r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia + 3), OutIter(ib));65      assert(base(r) == ib + 3);66      assert(ib[0] == 0);67      assert(ib[1] == 1);68      assert(ib[2] == 2);69 70      r = std::rotate_copy(InIter(ia), InIter(ia + 1), InIter(ia + 3), OutIter(ib));71      assert(base(r) == ib + 3);72      assert(ib[0] == 1);73      assert(ib[1] == 2);74      assert(ib[2] == 0);75 76      r = std::rotate_copy(InIter(ia), InIter(ia + 2), InIter(ia + 3), OutIter(ib));77      assert(base(r) == ib + 3);78      assert(ib[0] == 2);79      assert(ib[1] == 0);80      assert(ib[2] == 1);81 82      r = std::rotate_copy(InIter(ia), InIter(ia + 3), InIter(ia + 3), OutIter(ib));83      assert(base(r) == ib + 3);84      assert(ib[0] == 0);85      assert(ib[1] == 1);86      assert(ib[2] == 2);87 88      r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia + 4), OutIter(ib));89      assert(base(r) == ib + 4);90      assert(ib[0] == 0);91      assert(ib[1] == 1);92      assert(ib[2] == 2);93      assert(ib[3] == 3);94 95      r = std::rotate_copy(InIter(ia), InIter(ia + 1), InIter(ia + 4), OutIter(ib));96      assert(base(r) == ib + 4);97      assert(ib[0] == 1);98      assert(ib[1] == 2);99      assert(ib[2] == 3);100      assert(ib[3] == 0);101 102      r = std::rotate_copy(InIter(ia), InIter(ia + 2), InIter(ia + 4), OutIter(ib));103      assert(base(r) == ib + 4);104      assert(ib[0] == 2);105      assert(ib[1] == 3);106      assert(ib[2] == 0);107      assert(ib[3] == 1);108 109      r = std::rotate_copy(InIter(ia), InIter(ia + 3), InIter(ia + 4), OutIter(ib));110      assert(base(r) == ib + 4);111      assert(ib[0] == 3);112      assert(ib[1] == 0);113      assert(ib[2] == 1);114      assert(ib[3] == 2);115 116      r = std::rotate_copy(InIter(ia), InIter(ia + 4), InIter(ia + 4), OutIter(ib));117      assert(base(r) == ib + 4);118      assert(ib[0] == 0);119      assert(ib[1] == 1);120      assert(ib[2] == 2);121      assert(ib[3] == 3);122 123      {124        int ints[]        = {1, 3, 5, 2, 5, 6};125        int const n_ints  = sizeof(ints) / sizeof(int);126        int zeros[n_ints] = {0};127 128        const std::size_t N = 2;129        const auto middle   = std::begin(ints) + N;130        auto it             = std::rotate_copy(std::begin(ints), middle, std::end(ints), std::begin(zeros));131        assert(std::distance(std::begin(zeros), it) == n_ints);132        assert(std::equal(std::begin(ints), middle, std::begin(zeros) + n_ints - N));133        assert(std::equal(middle, std::end(ints), std::begin(zeros)));134      }135    }136  };137};138 139TEST_CONSTEXPR_CXX20 bool test() {140  types::for_each(types::bidirectional_iterator_list<const int*>(), TestIter());141  return true;142}143 144int main(int, char**) {145  test();146 147#if TEST_STD_VER >= 20148  static_assert(test());149#endif150  return 0;151}152