Skip to content

Commit

Permalink
Optimise upperBound function acting on values.
Browse files Browse the repository at this point in the history
  • Loading branch information
HaxyM committed Aug 28, 2024
1 parent 4a2f19d commit dc54223
Showing 1 changed file with 25 additions and 7 deletions.
32 changes: 25 additions & 7 deletions include/crap/algorithm.d/upperboundvalue.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef CRAP_ALGORITHM_UPPERBOUNDVALUE
#define CRAP_ALGORITHM_UPPERBOUNDVALUE

#include "../utility.d/valuelist.h"
#include "../utility.d/bisectvalue.h"
#include "../version.d/libintegralconstantcallable.h"

namespace crap
Expand Down Expand Up @@ -33,20 +33,38 @@ namespace crap
template <class Type, Type Value, template <Type, Type> class Operator, Type ... Values> struct upperBoundValue
{
private:
using values = valueList<Type, Values...>;
constexpr const static std :: size_t half = (values :: size) / 2u;
using values = bisectValue<Type, Values...>;
template <Type ... SubValues> using This = upperBoundValue<Type, Value, Operator, SubValues...>;
using lower = typename values :: template till<half, This>;
using upper = typename values :: template since<half, This>;
using lower = typename values :: template lower<This>;
template <std :: size_t LowerValue, std :: size_t LowerNpos> struct upper;
template <std :: size_t LowerNpos> struct upper<LowerNpos, LowerNpos>;
public:
constexpr const static std :: size_t value = (((lower :: value) != (lower :: npos)) ? (lower :: value) : ((lower :: npos) + (upper :: value)));
constexpr const static std :: size_t npos = (lower :: npos) + (upper :: npos);
constexpr const static std :: size_t value = upper <lower :: value, lower :: npos> :: value;
constexpr const static std :: size_t npos = sizeof...(Values);
using value_type = decltype(value);
constexpr operator value_type () const noexcept;
#if (crap_lib_integral_constant_callable >= 201304L)
constexpr value_type operator () () const noexcept;
#endif
};

template <class Type, Type Value, template <Type, Type> class Operator, Type ... Values>
template <std :: size_t LowerValue, std :: size_t>
struct upperBoundValue <Type, Value, Operator, Values...> :: upper
{
constexpr const static std :: size_t value = LowerValue;
};

template <class Type, Type Value, template <Type, Type> class Operator, Type ... Values>
template <std :: size_t LowerNpos>
struct upperBoundValue <Type, Value, Operator, Values...> :: upper<LowerNpos, LowerNpos>
{
private:
using values = bisectValue<Type, Values...>;
template <Type ... SubValues> using This = upperBoundValue<Type, Value, Operator, SubValues...>;
public:
constexpr const static std :: size_t value = LowerNpos + values :: template upper <This> :: value;
};
}

template <class Type, Type Value, template <Type, Type> class Operator>
Expand Down

0 comments on commit dc54223

Please sign in to comment.