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