update headers to Filament v1.25.0
This commit is contained in:
@@ -19,7 +19,6 @@
|
||||
|
||||
#include <utils/compiler.h>
|
||||
|
||||
#include <functional> // for std::less
|
||||
#include <type_traits> // for std::enable_if
|
||||
|
||||
#include <limits.h>
|
||||
@@ -168,74 +167,6 @@ T log2i(T x) noexcept {
|
||||
return (sizeof(x) * 8 - 1u) - clz(x);
|
||||
}
|
||||
|
||||
/*
|
||||
* branch-less version of std::lower_bound and std::upper_bound.
|
||||
* These versions are intended to be fully inlined, which only happens when the size
|
||||
* of the array is known at compile time. This code also performs better if the
|
||||
* array is a power-of-two in size.
|
||||
*
|
||||
* These code works even if the conditions above are not met, and becomes a less-branches
|
||||
* algorithm instead of a branch-less one!
|
||||
*/
|
||||
|
||||
template<typename RandomAccessIterator, typename T, typename COMPARE = typename std::less<T>>
|
||||
inline UTILS_PUBLIC
|
||||
RandomAccessIterator lower_bound(
|
||||
RandomAccessIterator first, RandomAccessIterator last, const T& value,
|
||||
COMPARE comp = std::less<T>(),
|
||||
bool assume_power_of_two = false) {
|
||||
size_t len = last - first;
|
||||
|
||||
if (!assume_power_of_two) {
|
||||
// handle non power-of-two sized arrays. If it's POT, the next line is a no-op
|
||||
// and gets optimized out if the size is known at compile time.
|
||||
len = 1u << (31 - clz(uint32_t(len))); // next power of two length / 2
|
||||
size_t difference = (last - first) - len;
|
||||
// If len was already a POT, then difference will be 0.
|
||||
// We need to explicitly check this case to avoid dereferencing past the end of the array
|
||||
first += !difference || comp(first[len], value) ? difference : 0;
|
||||
}
|
||||
|
||||
while (len) {
|
||||
// The number of repetitions here doesn't affect the result. We manually unroll the loop
|
||||
// twice, to guarantee we have at least two iterations without branches (for the case
|
||||
// where the size is not known at compile time
|
||||
first += comp(first[len >>= 1u], value) ? len : 0;
|
||||
first += comp(first[len >>= 1u], value) ? len : 0;
|
||||
}
|
||||
first += comp(*first, value);
|
||||
return first;
|
||||
}
|
||||
|
||||
template<typename RandomAccessIterator, typename T, typename COMPARE = typename std::less<T>>
|
||||
inline UTILS_PUBLIC
|
||||
RandomAccessIterator upper_bound(
|
||||
RandomAccessIterator first, RandomAccessIterator last,
|
||||
const T& value, COMPARE comp = std::less<T>(),
|
||||
bool assume_power_of_two = false) {
|
||||
size_t len = last - first;
|
||||
|
||||
if (!assume_power_of_two) {
|
||||
// handle non power-of-two sized arrays. If it's POT, the next line is a no-op
|
||||
// and gets optimized out if the size is known at compile time.
|
||||
len = 1u << (31 - clz(uint32_t(len))); // next power of two length / 2
|
||||
size_t difference = (last - first) - len;
|
||||
// If len was already a POT, then difference will be 0.
|
||||
// We need to explicitly check this case to avoid dereferencing past the end of the array
|
||||
first += !difference || comp(value, first[len]) ? 0 : difference;
|
||||
}
|
||||
|
||||
while (len) {
|
||||
// The number of repetitions here doesn't affect the result. We manually unroll the loop
|
||||
// twice, to guarantee we have at least two iterations without branches (for the case
|
||||
// where the size is not known at compile time
|
||||
first += !comp(value, first[len >>= 1u]) ? len : 0;
|
||||
first += !comp(value, first[len >>= 1u]) ? len : 0;
|
||||
}
|
||||
first += !comp(value, *first);
|
||||
return first;
|
||||
}
|
||||
|
||||
template<typename RandomAccessIterator, typename COMPARE>
|
||||
inline UTILS_PUBLIC
|
||||
RandomAccessIterator partition_point(
|
||||
|
||||
Reference in New Issue
Block a user