Refactored expressions thanks to intrusive pointers.
This commit is contained in:
@@ -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") << "(";
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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();
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -17,7 +17,8 @@ namespace expressions
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ExpressionPointer parseExistingPrimitiveType(Context &context, ExpressionContext &expressionContext)
|
||||
PrimitiveTypePointer parseExistingPrimitiveType(Context &context,
|
||||
ExpressionContext &expressionContext)
|
||||
{
|
||||
return PrimitiveType::parseAndFind(context, expressionContext.domain);
|
||||
}
|
||||
|
Reference in New Issue
Block a user