Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-05 08:33:08

0001 // Boost.Geometry (aka GGL, Generic Geometry Library)
0002 
0003 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
0004 
0005 // This file was modified by Oracle on 2013-2020.
0006 // Modifications copyright (c) 2013-2020, Oracle and/or its affiliates.
0007 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
0008 
0009 // Use, modification and distribution is subject to the Boost Software License,
0010 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
0011 // http://www.boost.org/LICENSE_1_0.txt)
0012 
0013 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP
0014 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP
0015 
0016 #include <type_traits>
0017 
0018 #include <boost/geometry/core/assert.hpp>
0019 #include <boost/geometry/core/tag.hpp>
0020 #include <boost/geometry/util/range.hpp>
0021 #include <boost/geometry/util/type_traits.hpp>
0022 
0023 namespace boost { namespace geometry {
0024 
0025 #ifndef DOXYGEN_NO_DISPATCH
0026 namespace detail_dispatch {
0027 
0028 // Returns single geometry by Id
0029 // for single geometries returns the geometry itself
0030 template
0031 <
0032     typename Geometry,
0033     bool IsMulti = util::is_multi<Geometry>::value
0034 >
0035 struct single_geometry
0036 {
0037     typedef Geometry & return_type;
0038 
0039     template <typename Id>
0040     static inline return_type apply(Geometry & g, Id const& ) { return g; }
0041 };
0042 
0043 // for multi geometries returns one of the stored single geometries
0044 template <typename Geometry>
0045 struct single_geometry<Geometry, true>
0046 {
0047     typedef typename boost::range_reference<Geometry>::type return_type;
0048 
0049     template <typename Id>
0050     static inline return_type apply(Geometry & g, Id const& id)
0051     {
0052         BOOST_GEOMETRY_ASSERT(id.multi_index >= 0);
0053         typedef typename boost::range_size<Geometry>::type size_type;
0054         return range::at(g, static_cast<size_type>(id.multi_index));
0055     }
0056 };
0057 
0058 } // namespace detail_dispatch
0059 #endif // DOXYGEN_NO_DISPATCH
0060 
0061 #ifndef DOXYGEN_NO_DETAIL
0062 namespace detail {
0063 
0064 template <typename Geometry>
0065 struct single_geometry_return_type
0066 {
0067     typedef typename detail_dispatch::single_geometry<Geometry>::return_type type;
0068 };
0069 
0070 template <typename Geometry, typename Id>
0071 inline
0072 typename single_geometry_return_type<Geometry>::type
0073 single_geometry(Geometry & geometry, Id const& id)
0074 {
0075     return detail_dispatch::single_geometry<Geometry>::apply(geometry, id);
0076 }
0077 
0078 template <typename Geometry, typename Id>
0079 inline
0080 typename single_geometry_return_type<Geometry const>::type
0081 single_geometry(Geometry const& geometry, Id const& id)
0082 {
0083     return detail_dispatch::single_geometry<Geometry const>::apply(geometry, id);
0084 }
0085 
0086 } // namespace detail
0087 #endif // DOXYGEN_NO_DETAIL
0088 
0089 }} // namespace boost::geometry
0090 
0091 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_SINGLE_GEOMETRY_HPP