From 73df57b9202ebf723cfff65671ddf0cf77b37355 Mon Sep 17 00:00:00 2001 From: atleh Date: Mon, 24 Mar 2014 18:55:35 +0100 Subject: [PATCH] Added some iterator support in KeywordContainer and Section. Not finished. --- opm/parser/eclipse/Deck/KeywordContainer.cpp | 7 + opm/parser/eclipse/Deck/KeywordContainer.hpp | 3 + opm/parser/eclipse/Deck/Section.cpp | 22 ++- opm/parser/eclipse/Deck/Section.hpp | 31 ++-- .../Deck/tests/KeywordContainerTests.cpp | 16 ++ .../eclipse/Deck/tests/SectionTests.cpp | 151 +++++++++++------- 6 files changed, 158 insertions(+), 72 deletions(-) diff --git a/opm/parser/eclipse/Deck/KeywordContainer.cpp b/opm/parser/eclipse/Deck/KeywordContainer.cpp index 67922e884..becb39ec4 100644 --- a/opm/parser/eclipse/Deck/KeywordContainer.cpp +++ b/opm/parser/eclipse/Deck/KeywordContainer.cpp @@ -88,4 +88,11 @@ namespace Opm { return 0; } + std::vector::iterator KeywordContainer::begin() { + return m_keywordList.begin(); + } + + std::vector::iterator KeywordContainer::end() { + return m_keywordList.end(); + } } diff --git a/opm/parser/eclipse/Deck/KeywordContainer.hpp b/opm/parser/eclipse/Deck/KeywordContainer.hpp index ac833d7f1..b7889400f 100644 --- a/opm/parser/eclipse/Deck/KeywordContainer.hpp +++ b/opm/parser/eclipse/Deck/KeywordContainer.hpp @@ -30,6 +30,9 @@ namespace Opm { const std::vector& getKeywordList(const std::string& keyword) const; size_t numKeywords(const std::string& keyword) const; + std::vector::iterator begin(); + std::vector::iterator end(); + private: std::vector m_keywordList; std::map > m_keywordMap; diff --git a/opm/parser/eclipse/Deck/Section.cpp b/opm/parser/eclipse/Deck/Section.cpp index cc99c82d4..57549f386 100644 --- a/opm/parser/eclipse/Deck/Section.cpp +++ b/opm/parser/eclipse/Deck/Section.cpp @@ -25,25 +25,25 @@ #include namespace Opm { - Section::Section(Deck& deck, const std::string& startKeyword, const std::vector& stopKeywords ) { + Section::Section(DeckConstPtr deck, const std::string& startKeyword, const std::vector& stopKeywords ) { populateKeywords(deck, startKeyword, stopKeywords); } - void Section::populateKeywords(const Deck& deck, const std::string& startKeyword, + void Section::populateKeywords(DeckConstPtr deck, const std::string& startKeyword, const std::vector& stopKeywords) { size_t i; bool isCollecting = false; - for (i=0; iname() << std::endl; - if (!isCollecting && startKeyword.compare(deck.getKeyword(i)->name()) == 0) { + for (i=0; isize(); i++) { + std::string currentKeyword = deck->getKeyword(i)->name(); + if (!isCollecting && startKeyword.compare(currentKeyword) == 0) { isCollecting = true; } - if (std::find(stopKeywords.begin(), stopKeywords.end(), deck.getKeyword(i)->name()) != stopKeywords.end()) { + if (std::find(stopKeywords.begin(), stopKeywords.end(), currentKeyword) != stopKeywords.end()) { break; } if (isCollecting) { - m_keywords.addKeyword(deck.getKeyword(i)); + m_keywords.addKeyword(deck->getKeyword(i)); } } } @@ -51,4 +51,12 @@ namespace Opm { bool Section::hasKeyword( const std::string& keyword ) const { return m_keywords.hasKeyword(keyword); } + + std::vector::iterator Section::begin() { + return m_keywords.begin(); + } + + std::vector::iterator Section::end() { + return m_keywords.end(); + } } diff --git a/opm/parser/eclipse/Deck/Section.hpp b/opm/parser/eclipse/Deck/Section.hpp index 523cc9484..7a5f38211 100644 --- a/opm/parser/eclipse/Deck/Section.hpp +++ b/opm/parser/eclipse/Deck/Section.hpp @@ -21,48 +21,61 @@ #define SECTION_HPP #include +#include namespace Opm { - class Section + class Section : public boost::iterator_facade { public: - Section(Deck& deck, const std::string& startKeyword, const std::vector& stopKeywords ); + Section(DeckConstPtr deck, const std::string& startKeyword, const std::vector& stopKeywords ); bool hasKeyword( const std::string& keyword ) const; + std::vector::iterator begin(); + std::vector::iterator end(); + bool isStopKeyword(const std::vector& stopKeywords, std::string currentKeyword); private: KeywordContainer m_keywords; - void populateKeywords(const Deck& deck, const std::string& startKeyword, const std::vector& stopKeywords); + void populateKeywords(DeckConstPtr deck, const std::string& startKeyword, const std::vector& stopKeywords); }; + typedef std::shared_ptr
SectionPtr; + typedef std::shared_ptr SectionConstPtr; + + class RUNSPECSection : public Section { public: - RUNSPECSection(Deck& deck) : Section (deck, "RUNSPEC", std::vector() = {"GRID"}) {} + RUNSPECSection(DeckConstPtr deck) : Section (deck, "RUNSPEC", std::vector() = {"GRID"}) {} }; class GRIDSection : public Section { public: - GRIDSection(Deck& deck) : Section (deck, "GRID", std::vector() = {"EDIT", "PROPS"}) {} + GRIDSection(DeckConstPtr deck) : Section (deck, "GRID", std::vector() = {"EDIT", "PROPS"}) {} }; class EDITSection : public Section { public: - EDITSection(Deck& deck) : Section (deck, "EDIT", std::vector() = {"PROPS"}) {} + EDITSection(DeckConstPtr deck) : Section (deck, "EDIT", std::vector() = {"PROPS"}) {} }; class PROPSSection : public Section { public: - PROPSSection(Deck& deck) : Section (deck, "PROPS", std::vector() = {"REGIONS", "SOLUTION"}) {} + PROPSSection(DeckConstPtr deck) : Section (deck, "PROPS", std::vector() = {"REGIONS", "SOLUTION"}) {} }; class REGIONSSection : public Section { public: - REGIONSSection(Deck& deck) : Section (deck, "REGIONS", std::vector() = {"SOLUTION"}) {} + REGIONSSection(DeckConstPtr deck) : Section (deck, "REGIONS", std::vector() = {"SOLUTION"}) {} }; class SOLUTIONSection : public Section { public: - SOLUTIONSection(Deck& deck) : Section (deck, "SOLUTION", std::vector() = {"SUMMARY", "SCHEDULE"}) {} + SOLUTIONSection(DeckConstPtr deck) : Section (deck, "SOLUTION", std::vector() = {"SUMMARY", "SCHEDULE"}) {} + }; + + class SCHEDULESection : public Section { + public: + SCHEDULESection(DeckConstPtr deck) : Section (deck, "SCHEDULE", std::vector() = {}) {} }; } diff --git a/opm/parser/eclipse/Deck/tests/KeywordContainerTests.cpp b/opm/parser/eclipse/Deck/tests/KeywordContainerTests.cpp index 3dedabeec..2419ed686 100644 --- a/opm/parser/eclipse/Deck/tests/KeywordContainerTests.cpp +++ b/opm/parser/eclipse/Deck/tests/KeywordContainerTests.cpp @@ -152,6 +152,22 @@ BOOST_AUTO_TEST_CASE(keywordList_getbyindex_correctkeywordreturned) { BOOST_CHECK_EQUAL("TRULSX", container->getKeyword(2)->name()); } +BOOST_AUTO_TEST_CASE(keywordList_canIterate) { + KeywordContainerPtr container(new KeywordContainer()); + DeckKeywordPtr keyword1 = DeckKeywordPtr(new DeckKeyword("TRULS")); + DeckKeywordPtr keyword2 = DeckKeywordPtr(new DeckKeyword("TRULS")); + DeckKeywordPtr keyword3 = DeckKeywordPtr(new DeckKeyword("TRULSX")); + container->addKeyword(keyword1); + container->addKeyword(keyword2); + container->addKeyword(keyword3); + int numberOfItems = 0; + for (auto iter=container->begin(); iter != container->end(); ++iter) { +// std::cout << typeid(iter).name() << std::endl; +// std::cout << iter->name() << std::endl; + numberOfItems++; + } + BOOST_CHECK_EQUAL(3, numberOfItems); +} diff --git a/opm/parser/eclipse/Deck/tests/SectionTests.cpp b/opm/parser/eclipse/Deck/tests/SectionTests.cpp index c6795f0db..534439bd5 100644 --- a/opm/parser/eclipse/Deck/tests/SectionTests.cpp +++ b/opm/parser/eclipse/Deck/tests/SectionTests.cpp @@ -21,21 +21,22 @@ #define BOOST_TEST_MODULE SectionTests #include +#include #include #include using namespace Opm; BOOST_AUTO_TEST_CASE(SectionTest) { - Deck deck; + DeckPtr deck(new Deck()); DeckKeywordPtr test1(new DeckKeyword("TEST1")); - deck.addKeyword(test1); + deck->addKeyword(test1); DeckKeywordPtr test2(new DeckKeyword("TEST2")); - deck.addKeyword(test2); + deck->addKeyword(test2); DeckKeywordPtr test3(new DeckKeyword("TEST3")); - deck.addKeyword(test3); + deck->addKeyword(test3); DeckKeywordPtr test4(new DeckKeyword("TEST4")); - deck.addKeyword(test4); + deck->addKeyword(test4); Section section(deck, "TEST1", std::vector() = {"TEST3", "TEST4"}); BOOST_CHECK_EQUAL(true, section.hasKeyword("TEST1")); BOOST_CHECK_EQUAL(true, section.hasKeyword("TEST2")); @@ -43,25 +44,46 @@ BOOST_AUTO_TEST_CASE(SectionTest) { BOOST_CHECK_EQUAL(false, section.hasKeyword("TEST4")); } +BOOST_AUTO_TEST_CASE(IteratorTest) { + DeckPtr deck(new Deck()); + DeckKeywordPtr test1(new DeckKeyword("TEST1")); + deck->addKeyword(test1); + DeckKeywordPtr test2(new DeckKeyword("TEST2")); + deck->addKeyword(test2); + DeckKeywordPtr test3(new DeckKeyword("TEST3")); + deck->addKeyword(test3); + DeckKeywordPtr test4(new DeckKeyword("TEST4")); + deck->addKeyword(test4); + Section section(deck, "TEST1", std::vector() = {"TEST3", "TEST4"}); + + int numberOfItems = 0; + for (auto iter=section.begin(); iter != section.end(); ++iter) { +// std::cout << typeid(iter).name() << std::endl; +// std::cout << iter->name() << std::endl; + numberOfItems++; + } + BOOST_CHECK_EQUAL(2, numberOfItems); +} + BOOST_AUTO_TEST_CASE(RUNSPECSection_EmptyDeck) { - Deck deck; + DeckPtr deck(new Deck()); BOOST_REQUIRE_NO_THROW(RUNSPECSection section(deck)); } BOOST_AUTO_TEST_CASE(RUNSPECSection_ReadSimpleDeck) { - Deck deck; + DeckPtr deck(new Deck()); DeckKeywordPtr test1(new DeckKeyword("TEST1")); - deck.addKeyword(test1); + deck->addKeyword(test1); DeckKeywordPtr runSpec(new DeckKeyword("RUNSPEC")); - deck.addKeyword(runSpec); + deck->addKeyword(runSpec); DeckKeywordPtr test2(new DeckKeyword("TEST2")); - deck.addKeyword(test2); + deck->addKeyword(test2); DeckKeywordPtr test3(new DeckKeyword("TEST3")); - deck.addKeyword(test3); + deck->addKeyword(test3); DeckKeywordPtr grid(new DeckKeyword("GRID")); - deck.addKeyword(grid); + deck->addKeyword(grid); DeckKeywordPtr test4(new DeckKeyword("TEST4")); - deck.addKeyword(test4); + deck->addKeyword(test4); RUNSPECSection section(deck); BOOST_CHECK_EQUAL(false, section.hasKeyword("TEST1")); BOOST_CHECK_EQUAL(true, section.hasKeyword("RUNSPEC")); @@ -72,100 +94,117 @@ BOOST_AUTO_TEST_CASE(RUNSPECSection_ReadSimpleDeck) { } BOOST_AUTO_TEST_CASE(RUNSPECSection_ReadSmallestPossibleDeck) { - Deck deck; + DeckPtr deck(new Deck()); DeckKeywordPtr runSpec(new DeckKeyword("RUNSPEC")); - deck.addKeyword(runSpec); + deck->addKeyword(runSpec); DeckKeywordPtr grid(new DeckKeyword("GRID")); - deck.addKeyword(grid); + deck->addKeyword(grid); RUNSPECSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("RUNSPEC")); BOOST_CHECK_EQUAL(false, section.hasKeyword("GRID")); } BOOST_AUTO_TEST_CASE(GRIDSection_TerminatedByEDITKeyword) { - Deck deck; - DeckKeywordPtr runSpec(new DeckKeyword("GRID")); - deck.addKeyword(runSpec); - DeckKeywordPtr grid(new DeckKeyword("EDIT")); - deck.addKeyword(grid); + DeckPtr deck(new Deck()); + DeckKeywordPtr grid(new DeckKeyword("GRID")); + deck->addKeyword(grid); + DeckKeywordPtr edit(new DeckKeyword("EDIT")); + deck->addKeyword(edit); GRIDSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("GRID")); BOOST_CHECK_EQUAL(false, section.hasKeyword("EDIT")); } BOOST_AUTO_TEST_CASE(GRIDSection_TerminatedByPROPSKeyword) { - Deck deck; - DeckKeywordPtr runSpec(new DeckKeyword("GRID")); - deck.addKeyword(runSpec); - DeckKeywordPtr grid(new DeckKeyword("PROPS")); - deck.addKeyword(grid); + DeckPtr deck(new Deck()); + DeckKeywordPtr grid(new DeckKeyword("GRID")); + deck->addKeyword(grid); + DeckKeywordPtr props(new DeckKeyword("PROPS")); + deck->addKeyword(props); GRIDSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("GRID")); BOOST_CHECK_EQUAL(false, section.hasKeyword("PROPS")); } BOOST_AUTO_TEST_CASE(EDITSection_TerminatedByPROPSKeyword) { - Deck deck; - DeckKeywordPtr runSpec(new DeckKeyword("EDIT")); - deck.addKeyword(runSpec); - DeckKeywordPtr grid(new DeckKeyword("PROPS")); - deck.addKeyword(grid); + DeckPtr deck(new Deck()); + DeckKeywordPtr edit(new DeckKeyword("EDIT")); + deck->addKeyword(edit); + DeckKeywordPtr props(new DeckKeyword("PROPS")); + deck->addKeyword(props); EDITSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("EDIT")); BOOST_CHECK_EQUAL(false, section.hasKeyword("PROPS")); } BOOST_AUTO_TEST_CASE(PROPSSection_TerminatedByREGIONSKeyword) { - Deck deck; - DeckKeywordPtr runSpec(new DeckKeyword("PROPS")); - deck.addKeyword(runSpec); - DeckKeywordPtr grid(new DeckKeyword("REGIONS")); - deck.addKeyword(grid); + DeckPtr deck(new Deck()); + DeckKeywordPtr props(new DeckKeyword("PROPS")); + deck->addKeyword(props); + DeckKeywordPtr regions(new DeckKeyword("REGIONS")); + deck->addKeyword(regions); PROPSSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("PROPS")); BOOST_CHECK_EQUAL(false, section.hasKeyword("REGIONS")); } BOOST_AUTO_TEST_CASE(PROPSSection_TerminatedBySOLUTIONKeyword) { - Deck deck; - DeckKeywordPtr runSpec(new DeckKeyword("PROPS")); - deck.addKeyword(runSpec); - DeckKeywordPtr grid(new DeckKeyword("SOLUTION")); - deck.addKeyword(grid); + DeckPtr deck(new Deck()); + DeckKeywordPtr props(new DeckKeyword("PROPS")); + deck->addKeyword(props); + DeckKeywordPtr solution(new DeckKeyword("SOLUTION")); + deck->addKeyword(solution); PROPSSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("PROPS")); BOOST_CHECK_EQUAL(false, section.hasKeyword("SOLUTION")); } BOOST_AUTO_TEST_CASE(REGIONSSection_TerminatedBySOLUTIONKeyword) { - Deck deck; - DeckKeywordPtr runSpec(new DeckKeyword("REGIONS")); - deck.addKeyword(runSpec); - DeckKeywordPtr grid(new DeckKeyword("SOLUTION")); - deck.addKeyword(grid); + DeckPtr deck(new Deck()); + DeckKeywordPtr regions(new DeckKeyword("REGIONS")); + deck->addKeyword(regions); + DeckKeywordPtr solution(new DeckKeyword("SOLUTION")); + deck->addKeyword(solution); REGIONSSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("REGIONS")); BOOST_CHECK_EQUAL(false, section.hasKeyword("SOLUTION")); } BOOST_AUTO_TEST_CASE(SOLUTIONSection_TerminatedBySUMMARYKeyword) { - Deck deck; - DeckKeywordPtr runSpec(new DeckKeyword("SOLUTION")); - deck.addKeyword(runSpec); - DeckKeywordPtr grid(new DeckKeyword("SUMMARY")); - deck.addKeyword(grid); + DeckPtr deck(new Deck()); + DeckKeywordPtr solution(new DeckKeyword("SOLUTION")); + deck->addKeyword(solution); + DeckKeywordPtr summary(new DeckKeyword("SUMMARY")); + deck->addKeyword(summary); SOLUTIONSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("SOLUTION")); BOOST_CHECK_EQUAL(false, section.hasKeyword("SUMMARY")); } BOOST_AUTO_TEST_CASE(SOLUTIONSection_TerminatedBySCHEDULEKeyword) { - Deck deck; - DeckKeywordPtr runSpec(new DeckKeyword("SOLUTION")); - deck.addKeyword(runSpec); - DeckKeywordPtr grid(new DeckKeyword("SCHEDULE")); - deck.addKeyword(grid); + DeckPtr deck(new Deck()); + DeckKeywordPtr solution(new DeckKeyword("SOLUTION")); + deck->addKeyword(solution); + DeckKeywordPtr schedule(new DeckKeyword("SCHEDULE")); + deck->addKeyword(schedule); SOLUTIONSection section(deck); BOOST_CHECK_EQUAL(true, section.hasKeyword("SOLUTION")); BOOST_CHECK_EQUAL(false, section.hasKeyword("SCHEDULE")); } + +BOOST_AUTO_TEST_CASE(SCHEDULESection_NotTerminated) { + DeckPtr deck(new Deck()); + DeckKeywordPtr schedule(new DeckKeyword("SCHEDULE")); + deck->addKeyword(schedule); + DeckKeywordPtr test1(new DeckKeyword("TEST1")); + deck->addKeyword(test1); + DeckKeywordPtr test2(new DeckKeyword("TEST2")); + deck->addKeyword(test2); + DeckKeywordPtr test3(new DeckKeyword("TEST3")); + deck->addKeyword(test3); + SCHEDULESection section(deck); + BOOST_CHECK_EQUAL(true, section.hasKeyword("SCHEDULE")); + BOOST_CHECK_EQUAL(true, section.hasKeyword("TEST1")); + BOOST_CHECK_EQUAL(true, section.hasKeyword("TEST2")); + BOOST_CHECK_EQUAL(true, section.hasKeyword("TEST3")); +}