46 lines
1.1 KiB
C++
Raw Permalink Normal View History

2016-12-07 14:14:56 -08:00
#pragma once
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
2018-07-31 17:32:27 -07:00
#include <algorithm>
2016-12-07 14:14:56 -08:00
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
2018-07-31 17:32:27 -07:00
using scanbeam_list = std::vector<T>;
2016-12-07 14:14:56 -08:00
2020-08-25 17:00:50 -07:00
template <typename T>
void insert_sorted_scanbeam(scanbeam_list<T>& scanbeam, T& t) {
typename scanbeam_list<T>::iterator i = std::lower_bound(scanbeam.begin(), scanbeam.end(), t);
if (i == scanbeam.end() || t < *i) {
scanbeam.insert(i, t);
}
}
2016-12-07 14:14:56 -08:00
template <typename T>
bool pop_from_scanbeam(T& Y, scanbeam_list<T>& scanbeam) {
if (scanbeam.empty()) {
return false;
}
2020-08-25 17:00:50 -07:00
2018-07-31 17:32:27 -07:00
Y = scanbeam.back();
scanbeam.pop_back();
2016-12-07 14:14:56 -08:00
return true;
}
template <typename T>
void setup_scanbeam(local_minimum_list<T>& minima_list, scanbeam_list<T>& scanbeam) {
2020-08-25 17:00:50 -07:00
scanbeam.reserve(minima_list.size());
2016-12-07 14:14:56 -08:00
for (auto lm = minima_list.begin(); lm != minima_list.end(); ++lm) {
2018-07-31 17:32:27 -07:00
scanbeam.push_back(lm->y);
2016-12-07 14:14:56 -08:00
}
2020-08-25 17:00:50 -07:00
std::sort(scanbeam.begin(), scanbeam.end());
2016-12-07 14:14:56 -08:00
}
2020-08-25 17:00:50 -07:00
} // namespace wagyu
} // namespace geometry
} // namespace mapbox