Chris@16: // Boost.Geometry Index Chris@16: // Chris@16: // R-tree ostreaming visitor implementation Chris@16: // Chris@16: // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland. Chris@16: // Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_PRINT_HPP Chris@16: #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_PRINT_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace geometry { namespace index { namespace detail { Chris@16: Chris@16: namespace utilities { Chris@16: Chris@16: namespace dispatch { Chris@16: Chris@16: template Chris@16: struct print_point Chris@16: { Chris@16: BOOST_STATIC_ASSERT(0 < Dimension); Chris@16: Chris@16: static inline void apply(std::ostream & os, Point const& p) Chris@16: { Chris@16: print_point::apply(os, p); Chris@16: Chris@16: os << ", " << geometry::get(p); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct print_point Chris@16: { Chris@16: static inline void apply(std::ostream & os, Point const& p) Chris@16: { Chris@16: os << geometry::get<0>(p); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct print_corner Chris@16: { Chris@16: BOOST_STATIC_ASSERT(0 < Dimension); Chris@16: Chris@16: static inline void apply(std::ostream & os, Box const& b) Chris@16: { Chris@16: print_corner::apply(os, b); Chris@16: Chris@16: os << ", " << geometry::get(b); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct print_corner Chris@16: { Chris@16: static inline void apply(std::ostream & os, Box const& b) Chris@16: { Chris@16: os << geometry::get(b); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct print_indexable Chris@16: { Chris@101: BOOST_MPL_ASSERT_MSG((false), NOT_IMPLEMENTED_FOR_THIS_TAG, (Tag)); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct print_indexable Chris@16: { Chris@16: static const size_t dimension = geometry::dimension::value; Chris@16: Chris@16: static inline void apply(std::ostream &os, Indexable const& i) Chris@16: { Chris@16: os << '('; Chris@16: print_corner::apply(os, i); Chris@16: os << ")x("; Chris@16: print_corner::apply(os, i); Chris@16: os << ')'; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct print_indexable Chris@16: { Chris@16: static const size_t dimension = geometry::dimension::value; Chris@16: Chris@16: static inline void apply(std::ostream &os, Indexable const& i) Chris@16: { Chris@16: os << '('; Chris@16: print_point::apply(os, i); Chris@16: os << ')'; Chris@16: } Chris@16: }; Chris@16: Chris@101: template Chris@101: struct print_indexable Chris@101: { Chris@101: static const size_t dimension = geometry::dimension::value; Chris@101: Chris@101: static inline void apply(std::ostream &os, Indexable const& i) Chris@101: { Chris@101: os << '('; Chris@101: print_corner::apply(os, i); Chris@101: os << ")-("; Chris@101: print_corner::apply(os, i); Chris@101: os << ')'; Chris@101: } Chris@101: }; Chris@101: Chris@16: } // namespace dispatch Chris@16: Chris@16: template inline Chris@16: void print_indexable(std::ostream & os, Indexable const& i) Chris@16: { Chris@16: dispatch::print_indexable< Chris@16: Indexable, Chris@16: typename tag::type Chris@16: >::apply(os, i); Chris@16: } Chris@16: Chris@16: } // namespace utilities Chris@16: Chris@16: namespace rtree { namespace utilities { Chris@16: Chris@16: namespace visitors { Chris@16: Chris@16: template Chris@16: struct print : public rtree::visitor::type Chris@16: { Chris@16: typedef typename rtree::internal_node::type internal_node; Chris@16: typedef typename rtree::leaf::type leaf; Chris@16: Chris@16: inline print(std::ostream & o, Translator const& t) Chris@16: : os(o), tr(t), level(0) Chris@16: {} Chris@16: Chris@16: inline void operator()(internal_node const& n) Chris@16: { Chris@16: typedef typename rtree::elements_type::type elements_type; Chris@16: elements_type const& elements = rtree::elements(n); Chris@16: Chris@16: spaces(level) << "INTERNAL NODE - L:" << level << " Ch:" << elements.size() << " @:" << &n << '\n'; Chris@16: Chris@16: for (typename elements_type::const_iterator it = elements.begin(); Chris@16: it != elements.end(); ++it) Chris@16: { Chris@16: spaces(level); Chris@16: detail::utilities::print_indexable(os, it->first); Chris@16: os << " ->" << it->second << '\n'; Chris@16: } Chris@16: Chris@16: size_t level_backup = level; Chris@16: ++level; Chris@16: Chris@16: for (typename elements_type::const_iterator it = elements.begin(); Chris@16: it != elements.end(); ++it) Chris@16: { Chris@16: rtree::apply_visitor(*this, *it->second); Chris@16: } Chris@16: Chris@16: level = level_backup; Chris@16: } Chris@16: Chris@16: inline void operator()(leaf const& n) Chris@16: { Chris@16: typedef typename rtree::elements_type::type elements_type; Chris@16: elements_type const& elements = rtree::elements(n); Chris@16: Chris@16: spaces(level) << "LEAF - L:" << level << " V:" << elements.size() << " @:" << &n << '\n'; Chris@16: for (typename elements_type::const_iterator it = elements.begin(); Chris@16: it != elements.end(); ++it) Chris@16: { Chris@16: spaces(level); Chris@16: detail::utilities::print_indexable(os, tr(*it)); Chris@16: os << '\n'; Chris@16: } Chris@16: } Chris@16: Chris@16: inline std::ostream & spaces(size_t level) Chris@16: { Chris@16: for ( size_t i = 0 ; i < 2 * level ; ++i ) Chris@16: os << ' '; Chris@16: return os; Chris@16: } Chris@16: Chris@16: std::ostream & os; Chris@16: Translator const& tr; Chris@16: Chris@16: size_t level; Chris@16: }; Chris@16: Chris@16: } // namespace visitors Chris@16: Chris@16: template inline Chris@16: void print(std::ostream & os, Rtree const& tree) Chris@16: { Chris@16: typedef utilities::view RTV; Chris@16: RTV rtv(tree); Chris@16: Chris@16: visitors::print< Chris@16: typename RTV::value_type, Chris@16: typename RTV::options_type, Chris@16: typename RTV::translator_type, Chris@16: typename RTV::box_type, Chris@16: typename RTV::allocators_type Chris@16: > print_v(os, rtv.translator()); Chris@16: rtv.apply_visitor(print_v); Chris@16: } Chris@16: Chris@16: }} // namespace rtree::utilities Chris@16: Chris@16: }}}} // namespace boost::geometry::index::detail Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_PRINT_HPP