Refactoring to avoid dynamic casts.

This commit is contained in:
2016-12-07 02:29:48 +01:00
parent 692d3fe83a
commit ebab65e233
11 changed files with 88 additions and 114 deletions

View File

@@ -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++;

View File

@@ -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());

View File

@@ -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> &parameters) override;

View File

@@ -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> &parameters);
@@ -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();