38template <
typename ValueType>
53 ValueType intervalValue,
55 bool useSymmetricSkew =
false) noexcept
64 ValueType rangeEnd) noexcept
73 ValueType intervalValue) noexcept
94 ValueType valueToRemap)>;
112 :
start (rangeStart),
114 convertFrom0To1Function (std::move (convertFrom0To1Func)),
115 convertTo0To1Function (std::move (convertTo0To1Func)),
116 snapToLegalValueFunction (std::move (snapToLegalValueFunc))
126 if (convertTo0To1Function !=
nullptr)
127 return clampTo0To1 (convertTo0To1Function (
start,
end, v));
131 if (exactlyEqual (
skew,
static_cast<ValueType
> (1)))
135 return std::pow (proportion,
skew);
137 auto distanceFromMiddle =
static_cast<ValueType
> (2) * proportion -
static_cast<ValueType
> (1);
139 return (
static_cast<ValueType
> (1) + std::pow (std::abs (distanceFromMiddle),
skew)
140 * (distanceFromMiddle < ValueType() ?
static_cast<ValueType
> (-1)
141 :
static_cast<ValueType
> (1)))
142 /
static_cast<ValueType
> (2);
150 proportion = clampTo0To1 (proportion);
152 if (convertFrom0To1Function !=
nullptr)
153 return convertFrom0To1Function (
start,
end, proportion);
157 if (! exactlyEqual (
skew,
static_cast<ValueType
> (1)) && proportion > ValueType())
158 proportion = std::exp (std::log (proportion) /
skew);
163 auto distanceFromMiddle =
static_cast<ValueType
> (2) * proportion -
static_cast<ValueType
> (1);
165 if (! exactlyEqual (
skew,
static_cast<ValueType
> (1)) && ! exactlyEqual (distanceFromMiddle,
static_cast<ValueType
> (0)))
166 distanceFromMiddle = std::exp (std::log (std::abs (distanceFromMiddle)) /
skew)
167 * (distanceFromMiddle < ValueType() ? static_cast<ValueType> (-1)
168 :
static_cast<ValueType
> (1));
170 return start + (
end -
start) /
static_cast<ValueType
> (2) * (
static_cast<ValueType
> (1) + distanceFromMiddle);
178 if (snapToLegalValueFunction !=
nullptr)
179 return snapToLegalValueFunction (
start,
end, v);
200 jassert (centrePointValue >
start);
201 jassert (centrePointValue <
end);
204 skew = std::log (
static_cast<ValueType
> (0.5)) / std::log ((centrePointValue -
start) / (
end -
start));
240 void checkInvariants()
const
244 jassert (
skew > ValueType());
247 static ValueType clampTo0To1 (ValueType value)
249 auto clampedValue = jlimit (
static_cast<ValueType
> (0),
static_cast<ValueType
> (1), value);
253 jassert (exactlyEqual (clampedValue, value));
258 ValueRemapFunction convertFrom0To1Function, convertTo0To1Function, snapToLegalValueFunction;
ValueType snapToLegalValue(ValueType v) const noexcept
std::function< ValueType(ValueType rangeStart, ValueType rangeEnd, ValueType valueToRemap)> ValueRemapFunction
NormalisableRange()=default
ValueType convertFrom0to1(ValueType proportion) const noexcept
NormalisableRange(ValueType rangeStart, ValueType rangeEnd) noexcept
void setSkewForCentre(ValueType centrePointValue) noexcept
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueRemapFunction convertFrom0To1Func, ValueRemapFunction convertTo0To1Func, ValueRemapFunction snapToLegalValueFunc={}) noexcept
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueType intervalValue) noexcept
Range< ValueType > getRange() const noexcept
NormalisableRange(Range< ValueType > range, ValueType intervalValue) noexcept
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueType intervalValue, ValueType skewFactor, bool useSymmetricSkew=false) noexcept
ValueType convertTo0to1(ValueType v) const noexcept
NormalisableRange(Range< ValueType > range) noexcept