1 // Boost.Geometry Index
3 // R-tree ostreaming visitor implementation
5 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
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)
11 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_PRINT_HPP
12 #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_PRINT_HPP
16 namespace boost { namespace geometry { namespace index { namespace detail {
22 template <typename Point, size_t Dimension>
25 BOOST_STATIC_ASSERT(0 < Dimension);
27 static inline void apply(std::ostream & os, Point const& p)
29 print_point<Point, Dimension - 1>::apply(os, p);
31 os << ", " << geometry::get<Dimension - 1>(p);
35 template <typename Point>
36 struct print_point<Point, 1>
38 static inline void apply(std::ostream & os, Point const& p)
40 os << geometry::get<0>(p);
44 template <typename Box, size_t Corner, size_t Dimension>
47 BOOST_STATIC_ASSERT(0 < Dimension);
49 static inline void apply(std::ostream & os, Box const& b)
51 print_corner<Box, Corner, Dimension - 1>::apply(os, b);
53 os << ", " << geometry::get<Corner, Dimension - 1>(b);
57 template <typename Box, size_t Corner>
58 struct print_corner<Box, Corner, 1>
60 static inline void apply(std::ostream & os, Box const& b)
62 os << geometry::get<Corner, 0>(b);
66 template <typename Indexable, typename Tag>
67 struct print_indexable
69 BOOST_MPL_ASSERT_MSG((false), NOT_IMPLEMENTED_FOR_THIS_TAG, (Tag));
72 template <typename Indexable>
73 struct print_indexable<Indexable, box_tag>
75 static const size_t dimension = geometry::dimension<Indexable>::value;
77 static inline void apply(std::ostream &os, Indexable const& i)
80 print_corner<Indexable, min_corner, dimension>::apply(os, i);
82 print_corner<Indexable, max_corner, dimension>::apply(os, i);
87 template <typename Indexable>
88 struct print_indexable<Indexable, point_tag>
90 static const size_t dimension = geometry::dimension<Indexable>::value;
92 static inline void apply(std::ostream &os, Indexable const& i)
95 print_point<Indexable, dimension>::apply(os, i);
100 template <typename Indexable>
101 struct print_indexable<Indexable, segment_tag>
103 static const size_t dimension = geometry::dimension<Indexable>::value;
105 static inline void apply(std::ostream &os, Indexable const& i)
108 print_corner<Indexable, 0, dimension>::apply(os, i);
110 print_corner<Indexable, 1, dimension>::apply(os, i);
115 } // namespace dispatch
117 template <typename Indexable> inline
118 void print_indexable(std::ostream & os, Indexable const& i)
120 dispatch::print_indexable<
122 typename tag<Indexable>::type
126 } // namespace utilities
128 namespace rtree { namespace utilities {
132 template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
133 struct print : public rtree::visitor<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag, true>::type
135 typedef typename rtree::internal_node<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type internal_node;
136 typedef typename rtree::leaf<Value, typename Options::parameters_type, Box, Allocators, typename Options::node_tag>::type leaf;
138 inline print(std::ostream & o, Translator const& t)
139 : os(o), tr(t), level(0)
142 inline void operator()(internal_node const& n)
144 typedef typename rtree::elements_type<internal_node>::type elements_type;
145 elements_type const& elements = rtree::elements(n);
147 spaces(level) << "INTERNAL NODE - L:" << level << " Ch:" << elements.size() << " @:" << &n << '\n';
149 for (typename elements_type::const_iterator it = elements.begin();
150 it != elements.end(); ++it)
153 detail::utilities::print_indexable(os, it->first);
154 os << " ->" << it->second << '\n';
157 size_t level_backup = level;
160 for (typename elements_type::const_iterator it = elements.begin();
161 it != elements.end(); ++it)
163 rtree::apply_visitor(*this, *it->second);
166 level = level_backup;
169 inline void operator()(leaf const& n)
171 typedef typename rtree::elements_type<leaf>::type elements_type;
172 elements_type const& elements = rtree::elements(n);
174 spaces(level) << "LEAF - L:" << level << " V:" << elements.size() << " @:" << &n << '\n';
175 for (typename elements_type::const_iterator it = elements.begin();
176 it != elements.end(); ++it)
179 detail::utilities::print_indexable(os, tr(*it));
184 inline std::ostream & spaces(size_t level)
186 for ( size_t i = 0 ; i < 2 * level ; ++i )
192 Translator const& tr;
197 } // namespace visitors
199 template <typename Rtree> inline
200 void print(std::ostream & os, Rtree const& tree)
202 typedef utilities::view<Rtree> RTV;
206 typename RTV::value_type,
207 typename RTV::options_type,
208 typename RTV::translator_type,
209 typename RTV::box_type,
210 typename RTV::allocators_type
211 > print_v(os, rtv.translator());
212 rtv.apply_visitor(print_v);
215 }} // namespace rtree::utilities
217 }}}} // namespace boost::geometry::index::detail
219 #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_PRINT_HPP