Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r76881 - in trunk/boost/geometry: strategies/cartesian util
From: barend.gehrels_at_[hidden]
Date: 2012-02-04 10:14:34


Author: barendgehrels
Date: 2012-02-04 10:14:33 EST (Sat, 04 Feb 2012)
New Revision: 76881
URL: http://svn.boost.org/trac/boost/changeset/76881

Log:
Fixed distance of large integers
Added:
   trunk/boost/geometry/util/calculation_type.hpp (contents, props changed)
Text files modified:
   trunk/boost/geometry/strategies/cartesian/distance_pythagoras.hpp | 18 +++++++++++-------
   1 files changed, 11 insertions(+), 7 deletions(-)

Modified: trunk/boost/geometry/strategies/cartesian/distance_pythagoras.hpp
==============================================================================
--- trunk/boost/geometry/strategies/cartesian/distance_pythagoras.hpp (original)
+++ trunk/boost/geometry/strategies/cartesian/distance_pythagoras.hpp 2012-02-04 10:14:33 EST (Sat, 04 Feb 2012)
@@ -22,8 +22,7 @@
 
 #include <boost/geometry/strategies/distance.hpp>
 
-#include <boost/geometry/util/select_calculation_type.hpp>
-#include <boost/geometry/util/promote_floating_point.hpp>
+#include <boost/geometry/util/calculation_type.hpp>
 
 
 
@@ -82,7 +81,8 @@
 class pythagoras
 {
 public :
- typedef typename select_calculation_type
+
+ typedef typename util::calculation_type::geometric::binary
             <
                 Point1,
                 Point2,
@@ -136,10 +136,14 @@
 {
     typedef comparable::pythagoras<Point1, Point2, CalculationType> comparable_type;
 public :
- typedef typename promote_floating_point
- <
- typename services::return_type<comparable_type>::type
- >::type calculation_type;
+ typedef typename util::calculation_type::geometric::binary
+ <
+ Point1,
+ Point2,
+ CalculationType,
+ double,
+ double // promote integer to double
+ >::type calculation_type;
 
     /*!
     \brief applies the distance calculation using pythagoras

Added: trunk/boost/geometry/util/calculation_type.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/geometry/util/calculation_type.hpp 2012-02-04 10:14:33 EST (Sat, 04 Feb 2012)
@@ -0,0 +1,176 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2012 Bruno Lalande, Paris, France.
+// Copyright (c) 2012 Mateusz Loskot, London, UK.
+
+// 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_UTIL_CALCULATION_TYPE_HPP
+#define BOOST_GEOMETRY_UTIL_CALCULATION_TYPE_HPP
+
+#include <boost/config.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits.hpp>
+
+#include <boost/geometry/util/select_coordinate_type.hpp>
+#include <boost/geometry/util/select_most_precise.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace util
+{
+
+namespace detail
+{
+
+struct default_integral
+{
+#ifdef BOOST_HAS_LONG_LONG
+ typedef boost::long_long_type type;
+#else
+ typedef int type;
+#endif
+};
+
+/*!
+\details Selects the most appropriate:
+ - if calculation type is specified (not void), that one is used
+ - else if type is non-fundamental (user defined e.g. ttmath), that one
+ - else if type is floating point, the specified default FP is used
+ - else it is integral and the specified default integral is used
+ */
+template
+<
+ typename Type,
+ typename CalculationType,
+ typename DefaultFloatingPointCalculationType,
+ typename DefaultIntegralCalculationType
+>
+struct calculation_type
+{
+ BOOST_STATIC_ASSERT((
+ boost::is_fundamental
+ <
+ DefaultFloatingPointCalculationType
+ >::type::value
+ ));
+ BOOST_STATIC_ASSERT((
+ boost::is_fundamental
+ <
+ DefaultIntegralCalculationType
+ >::type::value
+ ));
+
+
+ typedef typename boost::mpl::if_
+ <
+ boost::is_void<CalculationType>,
+ typename boost::mpl::if_
+ <
+ boost::is_floating_point<Type>,
+ typename select_most_precise
+ <
+ DefaultFloatingPointCalculationType,
+ Type
+ >::type,
+ typename select_most_precise
+ <
+ DefaultIntegralCalculationType,
+ Type
+ >::type
+ >::type,
+ CalculationType
+ >::type type;
+};
+
+} // namespace detail
+
+
+namespace calculation_type
+{
+
+namespace geometric
+{
+
+template
+<
+ typename Geometry,
+ typename CalculationType,
+ typename DefaultFloatingPointCalculationType = double,
+ typename DefaultIntegralCalculationType = detail::default_integral::type
+>
+struct unary
+{
+ typedef typename detail::calculation_type
+ <
+ typename geometry::coordinate_type<Geometry>::type,
+ CalculationType,
+ DefaultFloatingPointCalculationType,
+ DefaultIntegralCalculationType
+ >::type type;
+};
+
+template
+<
+ typename Geometry1,
+ typename Geometry2,
+ typename CalculationType,
+ typename DefaultFloatingPointCalculationType = double,
+ typename DefaultIntegralCalculationType = detail::default_integral::type
+>
+struct binary
+{
+ typedef typename detail::calculation_type
+ <
+ typename select_coordinate_type<Geometry1, Geometry2>::type,
+ CalculationType,
+ DefaultFloatingPointCalculationType,
+ DefaultIntegralCalculationType
+ >::type type;
+};
+
+
+/*!
+\brief calculation type (ternary, for three geometry types)
+ */
+template
+<
+ typename Geometry1,
+ typename Geometry2,
+ typename Geometry3,
+ typename CalculationType,
+ typename DefaultFloatingPointCalculationType = double,
+ typename DefaultIntegralCalculationType = detail::default_integral::type
+>
+struct ternary
+{
+ typedef typename detail::calculation_type
+ <
+ typename select_most_precise
+ <
+ typename coordinate_type<Geometry1>::type,
+ typename select_coordinate_type
+ <
+ Geometry2,
+ Geometry3
+ >::type
+ >::type,
+ CalculationType,
+ DefaultFloatingPointCalculationType,
+ DefaultIntegralCalculationType
+ >::type type;
+};
+
+}} // namespace calculation_type::geometric
+
+} // namespace util
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_UTIL_CALCULATION_TYPE_HPP


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk