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)12 box<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