[core] Eliminate round-trip through Value in CameraFunction::evaluate
This commit is contained in:
@@ -25,7 +25,7 @@ public:
|
||||
|
||||
T evaluate(float zoom) const {
|
||||
return stops.match([&] (const auto& s) {
|
||||
return s.evaluate(Value(double(zoom))).value_or(T());
|
||||
return s.evaluate(zoom).value_or(T());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -22,28 +22,31 @@ public:
|
||||
base(base_) {
|
||||
}
|
||||
|
||||
optional<T> evaluate(const Value& value) const {
|
||||
optional<T> evaluate(float z) const {
|
||||
if (stops.empty()) {
|
||||
assert(false);
|
||||
return T();
|
||||
}
|
||||
|
||||
optional<float> z = numericValue<float>(value);
|
||||
if (!z) {
|
||||
return T();
|
||||
}
|
||||
|
||||
auto it = stops.upper_bound(*z);
|
||||
auto it = stops.upper_bound(z);
|
||||
if (it == stops.end()) {
|
||||
return stops.rbegin()->second;
|
||||
} else if (it == stops.begin()) {
|
||||
return stops.begin()->second;
|
||||
} else {
|
||||
return util::interpolate(std::prev(it)->second, it->second,
|
||||
util::interpolationFactor(base, { std::prev(it)->first, it->first }, *z));
|
||||
util::interpolationFactor(base, { std::prev(it)->first, it->first }, z));
|
||||
}
|
||||
}
|
||||
|
||||
optional<T> evaluate(const Value& value) const {
|
||||
optional<float> z = numericValue<float>(value);
|
||||
if (!z) {
|
||||
return T();
|
||||
}
|
||||
return evaluate(*z);
|
||||
}
|
||||
|
||||
friend bool operator==(const ExponentialStops& lhs,
|
||||
const ExponentialStops& rhs) {
|
||||
return lhs.stops == rhs.stops && lhs.base == rhs.base;
|
||||
|
||||
@@ -18,18 +18,13 @@ public:
|
||||
: stops(std::move(stops_)) {
|
||||
}
|
||||
|
||||
optional<T> evaluate(const Value& value) const {
|
||||
optional<T> evaluate(float z) const {
|
||||
if (stops.empty()) {
|
||||
assert(false);
|
||||
return {};
|
||||
}
|
||||
|
||||
optional<float> z = numericValue<float>(value);
|
||||
if (!z) {
|
||||
return {};
|
||||
}
|
||||
|
||||
auto it = stops.upper_bound(*z);
|
||||
auto it = stops.upper_bound(z);
|
||||
if (it == stops.end()) {
|
||||
return stops.rbegin()->second;
|
||||
} else if (it == stops.begin()) {
|
||||
@@ -39,6 +34,14 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
optional<T> evaluate(const Value& value) const {
|
||||
optional<float> z = numericValue<float>(value);
|
||||
if (!z) {
|
||||
return {};
|
||||
}
|
||||
return evaluate(*z);
|
||||
}
|
||||
|
||||
friend bool operator==(const IntervalStops& lhs,
|
||||
const IntervalStops& rhs) {
|
||||
return lhs.stops == rhs.stops;
|
||||
|
||||
Reference in New Issue
Block a user