From 49ac9f45681d316bf0bb7e88736b19c326bbf25a Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Mon, 14 Oct 2013 21:30:17 +0200 Subject: [PATCH] ParserIntItem::scan() implemented with (temporary) specialized code --- opm/parser/eclipse/Parser/ParserIntItem.cpp | 53 ++++++++++++++++----- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/opm/parser/eclipse/Parser/ParserIntItem.cpp b/opm/parser/eclipse/Parser/ParserIntItem.cpp index 383f94ab1..f4d014703 100644 --- a/opm/parser/eclipse/Parser/ParserIntItem.cpp +++ b/opm/parser/eclipse/Parser/ParserIntItem.cpp @@ -23,7 +23,7 @@ #include #include #include - +#include namespace Opm { @@ -56,22 +56,51 @@ namespace Opm { m_defaultSet = true; } + /// Scans the rawRecords data according to the ParserItems definition. /// returns a DeckItem object. /// NOTE: data are popped from the rawRecords deque! DeckItemConstPtr ParserIntItem::scan(RawRecordPtr rawRecord) const { DeckIntItemPtr deckItem(new DeckIntItem(name())); - - bool scanAll = (sizeType() == ALL); - bool defaultActive; - std::deque intsPreparedForDeckItem = readFromRawRecord(rawRecord, scanAll, m_default, defaultActive); - - if (scanAll) - deckItem->push_back(intsPreparedForDeckItem); - else { - deckItem->push_back(intsPreparedForDeckItem.front()); - intsPreparedForDeckItem.pop_front(); - pushBackToRecord(rawRecord, intsPreparedForDeckItem, defaultActive); + int defaultValue = m_default; + if (sizeType() == ALL) { // This can probably not be combined with a default value .... + // The '*' should be interpreted as a multiplication sign + while (rawRecord->size() > 0) { + std::string token = rawRecord->pop_front(); + if (tokenContainsStar( token )) { + StarToken st(token); + int value = defaultValue; + if (st.hasValue()) + value = st.value(); + deckItem->push_backMultiple( value , st.multiplier() ); + } else { + int value = readValueToken(token); + deckItem->push_back(value); + } + } + } else { + // The '*' should be interpreted as a default indicator + if (rawRecord->size() > 0) { + std::string token = rawRecord->pop_front(); + if (tokenContainsStar( token )) { + StarToken st(token); + + if (st.hasValue()) { // Probably never true + deckItem->push_back( st.value() ); + std::string stringValue = boost::lexical_cast(st.value()); + for (size_t i=1; i < st.multiplier(); i++) + rawRecord->push_front( stringValue ); + } else { + deckItem->push_backDefault( defaultValue ); + for (size_t i=1; i < st.multiplier(); i++) + rawRecord->push_front( "*" ); + } + } else { + int value = readValueToken(token); + deckItem->push_back(value); + } + } else + deckItem->push_backDefault( defaultValue ); } return deckItem; }