From 21e6ee70b9e0923b62b25a831ee25c23d84c0244 Mon Sep 17 00:00:00 2001
From: Lanchid <thomas.heinemann@rwth-aachen.de>
Date: Tue, 28 May 2013 12:03:16 +0200
Subject: [PATCH] Added static asserts to ensure that sub formulas are formulas
 ;)

---
 src/formula/abstract/And.h                          | 5 +++++
 src/formula/abstract/BoundedEventually.h            | 4 ++++
 src/formula/abstract/BoundedNaryUntil.h             | 4 ++++
 src/formula/abstract/BoundedUntil.h                 | 4 ++++
 src/formula/abstract/Eventually.h                   | 4 ++++
 src/formula/abstract/Globally.h                     | 4 ++++
 src/formula/abstract/Next.h                         | 4 ++++
 src/formula/abstract/Not.h                          | 4 ++++
 src/formula/abstract/Or.h                           | 4 ++++
 src/formula/abstract/PathBoundOperator.h            | 4 ++++
 src/formula/abstract/PathNoBoundOperator.h          | 6 ++++++
 src/formula/abstract/ProbabilisticBoundOperator.h   | 4 ++++
 src/formula/abstract/ProbabilisticNoBoundOperator.h | 5 +++++
 src/formula/abstract/RewardBoundOperator.h          | 4 ++++
 src/formula/abstract/RewardNoBoundOperator.h        | 5 +++++
 src/formula/abstract/StateBoundOperator.h           | 4 ++++
 src/formula/abstract/StateNoBoundOperator.h         | 5 +++++
 src/formula/abstract/SteadyStateBoundOperator.h     | 4 ++++
 src/formula/abstract/SteadyStateNoBoundOperator.h   | 5 +++++
 src/formula/abstract/TimeBoundedEventually.h        | 5 +++++
 src/formula/abstract/TimeBoundedUntil.h             | 5 +++++
 src/formula/abstract/Until.h                        | 4 ++++
 22 files changed, 97 insertions(+)

diff --git a/src/formula/abstract/And.h b/src/formula/abstract/And.h
index 3442d62a9..34d4109e2 100644
--- a/src/formula/abstract/And.h
+++ b/src/formula/abstract/And.h
@@ -12,6 +12,7 @@
 #include "src/formula/AbstractFormulaChecker.h"
 #include "src/modelchecker/ForwardDeclarations.h"
 #include <string>
