From d7a9fe3c8552cf8a5d570429eb417b72116a48c4 Mon Sep 17 00:00:00 2001 From: Timo Koch <timo.koch@iws.uni-stuttgart.de> Date: Thu, 5 Apr 2018 19:52:10 +0200 Subject: [PATCH] [component] Add component traits extracting compile time info from components Add a test. --- dumux/material/components/componenttraits.hh | 53 +++++++++++++++++++ test/material/components/CMakeLists.txt | 2 + .../components/test_componenttraits.cc | 40 ++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 dumux/material/components/componenttraits.hh create mode 100644 test/material/components/test_componenttraits.cc diff --git a/dumux/material/components/componenttraits.hh b/dumux/material/components/componenttraits.hh new file mode 100644 index 0000000000..27cfa721b5 --- /dev/null +++ b/dumux/material/components/componenttraits.hh @@ -0,0 +1,53 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program 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 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ + +/*! + * \file + * \ingroup Components + * \brief Component traits, i.e. information extracted from components + */ +#ifndef DUMUX_COMPONENT_TRAITS_HH +#define DUMUX_COMPONENT_TRAITS_HH + +#include <type_traits> + +#include <dumux/material/components/solid.hh> +#include <dumux/material/components/liquid.hh> +#include <dumux/material/components/gas.hh> + +namespace Dumux { + +template<class Component> +struct ComponentTraits +{ + using Scalar = typename Component::Scalar; + + //! if the component implements a solid state + static constexpr bool hasSolidState = std::is_base_of<Components::Solid<Scalar, Component>, Component>::value; + + //! if the component implements a liquid state + static constexpr bool hasLiquidState = std::is_base_of<Components::Liquid<Scalar, Component>, Component>::value; + + //! if the component implements a gaseous state + static constexpr bool hasGasState = std::is_base_of<Components::Gas<Scalar, Component>, Component>::value; +}; + +} // end namespace Dumux + +#endif diff --git a/test/material/components/CMakeLists.txt b/test/material/components/CMakeLists.txt index ee9e5e00d3..80508e7a4d 100644 --- a/test/material/components/CMakeLists.txt +++ b/test/material/components/CMakeLists.txt @@ -1,3 +1,5 @@ +dune_add_test(SOURCES test_componenttraits.cc) + add_executable(plot_component plotproperties.cc) dune_add_test(NAME plot_air diff --git a/test/material/components/test_componenttraits.cc b/test/material/components/test_componenttraits.cc new file mode 100644 index 0000000000..af88dd2ec0 --- /dev/null +++ b/test/material/components/test_componenttraits.cc @@ -0,0 +1,40 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program 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 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/*! + * \file + * + * \brief Test the compoent traits + */ + +#include "config.h" + +#include <type_traits> + +#include <dumux/material/components/air.hh> +#include <dumux/material/components/componenttraits.hh> + +int main(int argc, char *argv[]) +{ + using namespace Dumux; + + using Traits = ComponentTraits<Components::Air<double>>; + static_assert(Traits::hasGasState, "Air component is reported to have no gas state?!"); + // static_assert(!Traits::hasSolidState, "Air component is reported to implement a solid state?!"); + static_assert(std::is_same<double, Traits::Scalar>::value, "Scalar type not correctly reported!"); +} -- GitLab