97 lines
2.1 KiB
Plaintext
97 lines
2.1 KiB
Plaintext
|
|
#pragma once
|
|
|
|
#if !defined(BAD_APPLE_OS_ALGORITHM_INCLUDED)
|
|
#define BAD_APPLE_OS_ALGORITHM_INCLUDED
|
|
|
|
#include <cstddef>
|
|
#include <iterator>
|
|
#include <utility>
|
|
|
|
namespace std
|
|
{
|
|
template<typename T>
|
|
constexpr const T& min(const T& left, const T& right)
|
|
{
|
|
return right < left ? right : left;
|
|
}
|
|
|
|
template<typename T>
|
|
constexpr const T& max(const T& left, const T& right)
|
|
{
|
|
return right > left ? right : left;
|
|
}
|
|
|
|
template<typename RandomIt, class Compare>
|
|
constexpr void sort(RandomIt first, RandomIt last, Compare comp)
|
|
{
|
|
// TODO: be smarter
|
|
const size_t size = last - first;
|
|
size_t sorted = 1;
|
|
while (sorted < size)
|
|
{
|
|
// find insertion pos
|
|
size_t pos = 0;
|
|
while (pos < sorted)
|
|
{
|
|
if (comp(*(first + sorted), *(first + pos)))
|
|
{
|
|
break;
|
|
}
|
|
++pos;
|
|
}
|
|
// bail if already sorted
|
|
if (pos == sorted)
|
|
{
|
|
++sorted;
|
|
continue;
|
|
}
|
|
// insert at pos
|
|
for (size_t idx = pos; idx < sorted; ++idx)
|
|
{
|
|
swap(*(first + idx), *(first + sorted));
|
|
}
|
|
++sorted;
|
|
}
|
|
}
|
|
|
|
template<typename RandomIt>
|
|
constexpr void sort(RandomIt first, RandomIt last)
|
|
{
|
|
sort(first, last, [](auto left, auto right) { return left < right; });
|
|
}
|
|
|
|
template<typename ForwardIt, typename UnaryPredicate>
|
|
constexpr ForwardIt find_if(ForwardIt first, ForwardIt last, UnaryPredicate pred)
|
|
{
|
|
for (auto it = first; it != last; ++it)
|
|
{
|
|
if (pred(*it))
|
|
{
|
|
return it;
|
|
}
|
|
}
|
|
return last;
|
|
}
|
|
|
|
template<typename ForwardIt, typename UnaryPredicate>
|
|
constexpr ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate pred)
|
|
{
|
|
auto found = find_if(first, last, pred);
|
|
if (found != last)
|
|
{
|
|
for (auto tomove = next(found); tomove != last; ++tomove)
|
|
{
|
|
if (!pred(*tomove))
|
|
{
|
|
*found = move(*tomove);
|
|
++found;
|
|
}
|
|
}
|
|
}
|
|
return found;
|
|
}
|
|
}
|
|
|
|
#endif // !defined(BAD_APPLE_OS_ALGORITHM_INCLUDED)
|