boost/geometry/geometries/concepts/point_concept.hpp
// Boost.Geometry (aka GGL, Generic Geometry Library)
//
// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
// Copyright (c) 2008-2014 Barend Gehrels, Amsterdam, the Netherlands.
// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
// This file was modified by Oracle on 2014-2021.
// Modifications copyright (c) 2014-2021, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
// 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_GEOMETRIES_CONCEPTS_POINT_CONCEPT_HPP
#define BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_POINT_CONCEPT_HPP
#include <cstddef>
#include <boost/concept_check.hpp>
#include <boost/core/ignore_unused.hpp>
#include <boost/geometry/core/access.hpp>
#include <boost/geometry/core/coordinate_dimension.hpp>
#include <boost/geometry/core/coordinate_system.hpp>
#include <boost/geometry/geometries/concepts/concept_type.hpp>
namespace boost { namespace geometry { namespace concepts
{
template <typename Geometry>
class Point
{
#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
typedef typename coordinate_type<Geometry>::type ctype;
typedef typename coordinate_system<Geometry>::type csystem;
// The following enum is used to fully instantiate the coordinate
// system class; this is needed in order to check the units passed
// to it for non-Cartesian coordinate systems.
enum { cs_check = sizeof(csystem) };
enum { ccount = dimension<Geometry>::value };
template <typename P, std::size_t Dimension, std::size_t DimensionCount>
struct dimension_checker
{
static void apply()
{
P* p = 0;
geometry::set<Dimension>(*p, geometry::get<Dimension>(*p));
dimension_checker<P, Dimension+1, DimensionCount>::apply();
}
};
template <typename P, std::size_t DimensionCount>
struct dimension_checker<P, DimensionCount, DimensionCount>
{
static void apply() {}
};
public:
/// BCCL macro to apply the Point concept
BOOST_CONCEPT_USAGE(Point)
{
dimension_checker<Geometry, 0, ccount>::apply();
}
#endif
};
/*!
\brief point concept (const version).
\ingroup const_concepts
\details The ConstPoint concept apply the same as the Point concept,
but does not apply write access.
*/
template <typename Geometry>
class ConstPoint
{
#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
typedef typename coordinate_type<Geometry>::type ctype;
typedef typename coordinate_system<Geometry>::type csystem;
// The following enum is used to fully instantiate the coordinate
// system class; this is needed in order to check the units passed
// to it for non-Cartesian coordinate systems.
enum { cs_check = sizeof(csystem) };
enum { ccount = dimension<Geometry>::value };
template <typename P, std::size_t Dimension, std::size_t DimensionCount>
struct dimension_checker
{
static void apply()
{
const P* p = 0;
ctype coord(geometry::get<Dimension>(*p));
boost::ignore_unused(p, coord);
dimension_checker<P, Dimension+1, DimensionCount>::apply();
}
};
template <typename P, std::size_t DimensionCount>
struct dimension_checker<P, DimensionCount, DimensionCount>
{
static void apply() {}
};
public:
/// BCCL macro to apply the ConstPoint concept
BOOST_CONCEPT_USAGE(ConstPoint)
{
dimension_checker<Geometry, 0, ccount>::apply();
}
#endif
};
template <typename Geometry>
struct concept_type<Geometry, point_tag>
{
using type = Point<Geometry>;
};
template <typename Geometry>
struct concept_type<Geometry const, point_tag>
{
using type = ConstPoint<Geometry>;
};
}}} // namespace boost::geometry::concepts
#endif // BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_POINT_CONCEPT_HPP