brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · d92387c Raw
128 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// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// <algorithm>12 13// template<class ForwardIterator>14// constexpr ForwardIterator15//   shift_right(ForwardIterator first, ForwardIterator last,16//               typename iterator_traits<ForwardIterator>::difference_type n);17 18#include <algorithm>19#include <cassert>20 21#include "test_macros.h"22#include "test_iterators.h"23#include "MoveOnly.h"24 25template<class T, class Iter>26constexpr bool test()27{28    int orig[] = {3,1,4,1,5, 9,2,6,5,3, 5,8,9,7,9};29    T work[] = {3,1,4,1,5, 9,2,6,5,3, 5,8,9,7,9};30 31    for (int n = 0; n <= 15; ++n) {32        for (int k = 0; k <= n+2; ++k) {33            std::copy(orig, orig+n, work);34            Iter it = std::shift_right(Iter(work), Iter(work+n), k);35            if (k < n) {36                assert(it == Iter(work+k));37                assert(std::equal(orig, orig+n-k, work+k, work+n));38            } else {39                assert(it == Iter(work+n));40                assert(std::equal(orig, orig+n, work, work+n));41            }42        }43    }44 45    // n == 046    {47        T input[]          = { 0, 1, 2 };48        const T expected[] = { 0, 1, 2 };49        Iter b = Iter(std::begin(input));50        Iter e = Iter(std::end(input));51        Iter it = std::shift_right(b, e, 0);52        assert(std::equal(std::begin(expected), std::end(expected), it, e));53    }54 55    // n > 0 && n < len56    {57        T input[]          = { 0, 1, 2 };58        const T expected[] = { 0, 1 };59        Iter b = Iter(std::begin(input));60        Iter e = Iter(std::end(input));61        Iter it = std::shift_right(b, e, 1);62        assert(std::equal(std::begin(expected), std::end(expected), it, e));63    }64    {65        T input[]          = { 1, 2, 3, 4, 5, 6, 7, 8 };66        const T expected[] = { 1, 2, 3, 4, 5, 6 };67        Iter b = Iter(std::begin(input));68        Iter e = Iter(std::end(input));69        Iter it = std::shift_right(b, e, 2);70        assert(std::equal(std::begin(expected), std::end(expected), it, e));71    }72    {73        T input[]          = { 1, 2, 3, 4, 5, 6, 7, 8 };74        const T expected[] = { 1, 2 };75        Iter b = Iter(std::begin(input));76        Iter e = Iter(std::end(input));77        Iter it = std::shift_right(b, e, 6);78        assert(std::equal(std::begin(expected), std::end(expected), it, e));79    }80 81    // n == len82    {83        T input[]          = { 0, 1, 2 };84        const T expected[] = { 0, 1, 2 };85        Iter b = Iter(std::begin(input));86        Iter e = Iter(std::end(input));87        Iter it = std::shift_right(b, e, std::size(input));88        assert(std::equal(std::begin(expected), std::end(expected), b, e));89        assert(it == e);90    }91 92    // n > len93    {94        T input[]          = { 0, 1, 2 };95        const T expected[] = { 0, 1, 2 };96        Iter b = Iter(std::begin(input));97        Iter e = Iter(std::end(input));98        Iter it = std::shift_right(b, e, std::size(input) + 1);99        assert(std::equal(std::begin(expected), std::end(expected), b, e));100        assert(it == e);101    }102 103    return true;104}105 106int main(int, char**)107{108    test<int, forward_iterator<int*>>();109    test<int, bidirectional_iterator<int*>>();110    test<int, random_access_iterator<int*>>();111    test<int, int*>();112    test<MoveOnly, forward_iterator<MoveOnly*>>();113    test<MoveOnly, bidirectional_iterator<MoveOnly*>>();114    test<MoveOnly, random_access_iterator<MoveOnly*>>();115    test<MoveOnly, MoveOnly*>();116 117    static_assert(test<int, forward_iterator<int*>>());118    static_assert(test<int, bidirectional_iterator<int*>>());119    static_assert(test<int, random_access_iterator<int*>>());120    static_assert(test<int, int*>());121    static_assert(test<MoveOnly, forward_iterator<MoveOnly*>>());122    static_assert(test<MoveOnly, bidirectional_iterator<MoveOnly*>>());123    static_assert(test<MoveOnly, random_access_iterator<MoveOnly*>>());124    static_assert(test<MoveOnly, MoveOnly*>());125 126    return 0;127}128