From e8ef97ac2d129d5132cd3ff5240306487bfb2a51 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Tue, 29 Nov 2022 13:31:43 +0200 Subject: Update C++ with templates --- gcd.cpp | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/gcd.cpp b/gcd.cpp index 15fc4e9..e1d363a 100644 --- a/gcd.cpp +++ b/gcd.cpp @@ -27,17 +27,14 @@ #include typedef mpz_class Number; #else -typedef unsigned int Number; +typedef unsigned long Number; #endif -using namespace std; +using std::vector; -typedef vector Numbers; - -Number gcd(Number a, Number b) { - Number c; +template N gcd2(N a, N b) { while (b != 0) { - c = b; + N c = b; b = a % b; a = c; } @@ -45,38 +42,35 @@ Number gcd(Number a, Number b) { } #if __cplusplus >= 201703L -class GCD { +template class GCD { public: - Number operator()(Number a, Number b) const { return gcd(a, b); }; -} GCD; + N operator()(N a, N b) const { return gcd2(a, b); }; +}; -Number gcd(const Numbers &ns) { - return reduce(execution::par, begin(ns), end(ns), Number(0), GCD); +template N gcd(const vector &ns) { + GCD GCD; + return reduce(std::execution::par, begin(ns), end(ns), N(0), GCD); } #else -Number gcd(const Numbers &ns) { - Number r = 0; - for (Numbers::const_iterator n = ns.begin(); n != ns.end(); ++n) - r = gcd(*n, r); +template N gcd(const vector &ns) { + N r = 0; + for (typename vector::const_iterator n = ns.begin(); n != ns.end(); ++n) + r = gcd2(*n, r); return r; } #endif int main(int argc, char *argv[]) { if (argc > 1) { - Numbers ns(argc - 1); + vector ns(argc - 1); for (int n = 1; n < argc; ++n) { - stringstream str; + std::stringstream str; str << argv[n]; str >> ns[n - 1]; - /* NOTE: - * For GMP we can just assign: ns[n-1] = argv[n], - * and sstream is not needed. - */ } - cout << gcd(ns) << endl; + std::cout << gcd(ns) << std::endl; } return EXIT_SUCCESS; } -- cgit v1.2.3