1 #pragma once 2 3 #include <mapbox/geometry/box.hpp> 4 #include <mapbox/geometry/for_each_point.hpp> 5 6 #include <limits> 7 8 namespace mapbox { 9 namespace geometry { 10 11 template <typename G, typename T = typename G::coordinate_type> envelope(G const & geometry)12box<T> envelope(G const& geometry) 13 { 14 using limits = std::numeric_limits<T>; 15 16 T min_t = limits::has_infinity ? -limits::infinity() : limits::min(); 17 T max_t = limits::has_infinity ? limits::infinity() : limits::max(); 18 19 point<T> min(max_t, max_t); 20 point<T> max(min_t, min_t); 21 22 for_each_point(geometry, [&] (point<T> const& point) { 23 if (min.x > point.x) min.x = point.x; 24 if (min.y > point.y) min.y = point.y; 25 if (max.x < point.x) max.x = point.x; 26 if (max.y < point.y) max.y = point.y; 27 }); 28 29 return box<T>(min, max); 30 } 31 32 } // namespace geometry 33 } // namespace mapbox 34