42 template <
typename ValueType>
57 ValueType intervalValue,
59 bool useSymmetricSkew =
false) noexcept
68 ValueType rangeEnd) noexcept
77 ValueType intervalValue) noexcept
98 ValueType valueToRemap)>;
116 :
start (rangeStart),
118 convertFrom0To1Function (std::move (convertFrom0To1Func)),
119 convertTo0To1Function (std::move (convertTo0To1Func)),
120 snapToLegalValueFunction (std::move (snapToLegalValueFunc))
130 if (convertTo0To1Function !=
nullptr)
131 return clampTo0To1 (convertTo0To1Function (
start,
end, v));
135 if (
skew ==
static_cast<ValueType
> (1))
139 return std::pow (proportion,
skew);
141 auto distanceFromMiddle =
static_cast<ValueType
> (2) * proportion -
static_cast<ValueType
> (1);
143 return (
static_cast<ValueType
> (1) + std::pow (std::abs (distanceFromMiddle),
skew)
144 * (distanceFromMiddle < ValueType() ? static_cast<ValueType> (-1)
145 :
static_cast<ValueType
> (1)))
146 /
static_cast<ValueType
> (2);
154 proportion = clampTo0To1 (proportion);
156 if (convertFrom0To1Function !=
nullptr)
157 return convertFrom0To1Function (
start,
end, proportion);
161 if (
skew !=
static_cast<ValueType
> (1) && proportion > ValueType())
162 proportion = std::exp (std::log (proportion) /
skew);
167 auto distanceFromMiddle =
static_cast<ValueType
> (2) * proportion -
static_cast<ValueType
> (1);
169 if (
skew !=
static_cast<ValueType
> (1) && distanceFromMiddle !=
static_cast<ValueType
> (0))
170 distanceFromMiddle = std::exp (std::log (std::abs (distanceFromMiddle)) /
skew)
171 * (distanceFromMiddle < ValueType() ? static_cast<ValueType> (-1)
172 :
static_cast<ValueType
> (1));
174 return start + (
end -
start) /
static_cast<ValueType
> (2) * (
static_cast<ValueType
> (1) + distanceFromMiddle);
182 if (snapToLegalValueFunction !=
nullptr)
183 return snapToLegalValueFunction (
start,
end, v);
204 jassert (centrePointValue >
start);
205 jassert (centrePointValue <
end);
208 skew = std::log (
static_cast<ValueType
> (0.5)) / std::log ((centrePointValue -
start) / (
end -
start));
244 void checkInvariants()
const
248 jassert (
skew > ValueType());
251 static ValueType clampTo0To1 (ValueType value)
253 auto clampedValue = jlimit (
static_cast<ValueType
> (0),
static_cast<ValueType
> (1), value);
257 jassert (clampedValue == value);
262 ValueRemapFunction convertFrom0To1Function, convertTo0To1Function, snapToLegalValueFunction;
Represents a mapping between an arbitrary range of values and a normalised 0->1 range.
ValueType skew
An optional skew factor that alters the way values are distribute across the range.
ValueType end
The maximum value of the non-normalised range.
bool symmetricSkew
If true, the skew factor applies from the middle of the slider to each of its ends.
ValueType snapToLegalValue(ValueType v) const noexcept
Takes a non-normalised value and snaps it based on either the interval property of this NormalisableR...
Range< ValueType > getRange() const noexcept
Returns the extent of the normalisable range.
std::function< ValueType(ValueType rangeStart, ValueType rangeEnd, ValueType valueToRemap)> ValueRemapFunction
A function object which can remap a value in some way based on the start and end of a range.
NormalisableRange()=default
Creates a continuous range that performs a dummy mapping.
ValueType start
The minimum value of the non-normalised range.
ValueType convertFrom0to1(ValueType proportion) const noexcept
Uses the properties of this mapping to convert a normalised 0->1 value to its full-range representati...
NormalisableRange(ValueType rangeStart, ValueType rangeEnd) noexcept
Creates a NormalisableRange with a given range, continuous interval, but a dummy skew-factor.
void setSkewForCentre(ValueType centrePointValue) noexcept
Given a value which is between the start and end points, this sets the skew such that convertFrom0to1...
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueRemapFunction convertFrom0To1Func, ValueRemapFunction convertTo0To1Func, ValueRemapFunction snapToLegalValueFunc={}) noexcept
Creates a NormalisableRange with a given range and an injective mapping function.
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueType intervalValue) noexcept
Creates a NormalisableRange with a given range and interval, but a dummy skew-factor.
ValueType interval
The snapping interval that should be used (for a non-normalised value).
NormalisableRange(Range< ValueType > range, ValueType intervalValue) noexcept
Creates a NormalisableRange with a given range and interval, but a dummy skew-factor.
NormalisableRange(ValueType rangeStart, ValueType rangeEnd, ValueType intervalValue, ValueType skewFactor, bool useSymmetricSkew=false) noexcept
Creates a NormalisableRange with a given range, interval and skew factor.
ValueType convertTo0to1(ValueType v) const noexcept
Uses the properties of this mapping to convert a non-normalised value to its 0->1 representation.
NormalisableRange(Range< ValueType > range) noexcept
Creates a NormalisableRange with a given range, continuous interval, but a dummy skew-factor.
A general-purpose range object, that simply represents any linear range with a start and end point.