/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA \*---------------------------------------------------------------------------*/ #include "StaticHashTable.H" #include "Istream.H" #include "Ostream.H" // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template Foam::StaticHashTable::StaticHashTable ( Istream& is, const label size ) : StaticHashTableName(), keys_(size), objects_(size), nElmts_(0), endIter_(*this, keys_.size(), 0), endConstIter_(*this, keys_.size(), 0) { if (size < 1) { FatalErrorIn ( "StaticHashTable::StaticHashTable(const label size)" ) << "Illegal size " << size << " for StaticHashTable." << " Minimum size is 1" << abort(FatalError); } operator>>(is, *this); } // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // template Foam::Istream& Foam::operator>>(Istream& is, StaticHashTable& L) { is.fatalCheck("operator>>(Istream&, StaticHashTable&)"); // Anull list L.clear(); is.fatalCheck("operator>>(Istream&, StaticHashTable&)"); token firstToken(is); is.fatalCheck ( "operator>>(Istream&, StaticHashTable&) : " "reading first token" ); if (firstToken.isLabel()) { label s = firstToken.labelToken(); // Read beginning of contents char listDelimiter = is.readBeginList("StaticHashTable"); if (s) { if (2*s > L.keys_.size()) { L.resize(2*s); } if (listDelimiter == token::BEGIN_LIST) { for (label i=0; i> key; L.insert(key, pTraits(is)); is.fatalCheck ( "operator>>(Istream&, StaticHashTable&)" " : reading entry" ); } } else { FatalIOErrorIn ( "operator>>(Istream&, StaticHashTable&)", is ) << "incorrect first token, '(', found " << firstToken.info() << exit(FatalIOError); } } // Read end of contents is.readEndList("StaticHashTable"); } else if (firstToken.isPunctuation()) { if (firstToken.pToken() != token::BEGIN_LIST) { FatalIOErrorIn ( "operator>>(Istream&, StaticHashTable&)", is ) << "incorrect first token, '(', found " << firstToken.info() << exit(FatalIOError); } token lastToken(is); while ( !( lastToken.isPunctuation() && lastToken.pToken() == token::END_LIST ) ) { is.putBack(lastToken); Key key; is >> key; T element; is >> element; L.insert(key, element); is.fatalCheck ( "operator>>(Istream&, StaticHashTable&) : " "reading entry" ); is >> lastToken; } } else { FatalIOErrorIn ( "operator>>(Istream&, StaticHashTable&)", is ) << "incorrect first token, expected or '(', found " << firstToken.info() << exit(FatalIOError); } is.fatalCheck("operator>>(Istream&, StaticHashTable&)"); return is; } template Foam::Ostream& Foam::operator<< ( Ostream& os, const StaticHashTable& L) { // Write size and start delimiter os << nl << L.size() << nl << token::BEGIN_LIST << nl; // Write contents for ( typename StaticHashTable::const_iterator iter = L.begin(); iter != L.end(); ++iter ) { os << iter.key() << token::SPACE << iter() << nl; } // Write end delimiter os << token::END_LIST; // Check state of IOstream os.check("Ostream& operator<<(Ostream&, const StaticHashTable&)"); return os; } // ************************************************************************* //