1 #pragma once
2 
3 // mapbox
4 #include <mapbox/geometry/point.hpp>
5 
6 // stl
7 #include <vector>
8 
9 namespace mapbox {
10 namespace geometry {
11 
12 template <typename T, template <typename...> class Cont = std::vector>
13 struct linear_ring : Cont<point<T>>
14 {
15     using coordinate_type = T;
16     using point_type = point<T>;
17     using container_type = Cont<point_type>;
18     using size_type = typename container_type::size_type;
19 
20     template <class... Args>
linear_ringmapbox::geometry::linear_ring21     linear_ring(Args&&... args) : container_type(std::forward<Args>(args)...) {}
linear_ringmapbox::geometry::linear_ring22     linear_ring(std::initializer_list<point_type> args)
23         : container_type(std::move(args)) {}
24 };
25 
26 template <typename T, template <typename...> class Cont = std::vector>
27 struct polygon : Cont<linear_ring<T>>
28 {
29     using coordinate_type = T;
30     using linear_ring_type = linear_ring<T>;
31     using container_type = Cont<linear_ring_type>;
32     using size_type = typename container_type::size_type;
33 
34     template <class... Args>
polygonmapbox::geometry::polygon35     polygon(Args&&... args) : container_type(std::forward<Args>(args)...) {}
polygonmapbox::geometry::polygon36     polygon(std::initializer_list<linear_ring_type> args)
37         : container_type(std::move(args)) {}
38 };
39 
40 } // namespace geometry
41 } // namespace mapbox
42