From beef3aca60b2c017a87797d6d10bae2bd4540c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Sun, 22 May 2016 13:58:05 +0200 Subject: [PATCH] Made InitialState a proper class. --- include/plasp/sas/AxiomRule.h | 1 + include/plasp/sas/Description.h | 8 +++--- include/plasp/sas/InitialState.h | 39 ++++++++++++++++++++++++++++ src/plasp/sas/Description.cpp | 15 +++-------- src/plasp/sas/InitialState.cpp | 44 ++++++++++++++++++++++++++++++++ src/plasp/sas/TranslatorASP.cpp | 2 +- tests/TestSASParser.cpp | 6 ++--- 7 files changed, 97 insertions(+), 18 deletions(-) create mode 100644 include/plasp/sas/InitialState.h create mode 100644 src/plasp/sas/InitialState.cpp diff --git a/include/plasp/sas/AxiomRule.h b/include/plasp/sas/AxiomRule.h index 3929bfb..01f0777 100644 --- a/include/plasp/sas/AxiomRule.h +++ b/include/plasp/sas/AxiomRule.h @@ -3,6 +3,7 @@ #include +#include #include namespace plasp diff --git a/include/plasp/sas/Description.h b/include/plasp/sas/Description.h index 206e6e4..69e27f0 100644 --- a/include/plasp/sas/Description.h +++ b/include/plasp/sas/Description.h @@ -2,14 +2,16 @@ #define __SAS__DESCRIPTION_H #include +#include #include #include +#include +#include #include #include #include -#include namespace plasp { @@ -32,7 +34,7 @@ class Description bool usesActionCosts() const; const std::vector &variables() const; const std::vector &mutexGroups() const; - const std::vector &initialStateFacts() const; + const InitialState &initialState() const; const std::vector &goalFacts() const; const std::vector &operators() const; const std::vector &axiomRules() const; @@ -55,7 +57,7 @@ class Description std::vector m_variables; std::vector m_mutexGroups; - std::vector m_initialStateFacts; + std::unique_ptr m_initialState; std::vector m_goalFacts; std::vector m_operators; std::vector m_axiomRules; diff --git a/include/plasp/sas/InitialState.h b/include/plasp/sas/InitialState.h new file mode 100644 index 0000000..329855b --- /dev/null +++ b/include/plasp/sas/InitialState.h @@ -0,0 +1,39 @@ +#ifndef __SAS__INITIAL_STATE_H +#define __SAS__INITIAL_STATE_H + +#include + +namespace plasp +{ +namespace sas +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// InitialState +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +class InitialState +{ + public: + using Fact = AssignedVariable; + using Facts = std::vector; + + static InitialState fromSAS(std::istream &istream, const std::vector &variables); + + public: + const Facts &facts() const; + + private: + InitialState() = default; + + Facts m_facts; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} + +#endif diff --git a/src/plasp/sas/Description.cpp b/src/plasp/sas/Description.cpp index 6f26dd7..044d53e 100644 --- a/src/plasp/sas/Description.cpp +++ b/src/plasp/sas/Description.cpp @@ -83,9 +83,9 @@ const std::vector &Description::mutexGroups() const //////////////////////////////////////////////////////////////////////////////////////////////////// -const std::vector &Description::initialStateFacts() const +const InitialState &Description::initialState() const { - return m_initialStateFacts; + return *m_initialState; } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -158,7 +158,7 @@ void Description::print(std::ostream &ostream) const // Initial state section ostream << "initial state:" << std::endl; - std::for_each(m_initialStateFacts.cbegin(), m_initialStateFacts.cend(), + std::for_each(m_initialState->facts().cbegin(), m_initialState->facts().cend(), [&](const auto &initialStateFact) { ostream << "\t" << initialStateFact.variable().name() << " = "; @@ -295,14 +295,7 @@ void Description::parseMutexSection(std::istream &istream) void Description::parseInitialStateSection(std::istream &istream) { - utils::parseExpected(istream, "begin_state"); - - m_initialStateFacts.reserve(m_variables.size()); - - for (size_t i = 0; i < m_variables.size(); i++) - m_initialStateFacts.emplace_back(AssignedVariable::fromSAS(istream, m_variables[i])); - - utils::parseExpected(istream, "end_state"); + m_initialState = std::make_unique(InitialState::fromSAS(istream, m_variables)); } //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/plasp/sas/InitialState.cpp b/src/plasp/sas/InitialState.cpp new file mode 100644 index 0000000..13d87e1 --- /dev/null +++ b/src/plasp/sas/InitialState.cpp @@ -0,0 +1,44 @@ +#include + +#include + +#include + +namespace plasp +{ +namespace sas +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// InitialState +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +InitialState InitialState::fromSAS(std::istream &istream, const std::vector &variables) +{ + InitialState initialState; + + utils::parseExpected(istream, "begin_state"); + + initialState.m_facts.reserve(variables.size()); + + for (size_t i = 0; i < variables.size(); i++) + initialState.m_facts.emplace_back(AssignedVariable::fromSAS(istream, variables[i])); + + utils::parseExpected(istream, "end_state"); + + return initialState; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +const InitialState::Facts &InitialState::facts() const +{ + return m_facts; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +} +} diff --git a/src/plasp/sas/TranslatorASP.cpp b/src/plasp/sas/TranslatorASP.cpp index cf027da..70fc647 100644 --- a/src/plasp/sas/TranslatorASP.cpp +++ b/src/plasp/sas/TranslatorASP.cpp @@ -92,7 +92,7 @@ void TranslatorASP::translate(std::ostream &ostream) const ostream << std::endl; ostream << "% initial state" << std::endl; - const auto &initialStateFacts = m_description.initialStateFacts(); + const auto &initialStateFacts = m_description.initialState().facts(); std::for_each(initialStateFacts.cbegin(), initialStateFacts.cend(), [&](const auto &initialStateFact) diff --git a/tests/TestSASParser.cpp b/tests/TestSASParser.cpp index 2cd23fe..ce7f556 100644 --- a/tests/TestSASParser.cpp +++ b/tests/TestSASParser.cpp @@ -58,9 +58,9 @@ TEST_F(SASParserTests, ParseValidSASFile) ASSERT_EQ(description.mutexGroups()[7].facts().size(), 2); ASSERT_EQ(&description.mutexGroups()[7].facts()[1].value(), &description.variables()[34].values()[1]); - ASSERT_EQ(description.initialStateFacts().size(), 37); - ASSERT_EQ(&description.initialStateFacts()[0].value(), &description.variables()[0].values()[8]); - ASSERT_EQ(&description.initialStateFacts()[36].value(), &description.variables()[36].values()[1]); + ASSERT_EQ(description.initialState().facts().size(), 37); + ASSERT_EQ(&description.initialState().facts()[0].value(), &description.variables()[0].values()[8]); + ASSERT_EQ(&description.initialState().facts()[36].value(), &description.variables()[36].values()[1]); ASSERT_EQ(description.goalFacts().size(), 2); ASSERT_EQ(&description.goalFacts()[0].value(), &description.variables()[6].values()[0]);