1// Boost.Geometry (aka GGL, Generic Geometry Library)
2// Unit Test
3
4// Copyright (c) 2011-2012 Barend Gehrels, Amsterdam, the Netherlands.
5
6// This file was modified by Oracle on 2020.
7// Modifications copyright (c) 2020 Oracle and/or its affiliates.
8// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
9
10// Use, modification and distribution is subject to the Boost Software License,
11// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
12// http://www.boost.org/LICENSE_1_0.txt)
13
14#ifndef GEOMETRY_TEST_TEST_GEOMETRIES_ALL_CUSTOM_RING_HPP
15#define GEOMETRY_TEST_TEST_GEOMETRIES_ALL_CUSTOM_RING_HPP
16
17#include <cstddef>
18
19#include <boost/geometry/core/mutable_range.hpp>
20#include <boost/geometry/core/tag.hpp>
21#include <boost/geometry/core/tags.hpp>
22
23#include <test_geometries/all_custom_container.hpp>
24
25
26template <typename P>
27class all_custom_ring : public all_custom_container<P>
28{};
29
30
31// Note that the things below are nearly all identical to implementation
32// in *linestring, but it seems not possible to re-use this (without macro's)
33// (the only thing DIFFERENT is the tag)
34
35
36// 1. Adapt to Boost.Geometry
37namespace boost { namespace geometry
38{
39
40namespace traits
41{
42 template <typename Point>
43 struct tag<all_custom_ring<Point> >
44 {
45 typedef ring_tag type;
46 };
47
48
49 // Implement traits for mutable actions
50 // These are all optional traits (normally / default they are implemented
51 // conforming std:: functionality)
52
53 template <typename Point>
54 struct clear<all_custom_ring<Point> >
55 {
56 static inline void apply(all_custom_ring<Point>& acr)
57 {
58 acr.custom_clear();
59 }
60 };
61
62 template <typename Point>
63 struct push_back<all_custom_ring<Point> >
64 {
65 static inline void apply(all_custom_ring<Point>& acr, Point const& point)
66 {
67 acr.custom_push_back(point);
68 }
69 };
70
71 template <typename Point>
72 struct resize<all_custom_ring<Point> >
73 {
74 static inline void apply(all_custom_ring<Point>& acr, std::size_t new_size)
75 {
76 acr.custom_resize(new_size);
77 }
78 };
79
80} // namespace traits
81
82}} // namespace boost::geometry
83
84
85// 2a. Adapt to Boost.Range, meta-functions
86namespace boost
87{
88 template<typename Point>
89 struct range_mutable_iterator<all_custom_ring<Point> >
90 {
91 typedef typename all_custom_ring<Point>::custom_iterator_type type;
92 };
93
94 template<typename Point>
95 struct range_const_iterator<all_custom_ring<Point> >
96 {
97 typedef typename all_custom_ring<Point>::custom_const_iterator_type type;
98 };
99
100} // namespace boost
101
102
103// 2b. Adapt to Boost.Range, part 2, ADP
104
105template<typename Point>
106inline typename all_custom_ring<Point>::custom_iterator_type
107 range_begin(all_custom_ring<Point>& acr)
108{
109 return acr.custom_begin();
110}
111
112template<typename Point>
113inline typename all_custom_ring<Point>::custom_const_iterator_type
114 range_begin(all_custom_ring<Point> const& acr)
115{
116 return acr.custom_begin();
117}
118
119template<typename Point>
120inline typename all_custom_ring<Point>::custom_iterator_type
121 range_end(all_custom_ring<Point>& acr)
122{
123 return acr.custom_end();
124}
125
126template<typename Point>
127inline typename all_custom_ring<Point>::custom_const_iterator_type
128 range_end(all_custom_ring<Point> const& acr)
129{
130 return acr.custom_end();
131}
132
133// (Optional)
134template<typename Point>
135inline std::size_t range_calculate_size(all_custom_ring<Point> const& acr)
136{
137 return acr.custom_size();
138}
139
140
141
142
143#endif // GEOMETRY_TEST_TEST_GEOMETRIES_ALL_CUSTOM_RING_HPP
144

source code of boost/libs/geometry/test/test_geometries/all_custom_ring.hpp