Refactoring to avoid dynamic casts.
This commit is contained in:
@@ -132,6 +132,10 @@ class Expression
|
||||
|
||||
template<class T>
|
||||
bool is() const;
|
||||
template<class T>
|
||||
T &as();
|
||||
template<class T>
|
||||
const T &as() const;
|
||||
|
||||
virtual ExpressionPointer copy();
|
||||
|
||||
@@ -152,9 +156,6 @@ class Expression
|
||||
|
||||
virtual void print(std::ostream &ostream) const = 0;
|
||||
|
||||
protected:
|
||||
static ExpressionPointer moveUpQuantifiers(ExpressionPointer parent, ExpressionPointer &child);
|
||||
|
||||
private:
|
||||
friend void intrusive_ptr_add_ref(Expression *expression);
|
||||
friend void intrusive_ptr_release(Expression *expression);
|
||||
@@ -172,6 +173,22 @@ bool Expression::is() const
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class T>
|
||||
T &Expression::as()
|
||||
{
|
||||
return dynamic_cast<T &>(*this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class T>
|
||||
const T &Expression::as() const
|
||||
{
|
||||
return dynamic_cast<const T &>(*this);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline void intrusive_ptr_add_ref(Expression *expression)
|
||||
{
|
||||
expression->m_referenceCount++;
|
||||
|
@@ -185,7 +185,7 @@ inline ExpressionPointer NAry<Derived>::simplified()
|
||||
continue;
|
||||
}
|
||||
|
||||
auto &nAryExpression = dynamic_cast<Derived &>(*argument);
|
||||
auto &nAryExpression = argument->template as<Derived>();
|
||||
|
||||
BOOST_ASSERT(!nAryExpression.arguments().empty());
|
||||
|
||||
|
@@ -30,7 +30,7 @@ class Predicate: public ExpressionCRTP<Predicate>
|
||||
|
||||
bool isDeclared() const;
|
||||
|
||||
ExpressionPointer decomposed(expressions::DerivedPredicates &derivedPredicates) override;
|
||||
ExpressionPointer decomposed(DerivedPredicates &derivedPredicates) override;
|
||||
|
||||
void collectParameters(std::set<VariablePointer> ¶meters) override;
|
||||
|
||||
|
@@ -55,7 +55,7 @@ class QuantifiedCRTP: public Quantified
|
||||
ExpressionPointer reduced() override;
|
||||
ExpressionPointer existentiallyQuantified() override;
|
||||
ExpressionPointer simplified() override;
|
||||
ExpressionPointer decomposed(expressions::DerivedPredicates &derivedPredicates) override;
|
||||
ExpressionPointer decomposed(DerivedPredicates &derivedPredicates) override;
|
||||
|
||||
void collectParameters(std::set<VariablePointer> ¶meters);
|
||||
|
||||
@@ -179,7 +179,7 @@ inline ExpressionPointer QuantifiedCRTP<Derived>::simplified()
|
||||
if (m_argument->expressionType() != Derived::ExpressionType)
|
||||
return this;
|
||||
|
||||
auto &quantifiedExpression = dynamic_cast<Derived &>(*m_argument);
|
||||
auto &quantifiedExpression = m_argument->template as<Derived>();
|
||||
|
||||
// Unify variables
|
||||
m_variables.insert(m_variables.end(), quantifiedExpression.variables().begin(), quantifiedExpression.variables().end());
|
||||
@@ -195,7 +195,7 @@ inline ExpressionPointer QuantifiedCRTP<Derived>::simplified()
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Derived>
|
||||
inline ExpressionPointer QuantifiedCRTP<Derived>::decomposed(expressions::DerivedPredicates &derivedPredicates)
|
||||
inline ExpressionPointer QuantifiedCRTP<Derived>::decomposed(DerivedPredicates &derivedPredicates)
|
||||
{
|
||||
derivedPredicates.emplace_back(new DerivedPredicate());
|
||||
auto &derivedPredicate = derivedPredicates.back();
|
||||
|
Reference in New Issue
Block a user