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 +#include namespace storm { namespace property { @@ -38,6 +39,10 @@ namespace abstract { template class And : public virtual AbstractFormula { + // Throw a compiler error when FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::And has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 BoundedEventually : public virtual AbstractFormula { + // Throw a compiler error when FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::BoundedEventually has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 BoundedNaryUntil : public virtual AbstractFormula { + // Throw a compiler error when FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::BoundedNaryUntil has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 BoundedUntil : public virtual AbstractFormula { + // Throw a compiler error when FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::BoundedUntil has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 Eventually : public virtual AbstractFormula { + // Throw a compiler error when FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::Eventually has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 Globally : public virtual AbstractFormula { + // Throw a compiler error when FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::Globally has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 Next : public virtual AbstractFormula { + // Throw a compiler error when FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::Next has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 Not : public virtual AbstractFormula { + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::Not has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 Or : public virtual AbstractFormula { + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::Or has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 PathBoundOperator : public virtual AbstractFormula, public OptimizingOperator { + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::PathBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 PathNoBoundOperator: public virtual AbstractFormula, public OptimizingOperator { + + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::PathNoBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + + 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 ProbabilisticBoundOperator : public PathBoundOperator { + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::ProbabilisticBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 ProbabilisticNoBoundOperator: public PathNoBoundOperator { + + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::ProbabilisticNoBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 RewardBoundOperator : public PathBoundOperator { + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::RewardBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 RewardNoBoundOperator: public PathNoBoundOperator { + + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::RewardNoBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 StateBoundOperator : public virtual AbstractFormula { + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::StateBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 StateNoBoundOperator: public virtual AbstractFormula { + + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::StateNoBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 SteadyStateBoundOperator : public StateBoundOperator { + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::SteadyStateBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 SteadyStateNoBoundOperator: public StateNoBoundOperator { + + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::SteadyStateNoBoundOperator has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 TimeBoundedEventually: public storm::property::abstract::TimeBoundedOperator { + + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::TimeBoundedEventually has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 TimeBoundedUntil: public TimeBoundedOperator { + + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::TimeBoundedUntil has to be a subtype of storm::property::abstract::AbstractFormula"); + 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 Until : public virtual AbstractFormula { + // Throw a compiler error if FormulaType is not a subclass of AbstractFormula. + static_assert(std::is_base_of, FormulaType>::value, + "Instantiaton of FormulaType for storm::property::abstract::Until has to be a subtype of storm::property::abstract::AbstractFormula"); + public: /*! * Empty constructor