Default: defaultApplied -> setInDeck()

The data values in a deck item can be in three different states, given
by the DeckValue enum in DeckItem.hpp. The three values are:

  SET_IN_DECK : The value has been set explictly in the deck.
  DEFAULT     : The value was not present in the input deck, but a default
                value has been supplied in the configuration and that value
                has been set.
  NOT_SET     : No value has been set for this item; it was not explicitly
                set in the deck and also not included in the configuration.

If you ask for DeckItem->value which is in state NOT_SET you will get an
exception. The method setInDeck() can be used to check if a value has
been set explicitly in the deck; the method defaultApplied() will check
if a default value has been applied.

Observe that the system for handling defaults is not really well suited
for multi valued data items, as it is only a scalar state variable. In
the case of multi valued data items both defaultApplied() and
setInDeck() might return true.
This commit is contained in:
Joakim Hove
2014-08-25 11:20:54 +02:00
parent cebf991210
commit 61cdf7d402
18 changed files with 191 additions and 121 deletions

View File

@@ -82,27 +82,30 @@ namespace Opm {
for (size_t i=0; i<items; i++) {
m_data.push_back(data[i]);
}
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckDoubleItem::push_back(std::deque<double> data) {
push_back( data , data.size() );
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckDoubleItem::push_back(double data) {
m_data.push_back( data );
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckDoubleItem::push_backMultiple(double value, size_t numValues) {
for (size_t i = 0; i < numValues; i++)
m_data.push_back( value );
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckDoubleItem::push_backDefault(double data) {
m_data.push_back( data );
m_valueStatus = DeckValue::DEFAULT;
}
void DeckDoubleItem::push_backMultiple(double value, size_t numValues) {
for (size_t i = 0; i < numValues; i++)
m_data.push_back( value );
m_valueStatus |= DeckValue::DEFAULT;
}

View File

@@ -78,26 +78,30 @@ namespace Opm {
for (size_t i=0; i<items; i++) {
m_data.push_back(data[i]);
}
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckFloatItem::push_back(std::deque<float> data) {
push_back( data , data.size() );
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckFloatItem::push_back(float data) {
m_data.push_back( data );
}
void DeckFloatItem::push_backDefault(float data) {
m_data.push_back( data );
m_valueStatus = DeckValue::DEFAULT;
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckFloatItem::push_backMultiple(float value, size_t numValues) {
for (size_t i = 0; i < numValues; i++)
m_data.push_back( value );
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckFloatItem::push_backDefault(float data) {
m_data.push_back( data );
m_valueStatus |= DeckValue::DEFAULT;
}

View File

@@ -39,25 +39,28 @@ namespace Opm {
for (size_t i = 0; i < items; i++) {
m_data.push_back(data[i]);
}
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckIntItem::push_back(std::deque<int> data) {
push_back(data, data.size());
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckIntItem::push_back(int data) {
m_data.push_back(data);
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckIntItem::push_backMultiple(int value, size_t numValues) {
for (size_t i = 0; i < numValues; i++)
m_data.push_back( value );
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckIntItem::push_backDefault(int data) {
m_data.push_back( data );
m_valueStatus = DeckValue::DEFAULT;
}
void DeckIntItem::push_backMultiple(int value, size_t numValues) {
for (size_t i = 0; i < numValues; i++)
m_data.push_back( value );
m_valueStatus |= DeckValue::DEFAULT;
}

View File

@@ -33,14 +33,30 @@ namespace Opm {
return m_name;
}
bool DeckItem::defaultApplied() const {
if (m_scalar) {
if (m_valueStatus == DeckValue::DEFAULT)
return true;
else
return false;
} else
throw std::invalid_argument("Tried query deckItem: " + m_name + " if default has been applied - that only applies to scalar items");
/**
This function will return true if the item has been explicitly
set in the deck.
*/
bool DeckItem::setInDeck() const {
if ((m_valueStatus & DeckValue::SET_IN_DECK) == DeckValue::SET_IN_DECK)
return true;
else
return false;
}
bool DeckItem::defaultApplied() const {
if ((m_valueStatus & DeckValue::DEFAULT) == DeckValue::DEFAULT)
return true;
else
return false;
}
void DeckItem::assertValueSet() const {
if (m_valueStatus == DeckValue::NOT_SET)
throw std::invalid_argument("Trying to access property: " + name() + " which has not been properly set - either explicitly or with a default.");
}
}

View File

@@ -31,9 +31,10 @@ namespace Opm {
namespace DeckValue {
enum StatusEnum {
VALID = 0,
DEFAULT = 1,
NOT_SET = 2
// These values are used as a bitmask.
NOT_SET = 0 ,
SET_IN_DECK = 1,
DEFAULT = 2
};
}
@@ -43,6 +44,7 @@ namespace Opm {
DeckItem(const std::string& name , bool m_scalar = true);
const std::string& name() const;
bool setInDeck() const;
bool defaultApplied() const;
virtual size_t size() const = 0;
@@ -113,7 +115,8 @@ namespace Opm {
}
protected:
DeckValue::StatusEnum m_valueStatus;
void assertValueSet() const;
int m_valueStatus;
private:
std::string m_name;

View File

@@ -49,29 +49,37 @@ namespace Opm {
for (size_t i = 0; i < items; i++) {
m_data.push_back(data[i]);
}
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckStringItem::push_back(std::deque<std::string> data) {
push_back(data, data.size());
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckStringItem::push_back(std::string data) {
m_data.push_back(data);
void DeckStringItem::push_back(const std::string& data ) {
m_data.push_back( data );
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckStringItem::push_backDefault(std::string data) {
m_data.push_back( data );
m_valueStatus = DeckValue::DEFAULT;
}
void DeckStringItem::push_backMultiple(std::string value, size_t numValues) {
for (size_t i = 0; i < numValues; i++)
m_data.push_back( value );
m_valueStatus |= DeckValue::SET_IN_DECK;
}
void DeckStringItem::push_backDefault(std::string data) {
m_data.push_back( data );
m_valueStatus |= DeckValue::DEFAULT;
}
size_t DeckStringItem::size() const {
return m_data.size();
}

View File

@@ -40,7 +40,7 @@ namespace Opm {
void push_back(std::deque<std::string> data, size_t items);
void push_back(std::deque<std::string> data);
void push_back(std::string value);
void push_back(const std::string& value);
void push_backDefault(std::string value);
void push_backMultiple(std::string value, size_t numItems);

View File

@@ -80,11 +80,15 @@ BOOST_AUTO_TEST_CASE(sizeDouble_correct) {
BOOST_AUTO_TEST_CASE(DefaultApplied) {
BOOST_AUTO_TEST_CASE(SetInDeck) {
DeckDoubleItem deckDoubleItem("TEST");
BOOST_CHECK_EQUAL( false , deckDoubleItem.defaultApplied() );
BOOST_CHECK_EQUAL( false , deckDoubleItem.setInDeck() );
deckDoubleItem.push_backDefault( 1 );
BOOST_CHECK_EQUAL( true , deckDoubleItem.defaultApplied() );
BOOST_CHECK_EQUAL( false , deckDoubleItem.setInDeck() );
deckDoubleItem.push_back( 10 );
BOOST_CHECK_EQUAL( true , deckDoubleItem.setInDeck() );
deckDoubleItem.push_backDefault( 1 );
BOOST_CHECK_EQUAL( true , deckDoubleItem.setInDeck() );
}

View File

@@ -78,12 +78,15 @@ BOOST_AUTO_TEST_CASE(sizeFloat_correct) {
}
BOOST_AUTO_TEST_CASE(DefaultApplied) {
BOOST_AUTO_TEST_CASE(SetInDeck) {
DeckFloatItem deckFloatItem("TEST");
BOOST_CHECK_EQUAL( false , deckFloatItem.defaultApplied() );
BOOST_CHECK_EQUAL( false , deckFloatItem.setInDeck() );
deckFloatItem.push_backDefault( 1 );
BOOST_CHECK_EQUAL( true , deckFloatItem.defaultApplied() );
BOOST_CHECK_EQUAL( false , deckFloatItem.setInDeck() );
deckFloatItem.push_back( 10 );
BOOST_CHECK_EQUAL( true , deckFloatItem.setInDeck() );
deckFloatItem.push_backDefault( 1 );
BOOST_CHECK_EQUAL( true , deckFloatItem.setInDeck() );
}

View File

@@ -84,13 +84,27 @@ BOOST_AUTO_TEST_CASE(size_correct) {
BOOST_CHECK_EQUAL( 3U , deckIntItem.size());
}
BOOST_AUTO_TEST_CASE(DefaultApplied) {
BOOST_AUTO_TEST_CASE(SetInDeck) {
DeckIntItem deckIntItem("TEST");
BOOST_CHECK_EQUAL( false , deckIntItem.defaultApplied() );
BOOST_CHECK( !deckIntItem.setInDeck() );
deckIntItem.push_back( 100 );
BOOST_CHECK( deckIntItem.setInDeck() );
}
BOOST_AUTO_TEST_CASE(SetInDeckData) {
DeckIntItem deckIntItem("TEST");
BOOST_CHECK_EQUAL( false , deckIntItem.setInDeck() );
BOOST_CHECK_EQUAL( false , deckIntItem.defaultApplied());
deckIntItem.push_backDefault( 1 );
BOOST_CHECK_EQUAL( true , deckIntItem.defaultApplied() );
BOOST_CHECK_EQUAL( false , deckIntItem.setInDeck() );
BOOST_CHECK_EQUAL( true , deckIntItem.defaultApplied());
deckIntItem.push_back( 10 );
BOOST_CHECK_EQUAL( true , deckIntItem.setInDeck() );
BOOST_CHECK_EQUAL( true , deckIntItem.defaultApplied());
deckIntItem.push_backDefault( 1 );
BOOST_CHECK_EQUAL( true , deckIntItem.setInDeck() );
}

View File

@@ -71,11 +71,15 @@ BOOST_AUTO_TEST_CASE(size_variouspushes_sizecorrect) {
}
BOOST_AUTO_TEST_CASE(DefaultApplied) {
BOOST_AUTO_TEST_CASE(SetInDeckData) {
DeckStringItem deckStringItem("TEST");
BOOST_CHECK_EQUAL( false , deckStringItem.defaultApplied() );
deckStringItem.push_backDefault( "1" );
BOOST_CHECK_EQUAL( true , deckStringItem.defaultApplied() );
BOOST_CHECK_EQUAL( false , deckStringItem.setInDeck() );
deckStringItem.push_backDefault( "Default" );
BOOST_CHECK_EQUAL( false , deckStringItem.setInDeck() );
deckStringItem.push_back( "Value" );
BOOST_CHECK_EQUAL( true , deckStringItem.setInDeck() );
deckStringItem.push_backDefault( "Deafult" );
BOOST_CHECK_EQUAL( true , deckStringItem.setInDeck() );
}

View File

@@ -626,35 +626,35 @@ namespace Opm {
DeckItemConstPtr K1Item = deckRecord->getItem("K1");
DeckItemConstPtr K2Item = deckRecord->getItem("K2");
size_t defaultCount = 0;
size_t setCount = 0;
if (I1Item->defaultApplied())
defaultCount++;
if (I1Item->setInDeck())
setCount++;
if (I2Item->defaultApplied())
defaultCount++;
if (I2Item->setInDeck())
setCount++;
if (J1Item->defaultApplied())
defaultCount++;
if (J1Item->setInDeck())
setCount++;
if (J2Item->defaultApplied())
defaultCount++;
if (J2Item->setInDeck())
setCount++;
if (K1Item->defaultApplied())
defaultCount++;
if (K1Item->setInDeck())
setCount++;
if (K2Item->defaultApplied())
defaultCount++;
if (defaultCount == 0) {
if (K2Item->setInDeck())
setCount++;
if (setCount == 6) {
boxManager.setKeywordBox( I1Item->getInt(0) - 1,
I2Item->getInt(0) - 1,
J1Item->getInt(0) - 1,
J2Item->getInt(0) - 1,
K1Item->getInt(0) - 1,
K2Item->getInt(0) - 1);
} else if (defaultCount != 6)
throw std::invalid_argument("When using BOX modifiers on keywords you must specify the BOX completely.");
} else if (setCount != 0)
throw std::invalid_argument("When using BOX modifiers on keywords you must specify the BOX completely - or not at all.");
}
}

View File

@@ -63,7 +63,7 @@ namespace Opm {
{
DeckItemConstPtr CFItem = compdatRecord->getItem("CF");
if (CFItem->defaultApplied())
if (!CFItem->setInDeck())
throw std::invalid_argument("The connection factor item can not be defaulted");
}
double CF = compdatRecord->getItem("CF")->getSIDouble(0);

View File

@@ -158,7 +158,7 @@ namespace Opm {
if (well->getHeadJ() != record->getItem("HEAD_J")->getInt(0) - 1) {
throw std::invalid_argument("Unable process WELSPECS for well " + well->name() + ", HEAD_J deviates from existing value");
}
if (well->getRefDepthDefaulted() != record->getItem("REF_DEPTH")->defaultApplied()) {
if (well->getRefDepthDefaulted() == record->getItem("REF_DEPTH")->setInDeck()) {
throw std::invalid_argument("Unable process WELSPECS for well " + well->name() + ", REF_DEPTH defaulted state deviates from existing value");
}
if (!well->getRefDepthDefaulted()) {
@@ -256,25 +256,28 @@ namespace Opm {
properties.injectorType = injectorType;
properties.predictionMode = true;
if (record->getItem("RATE")->defaultApplied())
properties.dropInjectionControl(WellInjector::RATE);
else
if (record->getItem("RATE")->setInDeck())
properties.addInjectionControl(WellInjector::RATE);
if (record->getItem("RESV")->defaultApplied())
properties.dropInjectionControl(WellInjector::RESV);
else
properties.dropInjectionControl(WellInjector::RATE);
if (record->getItem("RESV")->setInDeck())
properties.addInjectionControl(WellInjector::RESV);
if (record->getItem("THP")->defaultApplied())
properties.dropInjectionControl(WellInjector::THP);
else
properties.dropInjectionControl(WellInjector::RESV);
if (record->getItem("THP")->setInDeck())
properties.addInjectionControl(WellInjector::THP);
if (record->getItem("BHP")->defaultApplied())
properties.dropInjectionControl(WellInjector::BHP);
else
properties.dropInjectionControl(WellInjector::THP);
if (record->getItem("BHP")->setInDeck())
properties.addInjectionControl(WellInjector::BHP);
else
properties.dropInjectionControl(WellInjector::BHP);
if (well->isAvailableForGroupControl(currentStep))
properties.addInjectionControl(WellInjector::GRUP);
@@ -410,13 +413,11 @@ namespace Opm {
well->setGuideRate(currentStep, record->getItem("GUIDE_RATE")->getRawDouble(0));
if (record->getItem("PHASE")->defaultApplied()) {
well->setGuideRatePhase(currentStep, GuideRate::UNDEFINED);
}
else {
if (record->getItem("PHASE")->setInDeck()) {
std::string guideRatePhase = record->getItem("PHASE")->getTrimmedString(0);
well->setGuideRatePhase(currentStep, GuideRate::GuideRatePhaseEnumFromString(guideRatePhase));
}
} else
well->setGuideRatePhase(currentStep, GuideRate::UNDEFINED);
well->setGuideRateScalingFactor(currentStep, record->getItem("SCALING_FACTOR")->getRawDouble(0));
}
@@ -455,12 +456,14 @@ namespace Opm {
int headJ = record->getItem("HEAD_J")->getInt(0) - 1;
Phase::PhaseEnum preferredPhase = Phase::PhaseEnumFromString(record->getItem("PHASE")->getTrimmedString(0));
WellPtr well;
if (record->getItem("REF_DEPTH")->defaultApplied()) {
well = std::make_shared<Well>(wellName, headI, headJ, preferredPhase, m_timeMap , timeStep);
} else {
if (record->getItem("REF_DEPTH")->setInDeck()) {
double refDepth = record->getItem("REF_DEPTH")->getSIDouble(0);
well = std::make_shared<Well>(wellName, headI, headJ, refDepth, preferredPhase, m_timeMap , timeStep);
} else {
well = std::make_shared<Well>(wellName, headI, headJ, preferredPhase, m_timeMap , timeStep);
}
m_wells.insert( wellName , well);
}

View File

@@ -50,7 +50,7 @@ namespace Opm {
}
// BHP control must be explictly provided.
if (! record->getItem("BHP")->defaultApplied()) {
if (record->getItem("BHP")->setInDeck()) {
p.addProductionControl(WellProducer::BHP);
}
@@ -78,7 +78,7 @@ namespace Opm {
mode = controlModes.begin(), end = controlModes.end();
mode != end; ++mode)
{
if (! record->getItem(*mode)->defaultApplied()) {
if (record->getItem(*mode)->setInDeck()) {
const WellProducer::ControlModeEnum cmode =
WellProducer::ControlModeFromString(*mode);

View File

@@ -60,11 +60,12 @@ BOOST_AUTO_TEST_CASE( ParseMissingRECORD_THrows) {
const char *data = "\n\
ENDSCALE\n\
1* 1* 2 /\n\
1* 1* 3 /\n\
\n\
ENKRVD\n\
100 * 2 * 2* 6 7 200 11 22 33 3*55 10 /\n\
100 * 2 3 4 5 6 7 200 11 22 33 44 55 66 77 /\n\
100 * 2 3 4 5 6 7 200 11 22 33 44 55 66 * /\n\
";
@@ -75,12 +76,14 @@ BOOST_AUTO_TEST_CASE( parse_DATAWithDefult_OK ) {
DeckKeywordConstPtr keyword = deck->getKeyword( "ENKRVD" );
DeckRecordConstPtr rec0 = keyword->getRecord(0);
DeckRecordConstPtr rec1 = keyword->getRecord(1);
DeckRecordConstPtr rec2 = keyword->getRecord(2);
DeckItemConstPtr item0 = rec0->getItem(0);
DeckItemConstPtr item1 = rec1->getItem(0);
DeckItemConstPtr item2 = rec2->getItem(0);
BOOST_CHECK_EQUAL( 2U , keyword->size());
BOOST_CHECK_THROW( item0->defaultApplied() , std::invalid_argument);
BOOST_CHECK_EQUAL( 3U , keyword->size());
BOOST_CHECK( item0->setInDeck() );
BOOST_CHECK_EQUAL( 100 , item0->getRawDouble(0));
BOOST_CHECK_EQUAL( -1 , item0->getRawDouble(1));
@@ -96,6 +99,8 @@ BOOST_AUTO_TEST_CASE( parse_DATAWithDefult_OK ) {
BOOST_CHECK_EQUAL( 100 , item1->getRawDouble(0));
BOOST_CHECK_EQUAL( -1 , item1->getRawDouble(1));
BOOST_CHECK( item2->setInDeck() );
}

View File

@@ -201,9 +201,9 @@ BOOST_AUTO_TEST_CASE(Equal_Different_ReturnsFalse) {
BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) {
ParserRecord parserRecord;
ParserIntItemConstPtr itemInt(new ParserIntItem("ITEM1", SINGLE));
ParserStringItemConstPtr itemString(new ParserStringItem("ITEM2", SINGLE));
ParserDoubleItemConstPtr itemDouble(new ParserDoubleItem("ITEM3", SINGLE));
ParserIntItemConstPtr itemInt(new ParserIntItem("ITEM1", SINGLE , 100));
ParserStringItemConstPtr itemString(new ParserStringItem("ITEM2", SINGLE , "DEFAULT"));
ParserDoubleItemConstPtr itemDouble(new ParserDoubleItem("ITEM3", SINGLE , 3.14 ));
parserRecord.addItem(itemInt);
parserRecord.addItem(itemString);
@@ -215,9 +215,9 @@ BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) {
DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord);
DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord);
BOOST_CHECK(deckStringItem->defaultApplied());
BOOST_CHECK(deckIntItem->defaultApplied());
BOOST_CHECK(deckDoubleItem->defaultApplied());
BOOST_CHECK(!deckStringItem->setInDeck());
BOOST_CHECK(!deckIntItem->setInDeck());
BOOST_CHECK(!deckDoubleItem->setInDeck());
}
@@ -227,9 +227,9 @@ BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) {
DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord);
DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord);
BOOST_CHECK(deckStringItem->defaultApplied());
BOOST_CHECK(deckIntItem->defaultApplied());
BOOST_CHECK(deckDoubleItem->defaultApplied());
BOOST_CHECK(!deckStringItem->setInDeck());
BOOST_CHECK(!deckIntItem->setInDeck());
BOOST_CHECK(!deckDoubleItem->setInDeck());
}
@@ -238,10 +238,10 @@ BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) {
DeckItemConstPtr deckStringItem = itemString->scan(rawRecord);
DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord);
DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord);
BOOST_CHECK_EQUAL(false, deckStringItem->defaultApplied());
BOOST_CHECK_EQUAL(false, deckIntItem->defaultApplied());
BOOST_CHECK_EQUAL(false, deckDoubleItem->defaultApplied());
BOOST_CHECK(deckStringItem->setInDeck());
BOOST_CHECK(deckIntItem->setInDeck());
BOOST_CHECK(deckDoubleItem->setInDeck());
}
@@ -251,9 +251,9 @@ BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) {
DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord);
DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord);
BOOST_CHECK_EQUAL(true, deckStringItem->defaultApplied());
BOOST_CHECK_EQUAL(true, deckIntItem->defaultApplied());
BOOST_CHECK_EQUAL(true, deckDoubleItem->defaultApplied());
BOOST_CHECK(!deckStringItem->setInDeck());
BOOST_CHECK(!deckIntItem->setInDeck());
BOOST_CHECK(!deckDoubleItem->setInDeck());
}
{
@@ -262,9 +262,9 @@ BOOST_AUTO_TEST_CASE(ParseWithDefault_defaultAppliedCorrectInDeck) {
DeckItemConstPtr deckIntItem = itemInt->scan(rawRecord);
DeckItemConstPtr deckDoubleItem = itemDouble->scan(rawRecord);
BOOST_CHECK_EQUAL(true, deckStringItem->defaultApplied());
BOOST_CHECK_EQUAL(true, deckIntItem->defaultApplied());
BOOST_CHECK_EQUAL(true, deckDoubleItem->defaultApplied());
BOOST_CHECK(!deckStringItem->setInDeck());
BOOST_CHECK(!deckIntItem->setInDeck());
BOOST_CHECK(!deckDoubleItem->setInDeck());
}
}

View File

@@ -99,7 +99,7 @@ size_t MultiRecordTable::getNumFlatItems_(Opm::DeckRecordConstPtr deckRecord)
int result = 0;
for (unsigned i = 0; i < deckRecord->size(); ++ i) {
Opm::DeckItemConstPtr item(deckRecord->getItem(i));
if (i == 0 && item->defaultApplied())
if (i == 0 && !item->setInDeck())
return result;
result += item->size();
}