+#include <type_traits>
 
 namespace storm {
 namespace property {
@@ -38,6 +39,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class And : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error when FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::And<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor.
diff --git a/src/formula/abstract/BoundedEventually.h b/src/formula/abstract/BoundedEventually.h
index 420dbfff4..25a710b5b 100644
--- a/src/formula/abstract/BoundedEventually.h
+++ b/src/formula/abstract/BoundedEventually.h
@@ -41,6 +41,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class BoundedEventually : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error when FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::BoundedEventually<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/BoundedNaryUntil.h b/src/formula/abstract/BoundedNaryUntil.h
index ccfe2ab17..04d4cc53e 100644
--- a/src/formula/abstract/BoundedNaryUntil.h
+++ b/src/formula/abstract/BoundedNaryUntil.h
@@ -45,6 +45,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class BoundedNaryUntil : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error when FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::BoundedNaryUntil<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/BoundedUntil.h b/src/formula/abstract/BoundedUntil.h
index 33cc4f87a..d7ba66a37 100644
--- a/src/formula/abstract/BoundedUntil.h
+++ b/src/formula/abstract/BoundedUntil.h
@@ -39,6 +39,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class BoundedUntil : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error when FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::BoundedUntil<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/Eventually.h b/src/formula/abstract/Eventually.h
index aa706c311..54754df52 100644
--- a/src/formula/abstract/Eventually.h
+++ b/src/formula/abstract/Eventually.h
@@ -38,6 +38,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class Eventually : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error when FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::Eventually<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/Globally.h b/src/formula/abstract/Globally.h
index 4e0ab0f22..6d3ddb4aa 100644
--- a/src/formula/abstract/Globally.h
+++ b/src/formula/abstract/Globally.h
@@ -39,6 +39,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class Globally : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error when FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::Globally<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/Next.h b/src/formula/abstract/Next.h
index 0688e518b..bf049ad1b 100644
--- a/src/formula/abstract/Next.h
+++ b/src/formula/abstract/Next.h
@@ -38,6 +38,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class Next : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error when FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::Next<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/Not.h b/src/formula/abstract/Not.h
index 6c92e7672..473ca7c64 100644
--- a/src/formula/abstract/Not.h
+++ b/src/formula/abstract/Not.h
@@ -36,6 +36,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class Not : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::Not<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/Or.h b/src/formula/abstract/Or.h
index 569939c2c..071173c4a 100644
--- a/src/formula/abstract/Or.h
+++ b/src/formula/abstract/Or.h
@@ -36,6 +36,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class Or : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::Or<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor.
diff --git a/src/formula/abstract/PathBoundOperator.h b/src/formula/abstract/PathBoundOperator.h
index 03454b3c5..39f038e30 100644
--- a/src/formula/abstract/PathBoundOperator.h
+++ b/src/formula/abstract/PathBoundOperator.h
@@ -48,6 +48,10 @@ namespace abstract {
 template<class T, class FormulaType>
 class PathBoundOperator : public virtual AbstractFormula<T>, public OptimizingOperator {
 
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::PathBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Constructor for non-optimizing operator.
diff --git a/src/formula/abstract/PathNoBoundOperator.h b/src/formula/abstract/PathNoBoundOperator.h
index 827b6cfa1..509c12cf3 100644
--- a/src/formula/abstract/PathNoBoundOperator.h
+++ b/src/formula/abstract/PathNoBoundOperator.h
@@ -51,6 +51,12 @@ namespace abstract {
  */
 template <class T, class FormulaType>
 class PathNoBoundOperator: public virtual AbstractFormula<T>, public OptimizingOperator {
+
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::PathNoBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/ProbabilisticBoundOperator.h b/src/formula/abstract/ProbabilisticBoundOperator.h
index d940dccc2..d9b14b183 100644
--- a/src/formula/abstract/ProbabilisticBoundOperator.h
+++ b/src/formula/abstract/ProbabilisticBoundOperator.h
@@ -44,6 +44,10 @@ namespace abstract {
 template<class T, class FormulaType>
 class ProbabilisticBoundOperator : public PathBoundOperator<T, FormulaType> {
 
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::ProbabilisticBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/ProbabilisticNoBoundOperator.h b/src/formula/abstract/ProbabilisticNoBoundOperator.h
index e1f837ee9..9b276f976 100644
--- a/src/formula/abstract/ProbabilisticNoBoundOperator.h
+++ b/src/formula/abstract/ProbabilisticNoBoundOperator.h
@@ -49,6 +49,11 @@ namespace abstract {
  */
 template <class T, class FormulaType>
 class ProbabilisticNoBoundOperator: public PathNoBoundOperator<T, FormulaType> {
+
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::ProbabilisticNoBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/RewardBoundOperator.h b/src/formula/abstract/RewardBoundOperator.h
index 5df7be02c..961c11f21 100644
--- a/src/formula/abstract/RewardBoundOperator.h
+++ b/src/formula/abstract/RewardBoundOperator.h
@@ -39,6 +39,10 @@ namespace abstract {
 template<class T, class FormulaType>
 class RewardBoundOperator : public PathBoundOperator<T, FormulaType> {
 
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::RewardBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/RewardNoBoundOperator.h b/src/formula/abstract/RewardNoBoundOperator.h
index f9dbae5b7..72fb06f6f 100644
--- a/src/formula/abstract/RewardNoBoundOperator.h
+++ b/src/formula/abstract/RewardNoBoundOperator.h
@@ -48,6 +48,11 @@ namespace abstract {
  */
 template <class T, class FormulaType>
 class RewardNoBoundOperator: public PathNoBoundOperator<T, FormulaType> {
+
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::RewardNoBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/StateBoundOperator.h b/src/formula/abstract/StateBoundOperator.h
index c2f869b9e..56f6b86d9 100644
--- a/src/formula/abstract/StateBoundOperator.h
+++ b/src/formula/abstract/StateBoundOperator.h
@@ -43,6 +43,10 @@ namespace abstract {
 template<class T, class FormulaType>
 class StateBoundOperator : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::StateBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 
 	/*!
diff --git a/src/formula/abstract/StateNoBoundOperator.h b/src/formula/abstract/StateNoBoundOperator.h
index 9696f597d..2fb40145f 100644
--- a/src/formula/abstract/StateNoBoundOperator.h
+++ b/src/formula/abstract/StateNoBoundOperator.h
@@ -49,6 +49,11 @@ namespace abstract {
  */
 template <class T, class FormulaType>
 class StateNoBoundOperator: public virtual AbstractFormula<T> {
+
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::StateNoBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/SteadyStateBoundOperator.h b/src/formula/abstract/SteadyStateBoundOperator.h
index 2c5d33bd4..3bbb7f88c 100644
--- a/src/formula/abstract/SteadyStateBoundOperator.h
+++ b/src/formula/abstract/SteadyStateBoundOperator.h
@@ -32,6 +32,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class SteadyStateBoundOperator : public StateBoundOperator<T, FormulaType> {
 
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::SteadyStateBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/SteadyStateNoBoundOperator.h b/src/formula/abstract/SteadyStateNoBoundOperator.h
index 4831c1743..88fe73ead 100644
--- a/src/formula/abstract/SteadyStateNoBoundOperator.h
+++ b/src/formula/abstract/SteadyStateNoBoundOperator.h
@@ -29,6 +29,11 @@ namespace abstract {
  */
 template <class T, class FormulaType>
 class SteadyStateNoBoundOperator: public StateNoBoundOperator<T, FormulaType> {
+
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::SteadyStateNoBoundOperator<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor
diff --git a/src/formula/abstract/TimeBoundedEventually.h b/src/formula/abstract/TimeBoundedEventually.h
index 362692ba4..23d0fd74f 100644
--- a/src/formula/abstract/TimeBoundedEventually.h
+++ b/src/formula/abstract/TimeBoundedEventually.h
@@ -25,6 +25,11 @@ namespace abstract {
  */
 template<class T, class FormulaType>
 class TimeBoundedEventually: public storm::property::abstract::TimeBoundedOperator<T> {
+
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::TimeBoundedEventually<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/**
 	 * Simple constructor: Only sets the bounds
diff --git a/src/formula/abstract/TimeBoundedUntil.h b/src/formula/abstract/TimeBoundedUntil.h
index 823ac8fd0..146c82cd1 100644
--- a/src/formula/abstract/TimeBoundedUntil.h
+++ b/src/formula/abstract/TimeBoundedUntil.h
@@ -25,6 +25,11 @@ namespace abstract {
  */
 template <class T, class FormulaType>
 class TimeBoundedUntil: public TimeBoundedOperator<T> {
+
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::TimeBoundedUntil<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/**
 	 * Constructor providing bounds only;
diff --git a/src/formula/abstract/Until.h b/src/formula/abstract/Until.h
index 5037ad018..1df330926 100644
--- a/src/formula/abstract/Until.h
+++ b/src/formula/abstract/Until.h
@@ -38,6 +38,10 @@ namespace abstract {
 template <class T, class FormulaType>
 class Until : public virtual AbstractFormula<T> {
 
+	// Throw a compiler error if FormulaType is not a subclass of AbstractFormula.
+	static_assert(std::is_base_of<AbstractFormula<T>, FormulaType>::value,
+				  "Instantiaton of FormulaType for storm::property::abstract::Until<T,FormulaType> has to be a subtype of storm::property::abstract::AbstractFormula<T>");
+
 public:
 	/*!
 	 * Empty constructor