Merge pull request #30 from joakim-hove/data-with-space

Data with space
This commit is contained in:
Joakim Hove 2013-10-15 05:23:11 -07:00
commit 2ac8bc55a5
9 changed files with 71 additions and 13 deletions

View File

@ -24,6 +24,8 @@
#include <boost/test/unit_test.hpp>
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
#include <opm/parser/eclipse/Deck/DeckIntItem.hpp>
#include <opm/parser/eclipse/Parser/ParserRecord.hpp>
#include <opm/parser/eclipse/Parser/ParserStringItem.hpp>
#include <boost/test/test_tools.hpp>
using namespace Opm;
@ -112,4 +114,14 @@ BOOST_AUTO_TEST_CASE(get_oneoftwo_returnscorrectitem) {
}
BOOST_AUTO_TEST_CASE(StringsWithSpaceOK) {
ParserStringItemPtr itemString(new ParserStringItem(std::string("STRINGITEM1")));
ParserRecordPtr record1(new ParserRecord());
RawRecordPtr rawRecord(new Opm::RawRecord(" ' VALUE ' /"));
record1->addItem( itemString );
DeckRecordConstPtr deckRecord = record1->parse( rawRecord );
BOOST_CHECK_EQUAL(" VALUE " , deckRecord->getItem(0)->getString(0));
}

View File

@ -72,6 +72,13 @@ namespace Opm {
return m_parserKeywords.find(keyword) != m_parserKeywords.end();
}
bool Parser::dropKeyword(const std::string& keyword) {
if (m_parserKeywords.erase( keyword ) == 1)
return true;
else
return false;
}
ParserKeywordConstPtr Parser::getKeyword(const std::string& keyword) const {
if (hasKeyword(keyword)) {
return m_parserKeywords.at(keyword);

View File

@ -47,6 +47,7 @@ namespace Opm {
/// Method to add ParserKeyword instances, these holding type and size information about the keywords and their data.
void addKeyword(ParserKeywordConstPtr parserKeyword);
bool hasKeyword(const std::string& keyword) const;
bool dropKeyword(const std::string& keyword);
ParserKeywordConstPtr getKeyword(const std::string& keyword) const;
void loadKeywords(const Json::JsonObject& jsonKeywords);

View File

@ -27,6 +27,7 @@
namespace Opm {
ParserIntItem::ParserIntItem(const std::string& itemName) : ParserItem(itemName) {
m_default = defaultInt();
}

View File

@ -27,6 +27,10 @@
namespace Opm {
template<> void ParserItem::fillVectorFromStringStream<std::string>(std::istringstream& inputStream , std::string& token , std::deque<std::string>& dataVector) const {
dataVector.push_back(token);
}
ParserItem::ParserItem(const std::string& itemName, ParserItemSizeEnum sizeType) {
m_name.assign(itemName);
m_sizeType = sizeType;

View File

@ -17,14 +17,39 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
/*
Pushing the converted values onto the dataVector is in this seperate
function to be able to specialize the implementation for type
std::string. The problem is that in the code:
std::istringstream inputStream(" WITH_SPACE ");
inputStream >> stringValue;
The leading and trailing spaces will be stripped from the final
stringValue (have tried manipulating the skipws flag to no
avail). To avoid this a specialized
fillVectorFromStringStream<std::string> implementation is in
ParserItem.cpp.
*/
template<class T> void fillVectorFromStringStream(std::istringstream& inputStream , std::string& token , std::deque<T>& dataVector) const {
T value;
inputStream >> value;
dataVector.push_back(value);
inputStream.get();
if (!inputStream.eof())
throw std::invalid_argument("Spurious data at the end of: <" + token + ">");
}
template<class T> void fillVectorFromStringToken(std::string token, std::deque<T>& dataVector, T defaultValue, bool& defaultActive) const {
std::istringstream inputStream(token);
size_t starPos = token.find('*');
T value;
bool hasStar = (starPos != std::string::npos);
defaultActive = false;
if (hasStar) {
bool singleDefault = (starPos == 0);
@ -37,6 +62,7 @@ template<class T> void fillVectorFromStringToken(std::string token, std::deque<T
} else {
size_t multiplier;
int starChar;
T value;
inputStream >> multiplier;
starChar = inputStream.get();
@ -49,20 +75,16 @@ template<class T> void fillVectorFromStringToken(std::string token, std::deque<T
value = defaultValue;
else
inputStream >> value;
for (size_t i = 0; i < multiplier; i++)
dataVector.push_back(value);
}
} else {
inputStream >> value;
dataVector.push_back(value);
}
inputStream.get();
if (!inputStream.eof())
throw std::invalid_argument("Spurious data at the end of: <" + token + ">");
} else
fillVectorFromStringStream(inputStream , token , dataVector);
}
template<class T> std::deque<T> readFromRawRecord(RawRecordPtr rawRecord, bool scanAll, T defaultValue, bool& defaultActive) const {
std::deque<T> data;
if (rawRecord->size() == 0) {

View File

@ -216,6 +216,14 @@ BOOST_AUTO_TEST_CASE(loadConfigFromDirectory_default) {
}
BOOST_AUTO_TEST_CASE(DropKeyword) {
ParserPtr parser(new Parser());
BOOST_CHECK_EQUAL(false , parser->dropKeyword("DoesNotHaveThis"));
BOOST_CHECK_EQUAL(true , parser->dropKeyword("BPR"));
BOOST_CHECK_EQUAL(false , parser->dropKeyword("BPR"));
}
/***************** Simple Int parsing ********************************/
ParserKeywordPtr setupParserKeywordInt(std::string name, int numberOfItems) {

View File

@ -1,3 +1,3 @@
{"name" : "GRIDUNIT" , "size" : 1, "items" :
[{"name" : "LengthUnit" , "value_type" : "STRING" , "default" : "METRES"}]
}
[{"name" : "LengthUnit" , "value_type" : "STRING" , "default" : "METRES"},
{"name" : "MAP" , "value_type" : "STRING"}]}

View File

@ -0,0 +1,3 @@
{"name" : "MAPUNITS" , "size" : 1 , "items" : [
{"name" : "UNIT" , "value_type" : "STRING" , "default" : "METRES"}]}