// TEST_CONSTEXPR bool test_constexpr() {
// int ia[] = {1, 2, 3, 4, 5};
// int ic[] = {6, 6, 6, 6, 6, 6, 6};
-//
+//
// auto p = std::copy(std::begin(ia), std::end(ia), std::begin(ic));
// return std::equal(std::begin(ia), std::end(ia), std::begin(ic), p)
// && std::all_of(p, std::end(ic), [](int a){return a == 6;})
-// ;
+// ;
// }
// #endif
// TEST_CONSTEXPR bool test_constexpr() {
// int ia[] = {1, 2, 3, 4, 5};
// int ic[] = {6, 6, 6, 6, 6, 6, 6};
-//
+//
// size_t N = std::size(ia);
// auto p = std::copy_backward(std::begin(ia), std::end(ia), std::begin(ic) + N);
// return std::equal(std::begin(ic), p, std::begin(ia))
// && std::all_of(p, std::end(ic), [](int a){return a == 6;})
-// ;
+// ;
// }
// #endif
// TEST_CONSTEXPR bool test_constexpr() {
// int ia[] = {2, 4, 6, 8, 6};
// int ic[] = {0, 0, 0, 0, 0, 0};
-//
+//
// auto p = std::copy_if(std::begin(ia), std::end(ia), std::begin(ic), is6);
// return std::all_of(std::begin(ic), p, [](int a){return a == 6;})
// && std::all_of(p, std::end(ic), [](int a){return a == 0;})
-// ;
+// ;
// }
// #endif
// TEST_CONSTEXPR bool test_constexpr() {
// int ia[] = {1, 2, 3, 4, 5};
// int ic[] = {6, 6, 6, 6, 6, 6, 6};
-//
+//
// auto p = std::copy_n(std::begin(ia), 4, std::begin(ic));
// return std::equal(std::begin(ic), p, std::begin(ia))
// && std::all_of(p, std::end(ic), [](int a){return a == 6;})
-// ;
+// ;
// }
// #endif
int ia[] = {0, 1, 2, 3, 4};
std::fill(std::begin(ia), std::end(ia), 5);
-
+
return std::all_of(std::begin(ia), std::end(ia), [](int a) {return a == 5; })
;
}
const size_t N = 5;
int ib[] = {0, 0, 0, 0, 0, 0}; // one bigger than N
- auto it = std::fill_n(std::begin(ib), N, 5);
+ auto it = std::fill_n(std::begin(ib), N, 5);
return it == (std::begin(ib) + N)
&& std::all_of(std::begin(ib), it, [](int a) {return a == 5; })
&& *it == 0 // don't overwrite the last value in the output array
int ia[] = {0, 1, 2, 3, 4};
std::generate(std::begin(ia), std::end(ia), gen_test());
-
+
return std::all_of(std::begin(ia), std::end(ia), [](int x) { return x == 1; })
;
}
int ib[] = {0, 0, 0, 0, 0, 0}; // one bigger than N
auto it = std::generate_n(std::begin(ib), N, gen_test());
-
+
return it == (std::begin(ib) + N)
&& std::all_of(std::begin(ib), it, [](int x) { return x == 2; })
&& *it == 0 // don't overwrite the last value in the output array
int ia[] = {1, 3, 5, 2, 4, 6};
int r1[10] = {0};
int r2[10] = {0};
-
- auto p = std::partition_copy(std::begin(ia), std::end(ia),
+
+ auto p = std::partition_copy(std::begin(ia), std::end(ia),
std::begin(r1), std::begin(r2), is_odd());
return std::all_of(std::begin(r1), p.first, is_odd())
#if TEST_STD_VER > 17
TEST_CONSTEXPR bool test_constexpr() {
int ia[] = {1, 3, 5, 2, 5, 6};
-
+
auto it = std::remove(std::begin(ia), std::end(ia), 5);
return (std::begin(ia) + std::size(ia) - 2) == it // we removed two elements
TEST_CONSTEXPR bool test_constexpr() {
int ia[] = {1, 3, 5, 2, 5, 6};
int ib[std::size(ia)] = {0};
-
+
auto it = std::remove_copy(std::begin(ia), std::end(ia), std::begin(ib), 5);
return std::distance(std::begin(ib), it) == (std::size(ia) - 2) // we removed two elements
TEST_CONSTEXPR bool test_constexpr() {
int ia[] = {1, 3, 5, 2, 5, 6};
int ib[std::size(ia)] = {0};
-
+
auto it = std::remove_copy_if(std::begin(ia), std::end(ia), std::begin(ib), equalToTwo);
return std::distance(std::begin(ib), it) == (std::size(ia) - 1) // we removed one element
#if TEST_STD_VER > 17
TEST_CONSTEXPR bool test_constexpr() {
int ia[] = {1, 3, 5, 2, 5, 6};
-
+
auto it = std::remove_if(std::begin(ia), std::end(ia), equal2);
return (std::begin(ia) + std::size(ia) - 1) == it // we removed one element
const int expected[] = {0, 1, 5, 3, 4};
auto it = std::replace_copy(std::begin(ia), std::end(ia), std::begin(ib), 2, 5);
-
+
return it == (std::begin(ib) + std::size(ia))
&& *it == 0 // don't overwrite the last value in the output array
&& std::equal(std::begin(ib), it, std::begin(expected), std::end(expected))
const int expected[] = {0, 1, 5, 3, 4};
auto it = std::replace_copy_if(std::begin(ia), std::end(ia), std::begin(ib), equalToTwo, 5);
-
+
return it == (std::begin(ib) + std::size(ia))
&& *it == 0 // don't overwrite the last value in the output array
&& std::equal(std::begin(ib), it, std::begin(expected), std::end(expected))
TEST_CONSTEXPR bool test_constexpr() {
int ia[] = {1, 3, 5, 2, 5, 6};
int ib[std::size(ia)] = {0};
-
+
auto it = std::reverse_copy(std::begin(ia), std::end(ia), std::begin(ib));
return std::distance(std::begin(ib), it) == std::size(ia)
// TEST_CONSTEXPR bool test_constexpr() {
// int ia[] = {1, 3, 5, 2, 5, 6};
// int ib[std::size(ia)] = {0};
-//
+//
// const size_t N = 2;
// const auto middle = std::begin(ia) + N;
// auto it = std::rotate_copy(std::begin(ia), middle, std::end(ia), std::begin(ib));
-//
+//
// return std::distance(std::begin(ib), it) == std::size(ia)
// && std::equal (std::begin(ia), middle, std::begin(ib) + std::size(ia) - N)
// && std::equal (middle, std::end(ia), std::begin(ib))
const int ib[] = {2, 4, 7, 8};
int ic[] = {0, 0, 0, 0, 0}; // one bigger
const int expected[] = {3, 7, 13, 15};
-
- auto it = std::transform(std::begin(ia), std::end(ia),
+
+ auto it = std::transform(std::begin(ia), std::end(ia),
std::begin(ib), std::begin(ic), std::plus<int>());
-
+
return it == (std::begin(ic) + std::size(ia))
&& *it == 0 // don't overwrite the last value in the output array
&& std::equal(std::begin(expected), std::end(expected), std::begin(ic), it)
const int expected[] = {2, 4, 7, 8};
auto it = std::transform(std::begin(ia), std::end(ia), std::begin(ib), plusOne);
-
+
return it == (std::begin(ib) + std::size(ia))
&& *it == 0 // don't overwrite the last value in the output array
&& std::equal(std::begin(ib), it, std::begin(expected), std::end(expected))
int ia[] = {0, 1, 1, 3, 4};
const int expected[] = {0, 1, 3, 4};
const size_t N = 4;
-
+
auto it = std::unique(std::begin(ia), std::end(ia));
return it == (std::begin(ia) + N)
&& std::equal(std::begin(ia), it, std::begin(expected), std::end(expected))
typedef forward_iterator<int*> FI;
typedef bidirectional_iterator<int*> BI;
typedef random_access_iterator<int*> RI;
-
+
return (std::find_end(FI(std::begin(ic)), FI(std::end(ic)), FI(std::begin(ia)), FI(std::end(ia))) == FI(ic+15))
&& (std::find_end(FI(std::begin(ic)), FI(std::end(ic)), FI(std::begin(ib)), FI(std::end(ib))) == FI(std::end(ic)))
&& (std::find_end(BI(std::begin(ic)), BI(std::end(ic)), BI(std::begin(ia)), BI(std::end(ia))) == BI(ic+15))
typedef forward_iterator<int*> FI;
typedef bidirectional_iterator<int*> BI;
typedef random_access_iterator<int*> RI;
-
+
return (std::find_first_of(FI(std::begin(ic)), FI(std::end(ic)), FI(std::begin(ia)), FI(std::end(ia))) == FI(ic+1))
&& (std::find_first_of(FI(std::begin(ic)), FI(std::end(ic)), FI(std::begin(ib)), FI(std::end(ib))) == FI(std::end(ic)))
&& (std::find_first_of(BI(std::begin(ic)), BI(std::end(ic)), BI(std::begin(ia)), BI(std::end(ia))) == BI(ic+1))
int ia[] = {1, 3, 6, 7};
int expected[] = {3, 5, 8, 9};
const size_t N = 4;
-
+
auto it = std::for_each_n(std::begin(ia), N, [](int &a) { a += 2; });
return it == (std::begin(ia) + N)
&& std::equal(std::begin(ia), std::end(ia), std::begin(expected))
auto p1 = std::mismatch(std::begin(ia), std::end(ia), std::begin(ic));
if (p1.first != ia+2 || p1.second != ic+2)
return false;
-
+
auto p2 = std::mismatch(std::begin(ia), std::end(ia), std::begin(ic), std::end(ic));
if (p2.first != ia+2 || p2.second != ic+2)
return false;
-
+
auto p3 = std::mismatch(std::begin(ib), std::end(ib), std::begin(ic));
if (p3.first != ib+2 || p3.second != ic+2)
return false;
if (p6.first != BI(ib+2) || p6.second != BI(ic+2))
return false;
- return true;
+ return true;
}
#endif
auto p1 = std::mismatch(std::begin(ia), std::end(ia), std::begin(ic), eq);
if (p1.first != ia+2 || p1.second != ic+2)
return false;
-
+
auto p2 = std::mismatch(std::begin(ia), std::end(ia), std::begin(ic), std::end(ic), eq);
if (p2.first != ia+2 || p2.second != ic+2)
return false;
-
+
auto p3 = std::mismatch(std::begin(ib), std::end(ib), std::begin(ic), eq);
if (p3.first != ib+2 || p3.second != ic+2)
return false;
if (p6.first != BI(ib+2) || p6.second != BI(ic+2))
return false;
- return true;
+ return true;
}
#endif
// 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
// 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),
+//
+// 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))
int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
int ib[] = {2, 4};
int ic[] = {3, 3, 3, 3};
-
+
return std::includes(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib))
&& !std::includes(std::begin(ia), std::end(ia), std::begin(ic), std::end(ic))
;
int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
int ib[] = {2, 4};
int ic[] = {3, 3, 3, 3};
-
+
auto comp = [](int a, int b) {return a < b; };
return std::includes(std::begin(ia), std::end(ia), std::begin(ib), std::end(ib), comp)
&& !std::includes(std::begin(ia), std::end(ia), std::begin(ic), std::end(ic), comp)
const int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
const int ib[] = {2, 4, 4, 6};
int results[std::size(ia)] = {0};
-
+
auto it = std::set_intersection(std::begin(ia), std::end(ia),
std::begin(ib), std::end(ib), std::begin(results));
const int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
const int ib[] = {2, 4, 4, 6};
int results[std::size(ia)] = {0};
-
+
auto comp = [](int a, int b) {return a < b; };
auto it = std::set_intersection(std::begin(ia), std::end(ia),
std::begin(ib), std::end(ib), std::begin(results), comp);
typedef typename Queue::container_type Container;
typedef typename Container::value_type value_type;
typedef decltype(std::declval<Queue>().emplace(std::declval<value_type &>())) queue_return_type;
-
+
#if TEST_STD_VER > 14
typedef decltype(std::declval<Container>().emplace_back(std::declval<value_type>())) container_return_type;
static_assert(std::is_same<queue_return_type, container_return_type>::value, "");
{
test_return_type<std::queue<int> > ();
test_return_type<std::queue<int, std::list<int> > > ();
-
+
typedef Emplaceable T;
std::queue<Emplaceable> q;
#if TEST_STD_VER > 14
typedef typename Stack::container_type Container;
typedef typename Container::value_type value_type;
typedef decltype(std::declval<Stack>().emplace(std::declval<value_type &>())) stack_return_type;
-
+
#if TEST_STD_VER > 14
typedef decltype(std::declval<Container>().emplace_back(std::declval<value_type>())) container_return_type;
static_assert(std::is_same<stack_return_type, container_return_type>::value, "");
test_return_type<std::stack<int, std::vector<int> > > ();
typedef Emplaceable T;
- std::stack<Emplaceable> q;
+ std::stack<Emplaceable> q;
#if TEST_STD_VER > 14
T& r1 = q.emplace(1, 2.5);
assert(&r1 == &q.top());
struct throwingLess {
throwingLess() : num_(1) {}
throwingLess(int num) : num_(num) {}
-
+
bool operator() (const T& lhs, const T& rhs) const
{
if ( --num_ == 0) throw 1;
return lhs < rhs;
}
-
+
mutable int num_;
};
#endif
-
-
+
+
int main()
{
{
// using size_type = size_t;
// using difference_type = ptrdiff_t;
// static constexpr size_type npos = size_type(-1);
-//
+//
// };
#include <string_view>
static_assert( std::endian::little != std::endian::big );
// Technically not required, but true on all existing machines
- static_assert( std::endian::native == std::endian::little ||
+ static_assert( std::endian::native == std::endian::little ||
std::endian::native == std::endian::big );
-
+
// Try to check at runtime
{
uint32_t i = 0x01020304;
#if TEST_STD_VER > 17
TEST_CONSTEXPR bool test_constexpr() {
int v = 12;
-
+
if (12 != std::exchange(v,23) || v != 23)
return false;
if (23 != std::exchange(v,static_cast<short>(67)) || v != 67)
return false;
-
+
if (67 != std::exchange<int, short>(v, {}) || v != 0)
return false;
return true;