diff options
author | vrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb> | 2018-01-16 15:31:14 +0000 |
---|---|---|
committer | vrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb> | 2018-01-16 15:31:14 +0000 |
commit | ec8912774ded7c4a9be5ab52969bea33786c5985 (patch) | |
tree | 5bb0593dc1cc2e2070f47109cd6c4aee6417c2c1 /src/common/include/gudhi | |
parent | b590611a71bd4be2fd7a92bc65666e9ba6355a2a (diff) | |
parent | 13e9c4ecc222efe0ffc3588eb8f559f7cd1d761d (diff) |
Merge of branch misc-glisse
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@3135 636b058d-ea47-450e-bf9e-a15bfbe3eedb
Former-commit-id: 7b678c4b6accf796920ca9582fa57e13f5f1f8cb
Diffstat (limited to 'src/common/include/gudhi')
-rw-r--r-- | src/common/include/gudhi/distance_functions.h | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h index c556155e..3a5d1fd5 100644 --- a/src/common/include/gudhi/distance_functions.h +++ b/src/common/include/gudhi/distance_functions.h @@ -23,6 +23,10 @@ #ifndef DISTANCE_FUNCTIONS_H_ #define DISTANCE_FUNCTIONS_H_ +#include <gudhi/Debug_utils.h> + +#include <boost/range/metafunctions.hpp> + #include <cmath> // for std::sqrt #include <type_traits> // for std::decay #include <iterator> // for std::begin, std::end @@ -38,20 +42,29 @@ namespace Gudhi { * have the same dimension. */ class Euclidean_distance { public: + // boost::range_value is not SFINAE-friendly so we cannot use it in the return type template< typename Point > - auto operator()(const Point& p1, const Point& p2) const -> typename std::decay<decltype(*std::begin(p1))>::type { - auto it1 = p1.begin(); - auto it2 = p2.begin(); - typename Point::value_type dist = 0.; - for (; it1 != p1.end(); ++it1, ++it2) { - typename Point::value_type tmp = (*it1) - (*it2); + typename std::iterator_traits<typename boost::range_iterator<Point>::type>::value_type + operator()(const Point& p1, const Point& p2) const { + auto it1 = std::begin(p1); + auto it2 = std::begin(p2); + typedef typename boost::range_value<Point>::type NT; + NT dist = 0; + for (; it1 != std::end(p1); ++it1, ++it2) { + GUDHI_CHECK(it2 != std::end(p2), "inconsistent point dimensions"); + NT tmp = *it1 - *it2; dist += tmp*tmp; } - return std::sqrt(dist); + GUDHI_CHECK(it2 == std::end(p2), "inconsistent point dimensions"); + using std::sqrt; + return sqrt(dist); } template< typename T > - T operator() (const std::pair< T, T >& f, const std::pair< T, T >& s) { - return sqrt((f.first-s.first)*(f.first-s.first) + (f.second-s.second)*(f.second-s.second)); + T operator() (const std::pair< T, T >& f, const std::pair< T, T >& s) const { + T dx = f.first - s.first; + T dy = f.second - s.second; + using std::sqrt; + return sqrt(dx*dx + dy*dy); } }; |