14 typedef std::pair<float, T> control_point_type;
15 using const_iterator =
typename std::vector<control_point_type>::const_iterator;
18 std::vector<control_point_type> control_points;
20 void sort_control_points() {
21 std::sort(control_points.begin(), control_points.end(), [](
const control_point_type& a,
const control_point_type& b) { return a.first < b.first; });
29 control_points.clear();
32 bool empty()
const {
return control_points.empty(); }
35 return control_points.size();
38 void push_back(
float t,
const T& v) {
39 control_points.push_back(std::make_pair(t, v));
40 sort_control_points();
43 void assign(
const std::vector<control_point_type>& control_points) {
44 this->control_points = control_points;
45 sort_control_points();
48 control_point_type operator [](
size_t i)
const {
49 return control_points[i];
52 control_point_type& operator [](
size_t i) {
53 return control_points[i];
56 const std::vector<control_point_type>& ref_points()
const {
57 return control_points;
60 const_iterator begin()
const {
return control_points.cbegin(); }
61 const_iterator end()
const {
return control_points.cend(); }
63 control_point_type min()
const {
65 return control_points.front();
66 return std::make_pair(0.0f, (T)0);
69 control_point_type max()
const {
71 return control_points.back();
72 return std::make_pair(0.0f, (T)0);