-
Mark Olesen authored
- Hash returns unsigned - FixedList templated on unsigned int - include uLabel.H in UList, HashTable etc. so the output function is know throughout
Mark Olesen authored- Hash returns unsigned - FixedList templated on unsigned int - include uLabel.H in UList, HashTable etc. so the output function is know throughout
DLListBase.H 7.37 KiB
/*---------------------------------------------------------------------------*\
========= |
\\ / 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::DLListBase
Description
Base doubly-linked list.
SourceFiles
DLListBase.C
\*---------------------------------------------------------------------------*/
#ifndef DLListBase_H
#define DLListBase_H
#include "bool.H"
#include "label.H"
#include "uLabel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class DLListBase Declaration
\*---------------------------------------------------------------------------*/
class DLListBase
{
public:
//- Link structure
struct link
{
//- Pointer to next entry in list
link *prev_, *next_;
//- Null construct
inline link();
//- Check if the link is registered with the DLListBase
inline bool registered() const;
//- Deregister the link after removal
inline void deregister();
};
private:
// Private data
//- first_ points to first element and last_ points to last element.
link *first_, *last_;
//- Number of elements in in list
label nElmts_;
// Private member functions
//- Disallow default bitwise copy construct
DLListBase(const DLListBase&);
//- Disallow default bitwise assignment
void operator=(const DLListBase&);
public:
// Forward declaration of STL iterators
class iterator;
friend class iterator;
class const_iterator;
friend class const_iterator;
// Constructors
//- Null construct
inline DLListBase();
//- Construct given initial entry
inline DLListBase(link*);
// Destructor
~DLListBase();
// Member Functions
// Access
//- Return number of elements in list
inline label size() const;
//- Return true if the list is empty
inline bool empty() const;
//- Return first entry
inline link* first();
//- Return const access to first entry
inline const link* first() const;
//- Return last entry
inline link* last();
//- Return const access to last entry
inline const link* last() const;
// Edit
//- Add at head of list
void insert(link*);
//- Add at tail of list
void append(link*);
//- Swap this element with the one above unless it is at the top
bool swapUp(link*);
//- Swap this element with the one below unless it is at the bottom
bool swapDown(link*);
//- Remove and return head
link* removeHead();
//- Remove and return element
link* remove(link*);
// Remove and return element specified by iterator
inline link* remove(iterator&);
//- Replace oldLink with newLink and return element
link* replace(link* oldLink, link* newLink);
//- Replace oldIter with newLink and return element
inline link* replace(iterator& oldIter, link* newLink);
//- Clear the list
inline void clear();
//- Transfer the contents of the argument into this List
// and annull the argument list.
inline void transfer(DLListBase&);
// STL iterator
//- An STL-conforming iterator
class iterator
{
friend class DLListBase;
friend class const_iterator;
// Private data
//- Reference to the list this is an iterator for
DLListBase& curList_;
//- Current element
link* curElmt_;
//- Copy of the link
link curLink_;
// Private Member Functions
//- Construct for a given SLListBase with NULL element and link.
// Only used to create endIter
inline iterator(DLListBase&);
public:
//- Construct for a given DLListBase and link
inline iterator(DLListBase&, link*);
// Member operators
inline void operator=(const iterator&);
inline bool operator==(const iterator&) const;
inline bool operator!=(const iterator&) const;
inline link& operator*();
inline iterator& operator++();
inline iterator operator++(int);
};
inline iterator begin();
inline const iterator& end();
// STL const_iterator
//- An STL-conforming const_iterator
class const_iterator
{
// Private data
//- Reference to the list this is an iterator for
const DLListBase& curList_;
//- Current element
const link* curElmt_;
public:
//- Construct for a given DLListBase and link
inline const_iterator(const DLListBase&, const link*);
//- Construct from a non-const iterator
inline const_iterator(const iterator&);
// Member operators
inline void operator=(const const_iterator&);
inline bool operator==(const const_iterator&) const;
inline bool operator!=(const const_iterator&) const;
inline const link& operator*();
inline const_iterator& operator++();
inline const_iterator operator++(int);
};
inline const_iterator cbegin() const;
inline const const_iterator& cend() const;
inline const_iterator begin() const;
inline const const_iterator& end() const;
private:
//- iterator returned by end()
static iterator endIter_;
//- const_iterator returned by end()
static const_iterator endConstIter_;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "DLListBaseI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //