3532 |
16 Nov 16 |
peter |
1 |
#ifndef theplu_yat_statistics_distance_h |
3532 |
16 Nov 16 |
peter |
2 |
#define theplu_yat_statistics_distance_h |
3532 |
16 Nov 16 |
peter |
3 |
|
3532 |
16 Nov 16 |
peter |
// $Id$ |
3532 |
16 Nov 16 |
peter |
5 |
|
3532 |
16 Nov 16 |
peter |
6 |
/* |
3532 |
16 Nov 16 |
peter |
Copyright (C) 2016 Peter Johansson |
3532 |
16 Nov 16 |
peter |
8 |
|
3532 |
16 Nov 16 |
peter |
This file is part of the yat library, http://dev.thep.lu.se/yat |
3532 |
16 Nov 16 |
peter |
10 |
|
3532 |
16 Nov 16 |
peter |
The yat library is free software; you can redistribute it and/or |
3532 |
16 Nov 16 |
peter |
modify it under the terms of the GNU General Public License as |
3532 |
16 Nov 16 |
peter |
published by the Free Software Foundation; either version 3 of the |
3532 |
16 Nov 16 |
peter |
License, or (at your option) any later version. |
3532 |
16 Nov 16 |
peter |
15 |
|
3532 |
16 Nov 16 |
peter |
The yat library is distributed in the hope that it will be useful, |
3532 |
16 Nov 16 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
3532 |
16 Nov 16 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3532 |
16 Nov 16 |
peter |
General Public License for more details. |
3532 |
16 Nov 16 |
peter |
20 |
|
3532 |
16 Nov 16 |
peter |
You should have received a copy of the GNU General Public License |
3532 |
16 Nov 16 |
peter |
along with yat. If not, see <http://www.gnu.org/licenses/>. |
3532 |
16 Nov 16 |
peter |
23 |
*/ |
3532 |
16 Nov 16 |
peter |
24 |
|
3532 |
16 Nov 16 |
peter |
25 |
#include "yat/utility/iterator_traits.h" |
3532 |
16 Nov 16 |
peter |
26 |
|
3532 |
16 Nov 16 |
peter |
27 |
#include <boost/concept_check.hpp> |
3532 |
16 Nov 16 |
peter |
28 |
|
3532 |
16 Nov 16 |
peter |
29 |
namespace theplu { |
3532 |
16 Nov 16 |
peter |
30 |
namespace yat { |
3532 |
16 Nov 16 |
peter |
31 |
namespace statistics { |
3532 |
16 Nov 16 |
peter |
32 |
|
3532 |
16 Nov 16 |
peter |
33 |
/** |
3532 |
16 Nov 16 |
peter |
\brief A convenience class to implement \ref concept_distance |
3532 |
16 Nov 16 |
peter |
35 |
|
3532 |
16 Nov 16 |
peter |
This class provides a convenient way to implement a \ref |
3532 |
16 Nov 16 |
peter |
concept_distance. The Derived class should implement two private |
3532 |
16 Nov 16 |
peter |
functions derived as shown in example below: |
3532 |
16 Nov 16 |
peter |
39 |
|
3532 |
16 Nov 16 |
peter |
\code |
3532 |
16 Nov 16 |
peter |
class Derived : public Distance<Derived> |
3532 |
16 Nov 16 |
peter |
42 |
{ |
3535 |
22 Dec 16 |
peter |
private: |
3535 |
22 Dec 16 |
peter |
template <typename Iterator1, typename Iterator2> |
3532 |
16 Nov 16 |
peter |
double distance (Iterator1 beg1, Iterator1 end1, Iterator2 beg2, |
3532 |
16 Nov 16 |
peter |
utility::unweighted_iterator_tag) const |
3532 |
16 Nov 16 |
peter |
47 |
{ ... } |
3532 |
16 Nov 16 |
peter |
48 |
|
3532 |
16 Nov 16 |
peter |
template <typename Iterator1, typename Iterator2> |
3532 |
16 Nov 16 |
peter |
double distance (Iterator1 beg1, Iterator1 end1, Iterator2 beg2, |
3532 |
16 Nov 16 |
peter |
utility::weighted_iterator_tag) const |
3532 |
16 Nov 16 |
peter |
52 |
{ ... } |
3532 |
16 Nov 16 |
peter |
53 |
}; |
3532 |
16 Nov 16 |
peter |
\endcode |
3532 |
16 Nov 16 |
peter |
55 |
|
3532 |
16 Nov 16 |
peter |
To fulfill \ref concept_distance these functions should do no |
3532 |
16 Nov 16 |
peter |
more assumtions than that the \c Iterator1 and \c Iterator fulfill |
3532 |
16 Nov 16 |
peter |
58 |
|
3532 |
16 Nov 16 |
peter |
Requirements: |
3532 |
16 Nov 16 |
peter |
- \c Iterator is \ref concept_data_iterator |
3532 |
16 Nov 16 |
peter |
- \c Iterator is \forward_traversal_iterator |
3532 |
16 Nov 16 |
peter |
62 |
|
3532 |
16 Nov 16 |
peter |
63 |
*/ |
3532 |
16 Nov 16 |
peter |
64 |
template<class Derived> |
3532 |
16 Nov 16 |
peter |
65 |
class Distance |
3532 |
16 Nov 16 |
peter |
66 |
{ |
3532 |
16 Nov 16 |
peter |
67 |
public: |
3532 |
16 Nov 16 |
peter |
68 |
/** |
3532 |
16 Nov 16 |
peter |
Function determines ranges are weighted or unweighted and calls |
3532 |
16 Nov 16 |
peter |
the appropriate function in \c Derived. |
3532 |
16 Nov 16 |
peter |
71 |
|
3532 |
16 Nov 16 |
peter |
If both ranges are unweighted |
3532 |
16 Nov 16 |
peter |
function |
3532 |
16 Nov 16 |
peter |
\code |
3532 |
16 Nov 16 |
peter |
Derived::distance(beg1, end1, beg2, utility::unweighted_iterator_tag) |
3532 |
16 Nov 16 |
peter |
\endcode |
3532 |
16 Nov 16 |
peter |
and otherwise function |
3532 |
16 Nov 16 |
peter |
\code |
3532 |
16 Nov 16 |
peter |
Derived::distance(beg1, end1, beg2, utility::weighted_iterator_tag) |
3532 |
16 Nov 16 |
peter |
\endcode |
3532 |
16 Nov 16 |
peter |
is called |
3540 |
23 Dec 16 |
peter |
82 |
|
3540 |
23 Dec 16 |
peter |
Type Requirements: |
3540 |
23 Dec 16 |
peter |
- \c Iterator1 is a \ref concept_data_iterator |
3540 |
23 Dec 16 |
peter |
- \c Iterator1 is a \forward_traversal_iterator |
3540 |
23 Dec 16 |
peter |
- \c Iterator2 is a \ref concept_data_iterator |
3540 |
23 Dec 16 |
peter |
- \c Iterator2 is a \forward_traversal_iterator |
3532 |
16 Nov 16 |
peter |
88 |
*/ |
3532 |
16 Nov 16 |
peter |
89 |
template <typename Iterator1, typename Iterator2> |
3532 |
16 Nov 16 |
peter |
90 |
double operator()(Iterator1 beg1, Iterator1 end1, Iterator2 beg2) const |
3532 |
16 Nov 16 |
peter |
91 |
{ |
3532 |
16 Nov 16 |
peter |
92 |
using utility::weighted_if_any2; |
3532 |
16 Nov 16 |
peter |
93 |
typename weighted_if_any2<Iterator1, Iterator2>::type tag; |
3532 |
16 Nov 16 |
peter |
94 |
return static_cast<const Derived*>(this)->distance(beg1, end1, beg2, tag); |
3532 |
16 Nov 16 |
peter |
95 |
} |
3532 |
16 Nov 16 |
peter |
96 |
}; |
3532 |
16 Nov 16 |
peter |
97 |
|
3532 |
16 Nov 16 |
peter |
98 |
}}} // of namespace statistics, yat, and theplu |
3532 |
16 Nov 16 |
peter |
99 |
|
3532 |
16 Nov 16 |
peter |
100 |
#endif |