1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
#include <iostream>
#include <dune/common/hybridutilities.hh>
#include <dune/common/indices.hh>
#include <dune/common/math.hh>
#include <dune/common/test/testsuite.hh>
#include <dune/common/math.hh>
using namespace Dune::Hybrid;
using namespace Dune::Indices;
using Dune::TestSuite;
template<class T, T n>
constexpr inline static auto next(std::integral_constant<T, n>)
-> std::integral_constant<T, n+1>
{
return {};
}
template<class T, T k>
auto testStaticFactorial (std::integral_constant<T, k> _k = {}) -> TestSuite
{
TestSuite t;
std::cout << "test factorial\n{";
forEach(integralRange(_k), [&](auto _i) {
const auto value = Dune::factorial(_i);
const auto control = _i() == 0 ? 1 : _i() * Dune::factorial(_i() - 1);
t.check( value() == control );
std::cout<< ' ' << value() << ',';
});
std::cout << "};\n\n";
return t;
}
template<class T, T k>
auto testStaticBinomial (std::integral_constant<T, k> _k = {}) -> TestSuite
{
TestSuite t;
std::cout << "test binomial\n";
forEach(integralRange(_k), [&](auto _i) {
std::cout << "{";
forEach(integralRange(next(_i)), [&](auto _j) {
const auto value = Dune::binomial(_i, _j);
const auto control = Dune::factorial(_i) / ( Dune::factorial(_j) * Dune::factorial(_i() - _j()) );
t.check( value() == control );
std::cout<< ' ' << value() << ',';
});
std::cout << "};\n";
});
std::cout << "\n";
return t;
}
int main(int argc, char** argv)
{
TestSuite t;
t.subTest(testStaticFactorial(_5));
t.subTest(testStaticBinomial(_5));
return t.exit();
}
|