diff options
Diffstat (limited to 'boost/geometry/index/detail/rtree/node/weak_visitor.hpp')
-rw-r--r-- | boost/geometry/index/detail/rtree/node/weak_visitor.hpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/boost/geometry/index/detail/rtree/node/weak_visitor.hpp b/boost/geometry/index/detail/rtree/node/weak_visitor.hpp new file mode 100644 index 0000000000..08d84778e6 --- /dev/null +++ b/boost/geometry/index/detail/rtree/node/weak_visitor.hpp @@ -0,0 +1,67 @@ +// Boost.Geometry Index +// +// R-tree nodes weak visitor and nodes base type +// +// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland. +// +// Use, modification and distribution is subject to the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_VISITOR_HPP +#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_WEAK_VISITOR_HPP + +namespace boost { namespace geometry { namespace index { + +namespace detail { namespace rtree { + +// empty visitor +template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag, bool IsVisitableConst> +struct weak_visitor {}; + +// node + +template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag> +struct weak_node {}; + +// nodes variants forward declarations + +template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag> +struct weak_internal_node; + +template <typename Value, typename Parameters, typename Box, typename Allocators, typename Tag> +struct weak_leaf; + +// nodes conversion + +template <typename Derived, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag> +inline Derived & get(weak_node<Value, Parameters, Box, Allocators, Tag> & n) +{ + return static_cast<Derived&>(n); +} + +// apply visitor + +template <typename Visitor, typename Value, typename Parameters, typename Box, typename Allocators, typename Tag> +inline void apply_visitor(Visitor & v, + weak_node<Value, Parameters, Box, Allocators, Tag> & n, + bool is_internal_node) +{ + BOOST_GEOMETRY_INDEX_ASSERT(&n, "null ptr"); + if ( is_internal_node ) + { + typedef weak_internal_node<Value, Parameters, Box, Allocators, Tag> internal_node; + v(get<internal_node>(n)); + } + else + { + typedef weak_leaf<Value, Parameters, Box, Allocators, Tag> leaf; + v(get<leaf>(n)); + } +} + +}} // namespace detail::rtree + +}}} // namespace boost::geometry::index + +#endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_DYNAMIC_VISITOR_HPP |