mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
- it was possible to create a PackedList::iterator from a PackedList::const_iterator and violate const-ness - added HashTable::printInfo for emitting some information - changed default table sizes from 100 -> 128 in preparation for future 2^n table sizes
221 lines
5.8 KiB
C++
221 lines
5.8 KiB
C++
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / 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
|
|
|
|
Class
|
|
Foam::HashSet
|
|
|
|
Description
|
|
A HashTable with keys but without contents.
|
|
|
|
Typedef
|
|
Foam::wordHashSet
|
|
|
|
Description
|
|
A HashSet with (the default) word keys.
|
|
|
|
Typedef
|
|
Foam::labelHashSet
|
|
|
|
Description
|
|
A HashSet with label keys.
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef HashSet_H
|
|
#define HashSet_H
|
|
|
|
#include "HashTable.H"
|
|
#include "nil.H"
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
namespace Foam
|
|
{
|
|
|
|
/*---------------------------------------------------------------------------*\
|
|
Class HashSet Declaration
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
template<class Key=word, class Hash=string::hash>
|
|
class HashSet
|
|
:
|
|
public HashTable<nil, Key, Hash>
|
|
{
|
|
|
|
public:
|
|
|
|
typedef typename HashTable<nil, Key, Hash>::iterator iterator;
|
|
typedef typename HashTable<nil, Key, Hash>::const_iterator const_iterator;
|
|
|
|
|
|
// Constructors
|
|
|
|
//- Construct given initial size
|
|
HashSet(const label size = 128)
|
|
:
|
|
HashTable<nil, Key, Hash>(size)
|
|
{}
|
|
|
|
//- Construct from Istream
|
|
HashSet(Istream& is)
|
|
:
|
|
HashTable<nil, Key, Hash>(is)
|
|
{}
|
|
|
|
//- Construct from UList of Key
|
|
HashSet(const UList<Key>& lst)
|
|
:
|
|
HashTable<nil, Key, Hash>(2*lst.size())
|
|
{
|
|
forAll(lst, i)
|
|
{
|
|
insert(lst[i]);
|
|
}
|
|
}
|
|
|
|
//- Construct as copy
|
|
HashSet(const HashSet<Key, Hash>& hs)
|
|
:
|
|
HashTable<nil, Key, Hash>(hs)
|
|
{}
|
|
|
|
//- Construct by transferring the parameter contents
|
|
HashSet(const Xfer<HashSet<Key, Hash> >& hs)
|
|
:
|
|
HashTable<nil, Key, Hash>(hs)
|
|
{}
|
|
|
|
//- Construct by transferring the parameter contents
|
|
HashSet(const Xfer<HashTable<nil, Key, Hash> >& hs)
|
|
:
|
|
HashTable<nil, Key, Hash>(hs)
|
|
{}
|
|
|
|
//- Construct from the keys of another HashTable,
|
|
// the type of values held is arbitrary.
|
|
template<class AnyType>
|
|
HashSet(const HashTable<AnyType, Key, Hash>&);
|
|
|
|
// Member Functions
|
|
|
|
// Edit
|
|
|
|
//- Insert a new entry
|
|
bool insert(const Key& key)
|
|
{
|
|
return HashTable<nil, Key, Hash>::insert(key, nil());
|
|
}
|
|
|
|
//- Same as insert (cannot overwrite nil content)
|
|
bool set(const Key& key)
|
|
{
|
|
return HashTable<nil, Key, Hash>::insert(key, nil());
|
|
}
|
|
|
|
// Member Operators
|
|
|
|
//- Return true if the entry exists, same as found()
|
|
inline bool operator[](const Key&) const;
|
|
|
|
//- Equality. Two hashtables are equal when their contents are equal.
|
|
// Independent of table size or order.
|
|
bool operator==(const HashSet<Key, Hash>&) const;
|
|
|
|
//- The opposite of the equality operation.
|
|
bool operator!=(const HashSet<Key, Hash>&) const;
|
|
|
|
|
|
//- Combine entries from HashSets
|
|
void operator|=(const HashSet<Key, Hash>&);
|
|
|
|
//- Only retain entries found in both HashSets
|
|
void operator&=(const HashSet<Key, Hash>&);
|
|
|
|
//- Only retain unique entries (xor)
|
|
void operator^=(const HashSet<Key, Hash>&);
|
|
|
|
//- Add entries listed in the given HashSet to this HashSet
|
|
inline void operator+=(const HashSet<Key, Hash>& rhs)
|
|
{
|
|
this->operator|=(rhs);
|
|
}
|
|
|
|
//- Remove entries listed in the given HashSet from this HashSet
|
|
void operator-=(const HashSet<Key, Hash>&);
|
|
|
|
};
|
|
|
|
|
|
// Global Operators
|
|
|
|
//- Combine entries from HashSets
|
|
template<class Key, class Hash>
|
|
HashSet<Key,Hash> operator|
|
|
(
|
|
const HashSet<Key,Hash>& hash1,
|
|
const HashSet<Key,Hash>& hash2
|
|
);
|
|
|
|
|
|
//- Create a HashSet that only contains entries found in both HashSets
|
|
template<class Key, class Hash>
|
|
HashSet<Key,Hash> operator&
|
|
(
|
|
const HashSet<Key,Hash>& hash1,
|
|
const HashSet<Key,Hash>& hash2
|
|
);
|
|
|
|
|
|
//- Create a HashSet that only contains unique entries (xor)
|
|
template<class Key, class Hash>
|
|
HashSet<Key,Hash> operator^
|
|
(
|
|
const HashSet<Key,Hash>& hash1,
|
|
const HashSet<Key,Hash>& hash2
|
|
);
|
|
|
|
|
|
//- A HashSet with word keys.
|
|
typedef HashSet<> wordHashSet;
|
|
|
|
//- A HashSet with label keys.
|
|
typedef HashSet<label, Hash<label> > labelHashSet;
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
} // End namespace Foam
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
#ifdef NoRepository
|
|
# include "HashSet.C"
|
|
#endif
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
#endif
|
|
|
|
// ************************************************************************* //
|