111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <algorithm>
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template<InputIterator Iter1, InputIterator Iter2,
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//          Predicate<auto, Iter1::value_type, Iter2::value_type> Pred>
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   requires CopyConstructible<Pred>
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   pair<Iter1, Iter2>
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   mismatch(Iter1 first1, Iter1 last1, Iter2 first2, Pred pred);
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <algorithm>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <functional>
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_iterators.h"
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if _LIBCPP_STD_VER > 11
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define HAS_FOUR_ITERATOR_VERSION
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    int ia[] = {0, 1, 2, 2, 0, 1, 2, 3};
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    int ib[] = {0, 1, 2, 3, 0, 1, 2, 3};
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(std::mismatch(input_iterator<const int*>(ia),
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         input_iterator<const int*>(ia + sa),
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         input_iterator<const int*>(ib),
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         std::equal_to<int>()) ==
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         (std::pair<input_iterator<const int*>,
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                    input_iterator<const int*> >(
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            input_iterator<const int*>(ia+3),
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            input_iterator<const int*>(ib+3))));
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef HAS_FOUR_ITERATOR_VERSION
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(std::mismatch(input_iterator<const int*>(ia),
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         input_iterator<const int*>(ia + sa),
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         input_iterator<const int*>(ib),
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         input_iterator<const int*>(ib + sa),
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         std::equal_to<int>()) ==
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         (std::pair<input_iterator<const int*>,
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                    input_iterator<const int*> >(
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            input_iterator<const int*>(ia+3),
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                            input_iterator<const int*>(ib+3))));
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(std::mismatch(ia, ia + sa, ib, std::equal_to<int>()) ==
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           (std::pair<int*,int*>(ia+3,ib+3)));
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef HAS_FOUR_ITERATOR_VERSION
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(std::mismatch(ia, ia + sa, ib, ib + sa, std::equal_to<int>()) ==
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           (std::pair<int*,int*>(ia+3,ib+3)));
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(std::mismatch(ia, ia + sa, ib, ib + 2, std::equal_to<int>()) ==
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           (std::pair<int*,int*>(ia+2,ib+2)));
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
63