From faa44b24ef1e641121e951647bebc663423daf5b Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Mon, 14 May 2012 16:11:09 +1000 Subject: [PATCH] Add simple stat accumulator class --- Makefile.am | 2 ++ stats.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++ stats.hpp | 48 +++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 stats.cpp create mode 100644 stats.hpp diff --git a/Makefile.am b/Makefile.am index 38bd7315..91b82719 100644 --- a/Makefile.am +++ b/Makefile.am @@ -82,6 +82,8 @@ UTIL_FILES = \ signal.cpp \ signal.hpp \ si.hpp \ + stats.cpp \ + stats.hpp \ stream.cpp \ stream.hpp \ string.cpp \ diff --git a/stats.cpp b/stats.cpp new file mode 100644 index 00000000..c32b2dee --- /dev/null +++ b/stats.cpp @@ -0,0 +1,69 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2010 Danny Robson + */ + +#include "stats.hpp" + +#include +#include + + +template +util::stats::accumulator::accumulator (): + min (std::numeric_limits::max ()), + max (std::numeric_limits::min ()) +{ ; } + + +template +void +util::stats::accumulator::add (T val) { + min = std::min (val, min); + max = std::max (val, max); +} + + +template +void +util::stats::accumulator::add (const accumulator &rhs) { + min = std::min (rhs.min, min); + max = std::max (rhs.max, max); +} + + +template +T +util::stats::accumulator::range (void) const + { return max - min; } + + +template struct util::stats::accumulator; +template struct util::stats::accumulator; + + +template +std::ostream& +util::stats::operator<< (std::ostream &os, const accumulator &rhs) { + os << "(min: " << rhs.min << ", max: " << rhs.max << ")"; + return os; +} + + +template std::ostream& util::stats::operator<< (std::ostream&, const accumulator &); +template std::ostream& util::stats::operator<< (std::ostream&, const accumulator &); + diff --git a/stats.hpp b/stats.hpp new file mode 100644 index 00000000..57a93c0e --- /dev/null +++ b/stats.hpp @@ -0,0 +1,48 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2010 Danny Robson + */ + +#ifndef __UTIL_STATS_HPP +#define __UTIL_STATS_HPP + +#include + + +namespace util { + namespace stats { + // Undefined until at least one value has been added. + + template + struct accumulator { + accumulator (); + + void add (T); + void add (const accumulator &); + + T min; + T max; + + T range (void) const; + }; + + template + std::ostream& operator<< (std::ostream&, const accumulator&); + } +} + +#endif