1// Boost.Geometry (aka GGL, Generic Geometry Library)
2// Unit Test
3
4// Copyright (c) 2011-2012 Barend Gehrels, Amsterdam, the Netherlands.
5
6// Use, modification and distribution is subject to the Boost Software License,
7// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9
10
11#ifndef GEOMETRY_TEST_TEST_GEOMETRIES_ALL_CUSTOM_CONTAINER_HPP
12#define GEOMETRY_TEST_TEST_GEOMETRIES_ALL_CUSTOM_CONTAINER_HPP
13
14#include <cstddef>
15#include <deque>
16
17
18template <typename Item>
19class all_custom_container
20{
21private :
22 std::deque<Item> m_hidden_deque;
23
24public :
25 typedef typename std::deque<Item>::iterator custom_iterator_type;
26 typedef typename std::deque<Item>::const_iterator custom_const_iterator_type;
27
28 inline std::size_t custom_size() const { return m_hidden_deque.size(); }
29
30 inline custom_const_iterator_type custom_begin() const { return m_hidden_deque.begin(); }
31 inline custom_const_iterator_type custom_end() const { return m_hidden_deque.end(); }
32 inline custom_iterator_type custom_begin() { return m_hidden_deque.begin(); }
33 inline custom_iterator_type custom_end() { return m_hidden_deque.end(); }
34
35 inline void custom_clear() { m_hidden_deque.clear(); }
36 inline void custom_push_back(Item const& p) { m_hidden_deque.push_back(p); }
37 inline void custom_resize(std::size_t new_size) { m_hidden_deque.resize(new_size); }
38};
39
40
41// 1. Adapt to Boost.Geometry (for e.g. inner rings)
42namespace boost { namespace geometry
43{
44
45namespace traits
46{
47 template <typename Item>
48 struct clear<all_custom_container<Item> >
49 {
50 static inline void apply(all_custom_container<Item>& container)
51 {
52 container.custom_clear();
53 }
54 };
55
56 template <typename Item>
57 struct push_back<all_custom_container<Item> >
58 {
59 static inline void apply(all_custom_container<Item>& container, Item const& item)
60 {
61 container.custom_push_back(item);
62 }
63 };
64
65 template <typename Item>
66 struct resize<all_custom_container<Item> >
67 {
68 static inline void apply(all_custom_container<Item>& container, std::size_t new_size)
69 {
70 container.custom_resize(new_size);
71 }
72 };
73
74} // namespace traits
75
76}} // namespace boost::geometry
77
78
79// 2a. Adapt to Boost.Range, meta-functions
80namespace boost
81{
82 template<typename Item>
83 struct range_mutable_iterator<all_custom_container<Item> >
84 {
85 typedef typename all_custom_container<Item>::custom_iterator_type type;
86 };
87
88 template<typename Item>
89 struct range_const_iterator<all_custom_container<Item> >
90 {
91 typedef typename all_custom_container<Item>::custom_const_iterator_type type;
92 };
93
94} // namespace boost
95
96
97// 2b. Adapt to Boost.Range, part 2, ADP
98
99template<typename Item>
100inline typename all_custom_container<Item>::custom_iterator_type
101 range_begin(all_custom_container<Item>& container)
102{
103 return container.custom_begin();
104}
105
106template<typename Item>
107inline typename all_custom_container<Item>::custom_const_iterator_type
108 range_begin(all_custom_container<Item> const& container)
109{
110 return container.custom_begin();
111}
112
113template<typename Item>
114inline typename all_custom_container<Item>::custom_iterator_type
115 range_end(all_custom_container<Item>& container)
116{
117 return container.custom_end();
118}
119
120template<typename Item>
121inline typename all_custom_container<Item>::custom_const_iterator_type
122 range_end(all_custom_container<Item> const& container)
123{
124 return container.custom_end();
125}
126
127// (Optional)
128template<typename Item>
129inline std::size_t range_calculate_size(all_custom_container<Item> const& container)
130{
131 return container.custom_size();
132}
133
134
135
136
137#endif // GEOMETRY_TEST_TEST_GEOMETRIES_ALL_CUSTOM_CONTAINER_HPP
138

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