Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/geometry/index/detail/algorithms/content.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/geometry/index/detail/algorithms/content.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,85 @@ +// Boost.Geometry Index +// +// n-dimensional content (hypervolume) - 2d area, 3d volume, ... +// +// Copyright (c) 2011-2013 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_ALGORITHMS_CONTENT_HPP +#define BOOST_GEOMETRY_INDEX_DETAIL_ALGORITHMS_CONTENT_HPP + +namespace boost { namespace geometry { namespace index { namespace detail { + +template <typename Indexable> +struct default_content_result +{ + typedef typename select_most_precise< + typename coordinate_type<Indexable>::type, + long double + >::type type; +}; + +namespace dispatch { + +template <typename Box, size_t CurrentDimension> +struct content_box +{ + BOOST_STATIC_ASSERT(0 < CurrentDimension); + //BOOST_STATIC_ASSERT(CurrentDimension <= traits::dimension<Box>::value); + + static inline typename detail::default_content_result<Box>::type apply(Box const& b) + { + return content_box<Box, CurrentDimension - 1>::apply(b) * + ( get<max_corner, CurrentDimension - 1>(b) - get<min_corner, CurrentDimension - 1>(b) ); + } +}; + +template <typename Box> +struct content_box<Box, 1> +{ + static inline typename detail::default_content_result<Box>::type apply(Box const& b) + { + return get<max_corner, 0>(b) - get<min_corner, 0>(b); + } +}; + +template <typename Indexable, typename Tag> +struct content +{ + BOOST_MPL_ASSERT_MSG(false, NOT_IMPLEMENTED_FOR_THIS_INDEXABLE_AND_TAG, (Indexable, Tag)); +}; + +template <typename Indexable> +struct content<Indexable, point_tag> +{ + static typename detail::default_content_result<Indexable>::type apply(Indexable const&) + { + return 0; + } +}; + +template <typename Indexable> +struct content<Indexable, box_tag> +{ + static typename default_content_result<Indexable>::type apply(Indexable const& b) + { + return dispatch::content_box<Indexable, dimension<Indexable>::value>::apply(b); + } +}; + +} // namespace dispatch + +template <typename Indexable> +typename default_content_result<Indexable>::type content(Indexable const& b) +{ + return dispatch::content<Indexable, + typename tag<Indexable>::type + >::apply(b); +} + +}}}} // namespace boost::geometry::index::detail + +#endif // BOOST_GEOMETRY_INDEX_DETAIL_ALGORITHMS_CONTENT_HPP