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