yat/statistics/Distance.h

Code
Comments
Other
Rev Date Author Line
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 4 // $Id$
3532 16 Nov 16 peter 5
3532 16 Nov 16 peter 6 /*
3532 16 Nov 16 peter 7   Copyright (C) 2016 Peter Johansson
3532 16 Nov 16 peter 8
3532 16 Nov 16 peter 9   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 11   The yat library is free software; you can redistribute it and/or
3532 16 Nov 16 peter 12   modify it under the terms of the GNU General Public License as
3532 16 Nov 16 peter 13   published by the Free Software Foundation; either version 3 of the
3532 16 Nov 16 peter 14   License, or (at your option) any later version.
3532 16 Nov 16 peter 15
3532 16 Nov 16 peter 16   The yat library is distributed in the hope that it will be useful,
3532 16 Nov 16 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
3532 16 Nov 16 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3532 16 Nov 16 peter 19   General Public License for more details.
3532 16 Nov 16 peter 20
3532 16 Nov 16 peter 21   You should have received a copy of the GNU General Public License
3532 16 Nov 16 peter 22   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 34      \brief A convenience class to implement \ref concept_distance
3532 16 Nov 16 peter 35
3532 16 Nov 16 peter 36      This class provides a convenient way to implement a \ref
3532 16 Nov 16 peter 37      concept_distance. The Derived class should implement two private
3532 16 Nov 16 peter 38      functions derived as shown in example below:
3532 16 Nov 16 peter 39
3532 16 Nov 16 peter 40      \code
3532 16 Nov 16 peter 41      class Derived : public Distance<Derived>
3532 16 Nov 16 peter 42      {
3535 22 Dec 16 peter 43      private:
3535 22 Dec 16 peter 44        template <typename Iterator1, typename Iterator2>
3532 16 Nov 16 peter 45        double distance (Iterator1 beg1, Iterator1 end1, Iterator2 beg2,
3532 16 Nov 16 peter 46                         utility::unweighted_iterator_tag) const
3532 16 Nov 16 peter 47        { ... }
3532 16 Nov 16 peter 48
3532 16 Nov 16 peter 49        template <typename Iterator1, typename Iterator2>
3532 16 Nov 16 peter 50        double distance (Iterator1 beg1, Iterator1 end1, Iterator2 beg2,
3532 16 Nov 16 peter 51                         utility::weighted_iterator_tag) const
3532 16 Nov 16 peter 52        { ... }
3532 16 Nov 16 peter 53      };
3532 16 Nov 16 peter 54      \endcode
3532 16 Nov 16 peter 55
3532 16 Nov 16 peter 56      To fulfill \ref concept_distance these functions should do no
3532 16 Nov 16 peter 57      more assumtions than that the \c Iterator1 and \c Iterator fulfill
3532 16 Nov 16 peter 58
3532 16 Nov 16 peter 59      Requirements:
3532 16 Nov 16 peter 60      - \c Iterator is \ref concept_data_iterator
3532 16 Nov 16 peter 61      - \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 69        Function determines ranges are weighted or unweighted and calls
3532 16 Nov 16 peter 70        the appropriate function in \c Derived.
3532 16 Nov 16 peter 71
3532 16 Nov 16 peter 72        If both ranges are unweighted
3532 16 Nov 16 peter 73        function
3532 16 Nov 16 peter 74        \code
3532 16 Nov 16 peter 75        Derived::distance(beg1, end1, beg2, utility::unweighted_iterator_tag)
3532 16 Nov 16 peter 76        \endcode
3532 16 Nov 16 peter 77        and otherwise function
3532 16 Nov 16 peter 78        \code
3532 16 Nov 16 peter 79        Derived::distance(beg1, end1, beg2, utility::weighted_iterator_tag)
3532 16 Nov 16 peter 80        \endcode
3532 16 Nov 16 peter 81        is called
3540 23 Dec 16 peter 82
3540 23 Dec 16 peter 83        Type Requirements:
3540 23 Dec 16 peter 84        - \c Iterator1 is a \ref concept_data_iterator
3540 23 Dec 16 peter 85        - \c Iterator1 is a \forward_traversal_iterator
3540 23 Dec 16 peter 86        - \c Iterator2 is a \ref concept_data_iterator
3540 23 Dec 16 peter 87        - \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