forked from OSchip/llvm-project
implement (but leave commented out) the constexpr tests from P0202 for std::merge. merge requires std::copy, which isn't constexpr yet.
llvm-svn: 323070
This commit is contained in:
parent
79834a1fce
commit
85642c2bea
|
@ -15,15 +15,32 @@
|
||||||
// requires OutputIterator<OutIter, InIter1::reference>
|
// requires OutputIterator<OutIter, InIter1::reference>
|
||||||
// && OutputIterator<OutIter, InIter2::reference>
|
// && OutputIterator<OutIter, InIter2::reference>
|
||||||
// && HasLess<InIter2::value_type, InIter1::value_type>
|
// && HasLess<InIter2::value_type, InIter1::value_type>
|
||||||
// OutIter
|
// constexpr OutIter // constexpr after C++17
|
||||||
// merge(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, OutIter result);
|
// merge(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, OutIter result);
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "test_macros.h"
|
||||||
#include "test_iterators.h"
|
#include "test_iterators.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if TEST_STD_VER > 17
|
||||||
|
TEST_CONSTEXPR bool test_constexpr() {
|
||||||
|
int ia[] = {0, 1, 2, 3, 4};
|
||||||
|
int ib[] = {2, 4, 6, 8};
|
||||||
|
int ic[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
const int expected[] = {0, 1, 2, 2, 3, 4, 4, 6, 8};
|
||||||
|
|
||||||
|
auto it = std::merge(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib), std::begin(ic));
|
||||||
|
return std::distance(std::begin(ic), it) == (std::size(ia) + std::size(ib))
|
||||||
|
&& *it == 0
|
||||||
|
&& std::equal(std::begin(ic), it, std::begin(expected), std::end(expected))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
std::mt19937 randomness;
|
std::mt19937 randomness;
|
||||||
|
|
||||||
template <class InIter1, class InIter2, class OutIter>
|
template <class InIter1, class InIter2, class OutIter>
|
||||||
|
@ -224,4 +241,9 @@ int main()
|
||||||
test<const int*, const int*, bidirectional_iterator<int*> >();
|
test<const int*, const int*, bidirectional_iterator<int*> >();
|
||||||
test<const int*, const int*, random_access_iterator<int*> >();
|
test<const int*, const int*, random_access_iterator<int*> >();
|
||||||
test<const int*, const int*, int*>();
|
test<const int*, const int*, int*>();
|
||||||
|
|
||||||
|
#if TEST_STD_VER > 17
|
||||||
|
// Not yet - waiting on std::copy
|
||||||
|
// static_assert(test_constexpr());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
// requires OutputIterator<OutIter, InIter1::reference>
|
// requires OutputIterator<OutIter, InIter1::reference>
|
||||||
// && OutputIterator<OutIter, InIter2::reference>
|
// && OutputIterator<OutIter, InIter2::reference>
|
||||||
// && CopyConstructible<Compare>
|
// && CopyConstructible<Compare>
|
||||||
// OutIter
|
// constexpr OutIter // constexpr after C++17
|
||||||
// merge(InIter1 first1, InIter1 last1,
|
// merge(InIter1 first1, InIter1 last1,
|
||||||
// InIter2 first2, InIter2 last2, OutIter result, Compare comp);
|
// InIter2 first2, InIter2 last2, OutIter result, Compare comp);
|
||||||
|
|
||||||
|
@ -25,9 +25,27 @@
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "test_macros.h"
|
||||||
#include "test_iterators.h"
|
#include "test_iterators.h"
|
||||||
#include "counting_predicates.hpp"
|
#include "counting_predicates.hpp"
|
||||||
|
|
||||||
|
#if TEST_STD_VER > 17
|
||||||
|
TEST_CONSTEXPR bool test_constexpr() {
|
||||||
|
int ia[] = {0, 1, 2, 3, 4};
|
||||||
|
int ib[] = {2, 4, 6, 8};
|
||||||
|
int ic[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
const int expected[] = {0, 1, 2, 2, 3, 4, 4, 6, 8};
|
||||||
|
|
||||||
|
auto it = std::merge(std::begin(ia), std::end(ia),
|
||||||
|
std::begin(ib), std::end(ib),
|
||||||
|
std::begin(ic), [](int a, int b) {return a == b; });
|
||||||
|
return std::distance(std::begin(ic), it) == (std::size(ia) + std::size(ib))
|
||||||
|
&& *it == 0
|
||||||
|
&& std::equal(std::begin(ic), it, std::begin(expected), std::end(expected))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
std::mt19937 randomness;
|
std::mt19937 randomness;
|
||||||
|
|
||||||
template <class InIter1, class InIter2, class OutIter>
|
template <class InIter1, class InIter2, class OutIter>
|
||||||
|
@ -234,4 +252,9 @@ int main()
|
||||||
test<const int*, const int*, bidirectional_iterator<int*> >();
|
test<const int*, const int*, bidirectional_iterator<int*> >();
|
||||||
test<const int*, const int*, random_access_iterator<int*> >();
|
test<const int*, const int*, random_access_iterator<int*> >();
|
||||||
test<const int*, const int*, int*>();
|
test<const int*, const int*, int*>();
|
||||||
|
|
||||||
|
#if TEST_STD_VER > 17
|
||||||
|
// Not yet - waiting on std::copy
|
||||||
|
// static_assert(test_constexpr());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue