14#ifndef DENSEDOUBLYINDEXED_HPP_
15#define DENSEDOUBLYINDEXED_HPP_
23 namespace InterpreterClass
29 template<
class ValueClass >
39 int const secondIndex );
47 int const secondIndex )
const;
54 {
return (*
this)( indexPair.first,
57 operator()( std::pair< int, int >
const& indexPair )
const
58 {
return (*
this)( indexPair.first,
62 int const secondIndex )
const;
65 hasEntry( std::pair< int, int >
const& indexPair )
const
68 virtual std::string
const&
85 int const secondIndex );
96 template<
class ValueClass >
101 firstRecordingIndex( 0 ),
102 secondRecordingIndex( 0 ),
103 largestFirstIndex( 0 ),
104 largestSecondIndex( 0 )
109 template<
class ValueClass >
117 template<
class ValueClass >
120 int const secondIndex )
127 return findOrMakeEntry( firstIndex,
131 template<
class ValueClass >
132 inline ValueClass
const&
134 int const secondIndex )
const
140 if( hasEntry( firstIndex,
143 return valueMatrix[ firstIndex - 1 ][ secondIndex - 1 ];
147 return this->defaultUnsetValue;
152 template<
class ValueClass >
155 int const secondIndex )
const
157 if( ( 0 < firstIndex )
161 ( firstIndex <= valueMatrix.getSize() )
163 ( (
size_t)secondIndex <= valueMatrix[ firstIndex - 1 ].size() ) )
173 template<
class ValueClass >
174 inline std::string
const&
178 this->stringInterpretation.clear();
179 for(
int firstIndex( 1 );
180 largestFirstIndex >= firstIndex;
183 for(
size_t secondIndex( 1 );
184 largestSecondIndex >= secondIndex;
187 this->indexPrintingVector[ 0 ] = firstIndex;
188 this->indexPrintingVector[ 1 ] = secondIndex;
189 this->stringInterpretation.append(
190 this->indicesToPrintingString() );
193 this->stringInterpretation.append( this->valueToPrintingString(
194 findOrMakeEntry( firstIndex,
196 this->stringInterpretation.append(
"\n" );
199 return this->stringInterpretation;
202 template<
class ValueClass >
208 valueMatrix.clearEntries();
211 template<
class ValueClass >
214 int const secondIndex )
218 if( firstIndex > largestFirstIndex )
220 largestFirstIndex = firstIndex;
222 if( (
size_t)secondIndex > largestSecondIndex )
224 largestSecondIndex = secondIndex;
226 while( valueMatrix.getSize() < firstIndex )
228 valueMatrix.newEnd().clear();
231 if( valueMatrix[ (--firstIndex) ].size() < (
size_t)secondIndex )
235 valueMatrix[ firstIndex ].resize( secondIndex,
236 this->defaultUnsetValue );
238 return valueMatrix[ firstIndex ][ secondIndex - 1 ];
241 template<
class ValueClass >
245 valueMatrix.clearEntries();
246 for(
int whichLine( this->currentStringBlock->getNumberOfBodyLines() );
251 (*(this->currentStringBlock))[ whichLine ].first,
252 &(this->lineRemainderA),
254 if( !(this->currentWord.empty()) )
259 this->lineRemainderA,
260 &(this->lineRemainderB),
265 this->lineRemainderB,
267 if( ( 0 < firstRecordingIndex )
269 ( 0 < secondRecordingIndex )
271 !(this->currentWord.empty()) )
273 findOrMakeEntry( firstRecordingIndex,
274 secondRecordingIndex )
275 = this->stringToValue( this->currentWord );
277 else if( this->isVerbose )
281 <<
"LHPC::SLHA::error! expected to find 2 positive indices then"
282 <<
" a value, instead found \""
283 << (*(this->currentStringBlock))[ whichLine ].first <<
"\"";
284 std::cout << std::endl;
static std::string firstWordOf(std::string const &stringToParse, std::string *const remainderString=NULL, std::string const &separatorChars=whitespaceChars)
static std::string const whitespaceAndNewlineChars
static std::string trimFromFrontAndBack(std::string const &stringToTrim, std::string const &charsToTrim=whitespaceAndNewlineChars)
static int stringToInt(std::string const &stringToInterpret)
virtual std::string const & getAsString()
ValueClass const & operator()(std::pair< int, int > const &indexPair) const
virtual ~DenseDoublyIndexed()
bool hasEntry(std::pair< int, int > const &indexPair) const
virtual void interpretCurrentStringBlock()
bool hasEntry(int const firstIndex, int const secondIndex) const
size_t largestSecondIndex
virtual void clearEntries()
ValueClass & findOrMakeEntry(int firstIndex, int const secondIndex)
BOL::VectorlikeArray< std::vector< ValueClass > > valueMatrix
ValueClass & operator()(std::pair< int, int > const &indexPair)
size_t secondRecordingIndex
ValueClass & operator()(int const firstIndex, int const secondIndex)