Refactored expressions thanks to intrusive pointers.

This commit is contained in:
2016-09-04 18:48:46 +02:00
parent 9afabacde3
commit 7aa20a5820
15 changed files with 56 additions and 111 deletions

View File

@@ -261,7 +261,7 @@ void TranslatorASP::translateActions() const
const auto &andExpression = dynamic_cast<const expressions::And &>(precondition);
std::for_each(andExpression.arguments().cbegin(), andExpression.arguments().cend(),
[&](const auto *argument)
[&](const auto argument)
{
translateLiteral("precondition", *argument);
});
@@ -287,7 +287,7 @@ void TranslatorASP::translateActions() const
const auto &andExpression = dynamic_cast<const expressions::And &>(effect);
std::for_each(andExpression.arguments().cbegin(), andExpression.arguments().cend(),
[&](const auto *argument)
[&](const auto argument)
{
translateLiteral("postcondition", *argument, true);
});
@@ -557,7 +557,7 @@ void TranslatorASP::translateGoal() const
const auto &andExpression = dynamic_cast<const expressions::And &>(goal);
std::for_each(andExpression.arguments().cbegin(), andExpression.arguments().cend(),
[&](const auto *argument)
[&](const auto argument)
{
m_outputStream << std::endl << utils::RuleName("goal") << "(";

View File

@@ -20,23 +20,14 @@ At::At()
////////////////////////////////////////////////////////////////////////////////////////////////////
void At::setArgument(const Expression *argument)
void At::setArgument(ExpressionPointer argument)
{
m_argumentStorage = nullptr;
m_argument = argument;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void At::setArgument(ExpressionPointer &&argument)
{
m_argumentStorage = std::move(argument);
m_argument = m_argumentStorage.get();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
const Expression *At::argument() const
ExpressionPointer At::argument() const
{
return m_argument;
}
@@ -45,9 +36,9 @@ const Expression *At::argument() const
ExpressionPointer At::normalize()
{
BOOST_ASSERT(m_argumentStorage);
BOOST_ASSERT(m_argument);
auto normalizedArgument = m_argumentStorage->normalize();
auto normalizedArgument = m_argument->normalize();
// Replace argument if changed by normalization
if (normalizedArgument)

View File

@@ -23,15 +23,15 @@ const std::string Imply::Identifier = "imply";
ExpressionPointer Imply::normalize()
{
BOOST_ASSERT(m_argumentStorage[0]);
BOOST_ASSERT(m_argumentStorage[1]);
BOOST_ASSERT(m_arguments[0]);
BOOST_ASSERT(m_arguments[1]);
auto notArgument0 = NotPointer(new Not);
notArgument0->setArgument(std::move(m_argumentStorage[0]));
notArgument0->setArgument(std::move(m_arguments[0]));
auto orExpression = OrPointer(new Or);
orExpression->addArgument(std::move(notArgument0));
orExpression->addArgument(std::move(m_argumentStorage[1]));
orExpression->addArgument(std::move(m_arguments[1]));
auto normalizedOrExpression = orExpression->normalize();

View File

@@ -20,23 +20,14 @@ Not::Not()
////////////////////////////////////////////////////////////////////////////////////////////////////
void Not::setArgument(const Expression *argument)
void Not::setArgument(ExpressionPointer argument)
{
m_argumentStorage = nullptr;
m_argument = argument;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void Not::setArgument(ExpressionPointer &&argument)
{
m_argumentStorage = std::move(argument);
m_argument = m_argumentStorage.get();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
const Expression *Not::argument() const
ExpressionPointer Not::argument() const
{
return m_argument;
}
@@ -45,14 +36,14 @@ const Expression *Not::argument() const
ExpressionPointer Not::normalize()
{
BOOST_ASSERT(m_argumentStorage);
BOOST_ASSERT(m_argument);
// Remove double negations immediately
if (m_argumentStorage->expressionType() == Expression::Type::Not)
if (m_argument->expressionType() == Expression::Type::Not)
{
auto &argument = dynamic_cast<Not &>(*m_argumentStorage);
auto &argument = dynamic_cast<Not &>(*m_argument);
auto normalized = std::move(argument.m_argumentStorage);
auto normalized = std::move(argument.m_argument);
auto normalizedInner = normalized->normalize();
if (normalizedInner)
@@ -61,7 +52,7 @@ ExpressionPointer Not::normalize()
return normalized;
}
auto normalizedArgument = m_argumentStorage->normalize();
auto normalizedArgument = m_argument->normalize();
// Replace argument if changed by normalization
if (normalizedArgument)

View File

@@ -163,7 +163,7 @@ const std::string &Predicate::name() const
////////////////////////////////////////////////////////////////////////////////////////////////////
const std::vector<ExpressionPointer> &Predicate::arguments() const
const Expressions &Predicate::arguments() const
{
return m_arguments;
}

View File

@@ -162,7 +162,7 @@ const std::string &PrimitiveType::name() const
////////////////////////////////////////////////////////////////////////////////////////////////////
const std::vector<PrimitiveTypePointer> &PrimitiveType::parentTypes() const
const PrimitiveTypes &PrimitiveType::parentTypes() const
{
return m_parentTypes;
}

View File

@@ -17,7 +17,8 @@ namespace expressions
//
////////////////////////////////////////////////////////////////////////////////////////////////////
ExpressionPointer parseExistingPrimitiveType(Context &context, ExpressionContext &expressionContext)
PrimitiveTypePointer parseExistingPrimitiveType(Context &context,
ExpressionContext &expressionContext)
{
return PrimitiveType::parseAndFind(context, expressionContext.domain);
}