diff --git a/src/amdis/common/CMakeLists.txt b/src/amdis/common/CMakeLists.txt index 89f2d370f56993ad5dc3eb2d6d9541797220dd09..f7759eb963cbf4032255e5e409d4e1073d9e7bb5 100644 --- a/src/amdis/common/CMakeLists.txt +++ b/src/amdis/common/CMakeLists.txt @@ -25,6 +25,7 @@ install(FILES Resize.hpp StaticSize.hpp String.hpp + SwitchCases.hpp Tags.hpp Transposed.hpp TupleUtility.hpp diff --git a/src/amdis/common/SwitchCases.hpp b/src/amdis/common/SwitchCases.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f17d31b82542532a4182e4747d2ebe6f539c1d1c --- /dev/null +++ b/src/amdis/common/SwitchCases.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include <cassert> + +#include <dune/common/hybridutilities.hh> +#include <dune/common/rangeutilities.hh> + +namespace AMDiS +{ + template <class T, T to, T from, class Value, class Then, class Else> + constexpr decltype(auto) switchCases(const Dune::StaticIntegralRange<T,to,from>& cases, const Value& value, + Then&& thenBranch, Else&& elseBranch) + { + using integer_sequence = typename Dune::StaticIntegralRange<T,to,from>::integer_sequence; + return Dune::Hybrid::switchCases(integer_sequence{}, value, FWD(thenBranch), FWD(elseBranch)); + } + + template <class T, class Value, class Then, class Else> + constexpr decltype(auto) switchCases(const Dune::IntegralRange<T>& cases, const Value& value, + Then&& thenBranch, Else&& elseBranch) + { + if (value >= cases[0] && value <= cases[cases.size()-1]) + return thenBranch(value); + else + return elseBranch(value); + } + + template<class T, T to, T from, class Value, class Then> + constexpr void switchCases(const Dune::StaticIntegralRange<T,to,from>& cases, const Value& value, Then&& thenBranch) + { + using integer_sequence = typename Dune::StaticIntegralRange<T,to,from>::integer_sequence; + Dune::Hybrid::switchCases(integer_sequence{}, value, FWD(thenBranch)); + } + + template<class T, class Value, class Then> + constexpr void switchCases(const Dune::IntegralRange<T>& cases, const Value& value, Then&& thenBranch) + { + assert(value >= cases[0] && value <= cases[cases.size()-1]); + thenBranch(value); + } + +} // end namespace AMDiS