yat/statistics/averager_traits.h

Code
Comments
Other
Rev Date Author Line
1305 14 May 08 peter 1 #ifndef _theplu_yat_utility_averager_traits_
1305 14 May 08 peter 2 #define _theplu_yat_utility_averager_traits_
1305 14 May 08 peter 3
1305 14 May 08 peter 4 // $Id$
1305 14 May 08 peter 5
1305 14 May 08 peter 6 /*
2119 12 Dec 09 peter 7   Copyright (C) 2008 Jari Häkkinen, Peter Johansson
1305 14 May 08 peter 8
1469 02 Sep 08 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
1305 14 May 08 peter 10
1305 14 May 08 peter 11   The yat library is free software; you can redistribute it and/or
1305 14 May 08 peter 12   modify it under the terms of the GNU General Public License as
1486 09 Sep 08 jari 13   published by the Free Software Foundation; either version 3 of the
1305 14 May 08 peter 14   License, or (at your option) any later version.
1305 14 May 08 peter 15
1305 14 May 08 peter 16   The yat library is distributed in the hope that it will be useful,
1305 14 May 08 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
1305 14 May 08 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1305 14 May 08 peter 19   General Public License for more details.
1305 14 May 08 peter 20
1305 14 May 08 peter 21   You should have received a copy of the GNU General Public License
1487 10 Sep 08 jari 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
1305 14 May 08 peter 23 */
1305 14 May 08 peter 24
1305 14 May 08 peter 25 #include "Averager.h"
1305 14 May 08 peter 26 #include "AveragerWeighted.h"
1306 14 May 08 peter 27 #include "AveragerPair.h"
1306 14 May 08 peter 28 #include "AveragerPairWeighted.h"
1306 14 May 08 peter 29 #include "yat/utility/iterator_traits.h"
1305 14 May 08 peter 30
1305 14 May 08 peter 31 namespace theplu {
1305 14 May 08 peter 32 namespace yat {
1305 14 May 08 peter 33 namespace statistics {
1305 14 May 08 peter 34
1305 14 May 08 peter 35   /**
1305 14 May 08 peter 36      MetaFunction returning weighted or unweighted Averager.
1305 14 May 08 peter 37    */
1305 14 May 08 peter 38   template <typename T>
1305 14 May 08 peter 39   struct averager_traits{};
1305 14 May 08 peter 40
1305 14 May 08 peter 41   /**
1305 14 May 08 peter 42      Specialization for unweighted_tag return (unweighted) Averager
1305 14 May 08 peter 43   */
1305 14 May 08 peter 44   template <>
3524 11 Oct 16 peter 45   struct averager_traits<utility::unweighted_iterator_tag>
1305 14 May 08 peter 46   {
3524 11 Oct 16 peter 47     /**
1308 15 May 08 peter 48         Metafunction returning Averager
1308 15 May 08 peter 49     */
1305 14 May 08 peter 50     typedef Averager type;
3524 11 Oct 16 peter 51     /**
1308 15 May 08 peter 52         Metafunction returning AveragerPair
1308 15 May 08 peter 53     */
1306 14 May 08 peter 54     typedef AveragerPair pair_type;
1305 14 May 08 peter 55   };
1305 14 May 08 peter 56
3524 11 Oct 16 peter 57   /**
1305 14 May 08 peter 58      Specialization for weighted_tag return AveragerWeighted
1305 14 May 08 peter 59   */
1305 14 May 08 peter 60   template <>
3524 11 Oct 16 peter 61   struct averager_traits<utility::weighted_iterator_tag>
1305 14 May 08 peter 62   {
1308 15 May 08 peter 63     /**
1308 15 May 08 peter 64        Metafunction returning AveragerWeighted
1308 15 May 08 peter 65      */
1305 14 May 08 peter 66     typedef AveragerWeighted type;
1308 15 May 08 peter 67     /**
1308 15 May 08 peter 68        Metafunction returning AveragerPairWeighted
1308 15 May 08 peter 69     */
1306 14 May 08 peter 70     typedef AveragerPairWeighted pair_type;
1305 14 May 08 peter 71   };
1305 14 May 08 peter 72
3524 11 Oct 16 peter 73   /**
1306 14 May 08 peter 74       Convenience wrapper around averager_traits
1305 14 May 08 peter 75       \see weighted_iterator_traits                                          \
1305 14 May 08 peter 76   */
1305 14 May 08 peter 77   template <typename Iterator>
3524 11 Oct 16 peter 78   struct averager
1305 14 May 08 peter 79   {
3524 11 Oct 16 peter 80   /**
1305 14 May 08 peter 81       Convenience Metafunction taking iterator as argument and return
1305 14 May 08 peter 82       either Averager (if iterator is unweighted) or AveragerWeighted
1305 14 May 08 peter 83       (if iterator is unweighted)
1305 14 May 08 peter 84   */
1305 14 May 08 peter 85     typedef typename averager_traits<typename utility::weighted_iterator_traits<Iterator>::type>::type type;
1305 14 May 08 peter 86   };
1305 14 May 08 peter 87
3524 11 Oct 16 peter 88   /**
1306 14 May 08 peter 89       Convenience wrapper around averager_traits
1306 14 May 08 peter 90       \see weighted_iterator_traits                                          \
1306 14 May 08 peter 91   */
1306 14 May 08 peter 92   template <typename Iterator1, typename Iterator2>
3524 11 Oct 16 peter 93   struct averager_pair
1306 14 May 08 peter 94   {
3524 11 Oct 16 peter 95   /**
1308 15 May 08 peter 96       Convenience Metafunction taking two iterators as argument and
1308 15 May 08 peter 97       return either AveragerPair (if both iterators are unweighted) or
1308 15 May 08 peter 98       AveragerPairWeighted otherwise.
1306 14 May 08 peter 99   */
3524 11 Oct 16 peter 100     typedef typename
1306 14 May 08 peter 101       averager_traits<
1306 14 May 08 peter 102         typename utility::weighted_if_any2<Iterator1, Iterator2>::type
1306 14 May 08 peter 103       >::pair_type type;
1306 14 May 08 peter 104   };
1306 14 May 08 peter 105
1305 14 May 08 peter 106 }}} // of namespace statistics, yat, and theplu
1305 14 May 08 peter 107
1305 14 May 08 peter 108 #endif