From 6de198b9c6d4cee1a5fa1774b78cdee3f72e3469 Mon Sep 17 00:00:00 2001 From: Tomasz Golinski Date: Wed, 13 Jul 2022 18:56:48 +0200 Subject: [PATCH] Templates for common functions like average or sum --- common.cpp | 66 +++++++++++++++++++----------------------------------- common.h | 16 ++++--------- 2 files changed, 27 insertions(+), 55 deletions(-) diff --git a/common.cpp b/common.cpp index 32efeaa..8962b20 100644 --- a/common.cpp +++ b/common.cpp @@ -264,63 +264,43 @@ uint get_num(char c, char* opt) { } } -void average_html(const Caches& cc, float Cache::*ptr, const std::string& caption) { +template void average_html(const Caches& cc, float Cache::*ptr, const std::string& caption); +template void average_html(const Caches& cc, uint Cache::*ptr, const std::string& caption); +template void average_html(const Caches& cc, int Cache::*ptr, const std::string& caption); + +template +void average_html(const Caches& cc, T Cache::*ptr, const std::string& caption) { std::cout << "
\n"; std::cout << "Average " << caption << ": " << average(cc, ptr) << "
\n"; std::cout << "
\n"; } -void average_html(const Caches& cc, int Cache::*ptr, const std::string& caption) { - std::cout << "
\n"; - std::cout << "Average " << caption << ": " << average(cc, ptr) << "
\n"; - std::cout << "
\n"; +template float average(const Caches& cc, float Cache::*ptr); +template float average(const Caches& cc, int Cache::*ptr); +template float average(const Caches& cc, uint Cache::*ptr); + +template +float average(const Caches& cc, T Cache::*ptr) { + return 1.0 * std::accumulate(cc.begin(), cc.end(), 0., [&](const float& a, const Cache& b) { return std::move(a) + b.*ptr; }) / cc.size(); } -void average_html(const Caches& cc, uint Cache::*ptr, const std::string& caption) { - std::cout << "
\n"; - std::cout << "Average " << caption << ": " << average(cc, ptr) << "
\n"; - std::cout << "
\n"; -} +template void sum_html(const Caches& cc, float Cache::*ptr, const std::string& caption); +template void sum_html(const Caches& cc, int Cache::*ptr, const std::string& caption); +template void sum_html(const Caches& cc, uint Cache::*ptr, const std::string& caption); -float average(const Caches& cc, float Cache::*ptr) { - return std::accumulate(cc.begin(), cc.end(), 0., [&](const float& a, const Cache& b) { return std::move(a) + b.*ptr; }) / cc.size(); -} - -float average(const Caches& cc, int Cache::*ptr) { - return 1.0 * std::accumulate(cc.begin(), cc.end(), 0, [&](const float& a, const Cache& b) { return std::move(a) + b.*ptr; }) / cc.size(); -} - -float average(const Caches& cc, uint Cache::*ptr) { - return 1.0 * std::accumulate(cc.begin(), cc.end(), 0, [&](const float& a, const Cache& b) { return std::move(a) + b.*ptr; }) / cc.size(); -} - -void sum_html(const Caches& cc, float Cache::*ptr, const std::string& caption) { +template +void sum_html(const Caches& cc, T Cache::*ptr, const std::string& caption) { std::cout << "
\n"; std::cout << "Total " << caption << ": " << sum(cc, ptr) << "
\n"; std::cout << "
\n"; } -void sum_html(const Caches& cc, int Cache::*ptr, const std::string& caption) { - std::cout << "
\n"; - std::cout << "Total " << caption << ": " << sum(cc, ptr) << "
\n"; - std::cout << "
\n"; -} +template float sum(const Caches& cc, float Cache::*ptr); +template int sum(const Caches& cc, int Cache::*ptr); +template uint sum(const Caches& cc, uint Cache::*ptr); -void sum_html(const Caches& cc, uint Cache::*ptr, const std::string& caption) { - std::cout << "
\n"; - std::cout << "Total " << caption << ": " << sum(cc, ptr) << "
\n"; - std::cout << "
\n"; -} - -float sum(const Caches& cc, float Cache::*ptr) { - return std::accumulate(cc.begin(), cc.end(), 0., [&](const float& a, const Cache& b) { return std::move(a) + b.*ptr; }); -} - -int sum(const Caches& cc, int Cache::*ptr) { - return std::accumulate(cc.begin(), cc.end(), 0, [&](const int& a, const Cache& b) { return std::move(a) + b.*ptr; }); -} - -int sum(const Caches& cc, uint Cache::*ptr) { +template +T sum(const Caches& cc, T Cache::*ptr) { return std::accumulate(cc.begin(), cc.end(), 0, [&](const int& a, const Cache& b) { return std::move(a) + b.*ptr; }); } diff --git a/common.h b/common.h index 9cbc98b..38ed137 100644 --- a/common.h +++ b/common.h @@ -17,19 +17,11 @@ uint find_streak(const Date_Caches& cc, std::time_t& start); uint get_num(char c, char* opt); -void average_html(const Caches& cc, float Cache::*ptr, const std::string& caption); -void average_html(const Caches& cc, int Cache::*ptr, const std::string& caption); -void average_html(const Caches& cc, uint Cache::*ptr, const std::string& caption); -float average(const Caches& cc, float Cache::*ptr); -float average(const Caches& cc, int Cache::*ptr); -float average(const Caches& cc, uint Cache::*ptr); +template void average_html(const Caches& cc, T Cache::*ptr, const std::string& caption); +template float average(const Caches& cc, T Cache::*ptr); -void sum_html(const Caches& cc, float Cache::*ptr, const std::string& caption); -void sum_html(const Caches& cc, int Cache::*ptr, const std::string& caption); -void sum_html(const Caches& cc, uint Cache::*ptr, const std::string& caption); -float sum(const Caches& cc, float Cache::*ptr); -int sum(const Caches& cc, int Cache::*ptr); -int sum(const Caches& cc, uint Cache::*ptr); +template void sum_html(const Caches& cc, T Cache::*ptr, const std::string& caption); +template T sum(const Caches& cc, T Cache::*ptr); int count_caches(const Caches& cc, std::string& codes, std::function test);