brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · e2f4daf Raw
155 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++1410 11// UNSUPPORTED: libcpp-has-no-incomplete-pstl12 13// <algorithm>14 15// template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>16//   bool equal(ExecutionPolicy&& exec,17//              ForwardIterator1 first1, ForwardIterator1 last1,18//              ForwardIterator2 first2);19//20// template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,21//          class BinaryPredicate>22//   bool equal(ExecutionPolicy&& exec,23//              ForwardIterator1 first1, ForwardIterator1 last1,24//              ForwardIterator2 first2, BinaryPredicate pred);25//26// template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>27//   bool equal(ExecutionPolicy&& exec,28//              ForwardIterator1 first1, ForwardIterator1 last1,29//              ForwardIterator2 first2, ForwardIterator2 last2);30//31// template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,32//          class BinaryPredicate>33//   bool equal(ExecutionPolicy&& exec,34//              ForwardIterator1 first1, ForwardIterator1 last1,35//              ForwardIterator2 first2, ForwardIterator2 last2,36//              BinaryPredicate pred);37 38#include <algorithm>39#include <cassert>40#include <iterator>41 42#include "test_execution_policies.h"43#include "test_iterators.h"44#include "test_macros.h"45 46template <class It1, class It2>47struct Test {48  template <class Policy>49  void operator()(Policy&& policy) {50    { // 3 iter overloads51      // check with equal ranges52      {53        int a[] = {1, 2, 3, 4};54        int b[] = {1, 2, 3, 4};55        assert(std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b))));56      }57 58      // check with an empty range59      {60        int a[] = {999};61        int b[] = {1, 2, 3};62        assert(std::equal(policy, It1(std::begin(a)), It1(std::begin(a)), It2(std::begin(b))));63      }64 65      // check with different ranges66      {67        int a[] = {1, 2, 3};68        int b[] = {3, 2, 1};69        assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b))));70      }71 72      // check that the predicate is used73      {74        int a[] = {2, 4, 6, 8, 10};75        int b[] = {12, 14, 16, 18, 20};76        assert(std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), [](int lhs, int rhs) {77          return lhs % 2 == rhs % 2;78        }));79      }80    }81 82    { // 4 iter overloads83      // check with equal ranges of equal size84      {85        int a[] = {1, 2, 3, 4};86        int b[] = {1, 2, 3, 4};87        assert(std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b))));88      }89 90      // check with unequal ranges of equal size91      {92        int a[] = {1, 2, 3, 4};93        int b[] = {4, 3, 2, 1};94        assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b))));95      }96 97      // check with equal ranges of unequal size98      {99        {100          int a[] = {1, 2, 3, 4};101          int b[] = {1, 2, 3, 4, 5};102          assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b))));103        }104        {105          int a[] = {1, 2, 3, 4, 5};106          int b[] = {1, 2, 3, 4};107          assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b))));108        }109      }110 111      // check empty ranges112      {113        // empty/empty114        {115          int a[] = {888};116          int b[] = {999};117          assert(std::equal(policy, It1(std::begin(a)), It1(std::begin(a)), It2(std::begin(b)), It2(std::begin(b))));118        }119        // empty/non-empty120        {121          int a[] = {999};122          int b[] = {999};123          assert(!std::equal(policy, It1(std::begin(a)), It1(std::begin(a)), It2(std::begin(b)), It2(std::end(b))));124        }125        // non-empty/empty126        {127          int a[] = {999};128          int b[] = {999};129          assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::begin(b))));130        }131      }132 133      // check that the predicate is used134      {135        int a[] = {2, 4, 6, 8, 10};136        int b[] = {12, 14, 16, 18, 20};137        assert(std::equal(138            policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b)), [](int lhs, int rhs) {139              return lhs % 2 == rhs % 2;140            }));141      }142    }143  }144};145 146int main(int, char**) {147  types::for_each(types::forward_iterator_list<int*>{}, types::apply_type_identity{[](auto v) {148                    using It1 = typename decltype(v)::type;149                    types::for_each(150                        types::forward_iterator_list<int*>{},151                        TestIteratorWithPolicies<types::partial_instantiation<Test, It1>::template apply>{});152                  }});153  return 0;154}155