#pragma once #ifdef DEBUG #include #include #endif #include #include namespace mapbox { namespace geometry { namespace wagyu { template struct local_minimum { bound left_bound; bound right_bound; T y; bool minimum_has_horizontal; local_minimum(bound&& left_bound_, bound&& right_bound_, T y_, bool has_horz_) : left_bound(std::move(left_bound_)), right_bound(std::move(right_bound_)), y(y_), minimum_has_horizontal(has_horz_) { } }; template using local_minimum_list = std::deque>; template using local_minimum_itr = typename local_minimum_list::iterator; template using local_minimum_ptr = local_minimum*; template using local_minimum_ptr_list = std::vector>; template using local_minimum_ptr_list_itr = typename local_minimum_ptr_list::iterator; template struct local_minimum_sorter { inline bool operator()(local_minimum_ptr const& locMin1, local_minimum_ptr const& locMin2) { if (locMin2->y == locMin1->y) { return locMin2->minimum_has_horizontal != locMin1->minimum_has_horizontal && locMin1->minimum_has_horizontal; } return locMin2->y < locMin1->y; } }; #ifdef DEBUG template inline std::basic_ostream& operator<<(std::basic_ostream& out, const local_minimum& lm) { out << " Local Minimum:" << std::endl; out << " y: " << lm.y << std::endl; if (lm.minimum_has_horizontal) { out << " minimum_has_horizontal: true" << std::endl; } else { out << " minimum_has_horizontal: false" << std::endl; } out << " left_bound: " << std::endl; out << lm.left_bound << std::endl; out << " right_bound: " << std::endl; out << lm.right_bound << std::endl; return out; } template inline std::basic_ostream& operator<<(std::basic_ostream& out, const local_minimum_ptr_list& lms) { for (auto const& lm : lms) { out << *lm; } return out; } template std::string output_all_edges(local_minimum_ptr_list const& lms) { std::ostringstream out; out << "["; bool first = true; for (auto const& lm : lms) { for (auto const& e : lm->left_bound.edges) { if (first) { first = false; } else { out << ","; } out << "[[" << e.bot.x << "," << e.bot.y << "],["; out << e.top.x << "," << e.top.y << "]]"; } for (auto const& e : lm->right_bound.edges) { if (first) { first = false; } else { out << ","; } out << "[[" << e.bot.x << "," << e.bot.y << "],["; out << e.top.x << "," << e.top.y << "]]"; } } out << "]"; return out.str(); } #endif } } }