@@ -33,14 +33,25 @@ class Interpolated : public BaseCurve<T> {
3333 * example for a <= t <= b:
3434 * val([a:x, b:y], t) = x + (y - x)/(b - a) * (t - a)
3535 */
36-
3736 T get (const time::time_t &) const override ;
3837
3938 void compress (const time::time_t &start = time::TIME_MIN) override ;
4039
4140private:
42- T interpolate (KeyframeContainer<T>::elem_ptr before,
43- KeyframeContainer<T>::elem_ptr after,
41+ /* *
42+ * Get an interpolated value between two keyframes.
43+ *
44+ * 'before' and 'after' must be ordered such that the index of 'before' is
45+ * less than the index of 'after'.
46+ *
47+ * @param before Index of the earlier keyframe.
48+ * @param after Index of the later keyframe.
49+ * @param elapsed Elapsed time after the earlier keyframe.
50+ *
51+ * @return Interpolated value.
52+ */
53+ T interpolate (typename KeyframeContainer<T>::elem_ptr before,
54+ typename KeyframeContainer<T>::elem_ptr after,
4455 double elapsed) const ;
4556};
4657
@@ -119,9 +130,13 @@ void Interpolated<T>::compress(const time::time_t &start) {
119130}
120131
121132template <typename T>
122- inline T Interpolated<T>::interpolate(KeyframeContainer<T>::elem_ptr before,
123- KeyframeContainer<T>::elem_ptr after,
133+ inline T Interpolated<T>::interpolate(typename KeyframeContainer<T>::elem_ptr before,
134+ typename KeyframeContainer<T>::elem_ptr after,
124135 double elapsed) const {
136+ ENSURE (before <= after, " Index of 'before' must be before 'after'" );
137+ ENSURE (elapsed <= (this ->container .get (after).time ().to_double ()
138+ - this ->container .get (before).time ().to_double ()),
139+ " Elapsed time must be less than or equal to the time between before and after" );
125140 // TODO: after->value - before->value will produce wrong results if
126141 // after->value < before->value and curve element type is unsigned
127142 // Example: after = 2, before = 4; type = uint8_t ==> 2 - 4 = 254
0 commit comments