Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / geometry / index / detail / rtree / options.hpp
1 // Boost.Geometry Index
2 //
3 // R-tree options, algorithms, parameters
4 //
5 // Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
6 //
7 // Use, modification and distribution is subject to the Boost Software License,
8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10
11 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_OPTIONS_HPP
12 #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_OPTIONS_HPP
13
14 #include <boost/geometry/index/parameters.hpp>
15
16 namespace boost { namespace geometry { namespace index {
17
18 namespace detail { namespace rtree {
19
20 // InsertTag
21 struct insert_default_tag {};
22 struct insert_reinsert_tag {};
23
24 // ChooseNextNodeTag
25 struct choose_by_content_diff_tag {};
26 struct choose_by_overlap_diff_tag {};
27
28 // SplitTag
29 struct split_default_tag {};
30 //struct split_kmeans_tag {};
31
32 // RedistributeTag
33 struct linear_tag {};
34 struct quadratic_tag {};
35 struct rstar_tag {};
36
37 // NodeTag
38 struct node_variant_dynamic_tag {};
39 struct node_variant_static_tag {};
40 //struct node_weak_dynamic_tag {};
41 //struct node_weak_static_tag {};
42
43 template <typename Parameters, typename InsertTag, typename ChooseNextNodeTag, typename SplitTag, typename RedistributeTag, typename NodeTag>
44 struct options
45 {
46     typedef Parameters parameters_type;
47     typedef InsertTag insert_tag;
48     typedef ChooseNextNodeTag choose_next_node_tag;
49     typedef SplitTag split_tag;
50     typedef RedistributeTag redistribute_tag;
51     typedef NodeTag node_tag;
52 };
53
54 template <typename Parameters>
55 struct options_type
56 {
57     // TODO: awulkiew - use static assert
58 };
59
60 template <size_t MaxElements, size_t MinElements>
61 struct options_type< index::linear<MaxElements, MinElements> >
62 {
63     typedef options<
64         index::linear<MaxElements, MinElements>,
65         insert_default_tag,
66         choose_by_content_diff_tag,
67         split_default_tag,
68         linear_tag,
69         node_variant_static_tag
70     > type;
71 };
72
73 template <size_t MaxElements, size_t MinElements>
74 struct options_type< index::quadratic<MaxElements, MinElements> >
75 {
76     typedef options<
77         index::quadratic<MaxElements, MinElements>,
78         insert_default_tag,
79         choose_by_content_diff_tag,
80         split_default_tag,
81         quadratic_tag,
82         node_variant_static_tag
83     > type;
84 };
85
86 template <size_t MaxElements, size_t MinElements, size_t OverlapCostThreshold, size_t ReinsertedElements>
87 struct options_type< index::rstar<MaxElements, MinElements, OverlapCostThreshold, ReinsertedElements> >
88 {
89     typedef options<
90         index::rstar<MaxElements, MinElements, OverlapCostThreshold, ReinsertedElements>,
91         insert_reinsert_tag,
92         choose_by_overlap_diff_tag,
93         split_default_tag,
94         rstar_tag,
95         node_variant_static_tag
96     > type;
97 };
98
99 //template <size_t MaxElements, size_t MinElements>
100 //struct options_type< kmeans<MaxElements, MinElements> >
101 //{
102 //    typedef options<
103 //        kmeans<MaxElements, MinElements>,
104 //        insert_default_tag,
105 //        choose_by_content_diff_tag, // change it?
106 //        split_kmeans_tag,
107 //        int, // dummy tag - not used for now
108 //        node_variant_static_tag
109 //    > type;
110 //};
111
112 template <>
113 struct options_type< index::dynamic_linear >
114 {
115     typedef options<
116         index::dynamic_linear,
117         insert_default_tag,
118         choose_by_content_diff_tag,
119         split_default_tag,
120         linear_tag,
121         node_variant_dynamic_tag
122     > type;
123 };
124
125 template <>
126 struct options_type< index::dynamic_quadratic >
127 {
128     typedef options<
129         index::dynamic_quadratic,
130         insert_default_tag,
131         choose_by_content_diff_tag,
132         split_default_tag,
133         quadratic_tag,
134         node_variant_dynamic_tag
135     > type;
136 };
137
138 template <>
139 struct options_type< index::dynamic_rstar >
140 {
141     typedef options<
142         index::dynamic_rstar,
143         insert_reinsert_tag,
144         choose_by_overlap_diff_tag,
145         split_default_tag,
146         rstar_tag,
147         node_variant_dynamic_tag
148     > type;
149 };
150
151 }} // namespace detail::rtree
152
153 }}} // namespace boost::geometry::index
154
155 #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_OPTIONS_HPP