[core] Eliminate round-trip through Value in CameraFunction::evaluate

This commit is contained in:
John Firebaugh
2017-05-19 09:39:41 -07:00
parent 895275d6fc
commit bdff99c853
3 changed files with 22 additions and 16 deletions

View File

@@ -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());
});
}

View File

@@ -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;

View File

@@ -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;