/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | cfMesh: A library for mesh generation
\\ / O peration |
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
-------------------------------------------------------------------------------
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 3 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, see .
Class
Foam::Module::VRWGraph
Description
This class is an implementation of a graph with variable column width.
The implementation is memory efficient.
SourceFiles
VRWGraphI.H
VRWGraph.C
\*---------------------------------------------------------------------------*/
#ifndef VRWGraph_H
#define VRWGraph_H
#include "labelLongList.H"
#include "DynList.H"
#include "bool.H"
#include "error.H"
#include "graphRow.H"
#include "graphConstRow.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace Module
{
// Forward declarations
class VRWGraph;
Ostream& operator<<(Ostream&, const VRWGraph&);
class rowElement
{
// Private data
//- starting element of the row
label start_;
//- number of elements in the row
label size_;
public:
// Constructors
rowElement() = default;
inline rowElement(const label i, const label j)
:
start_(i),
size_(j)
{}
//- Destructor
~rowElement() = default;
// Member functions
inline label start() const
{
return start_;
}
inline label& start()
{
return start_;
}
inline label size() const
{
return size_;
}
inline label& size()
{
return size_;
}
};
// Useful typedefs
typedef const graphConstRow constRow;
typedef graphRow row;
/*---------------------------------------------------------------------------*\
Class VRWGraph Declaration
\*---------------------------------------------------------------------------*/
class VRWGraph
{
// Private data
//- list containing data
labelLongList data_;
//- number of rows
LongList rows_;
// Private member functions
//- check index
inline void checkIndex(const label i, const label j) const;
// Enumerators
enum typeOfEntries
{
NONE = 0,
INVALIDROW=-10,
FREEENTRY=-11,
FREESTART=-12
};
public:
// Friend classes
friend class VRWGraphSMPModifier;
// Constructors
//- Construct null
inline VRWGraph();
//- Construct given number of rows
explicit inline VRWGraph(const label size);
//- Construct given number of rows and row size
explicit inline VRWGraph
(
const label nRows,
const label nColumnsInRow
);
//- Construct to given number of rows, row size and initialize
explicit inline VRWGraph
(
const label nRows,
const label nColumnsInRow,
const label t
);
//- Copy constructor
inline VRWGraph(const VRWGraph&);
//- Destructor
~VRWGraph() = default;
// Member Functions
// Access
//- Returns the number of rows
inline label size() const;
//- Returns the number of elements in the given row
inline label sizeOfRow(const label rowI) const;
// Edit
//- Reset the number of rows
inline void setSize(const label);
//- Reset the number of rows. The second argument specifies
//- the reserved column width
inline void setSizeAndColumnWidth
(
const label newNumRows,
const label rcWidth
);
//- Set the number of rows and the size of each row
template
inline void setSizeAndRowSize(const ListType&);
//- Reset the size of the given row
inline void setRowSize(const label rowI, const label newSize);
//- Clear the graph
inline void clear();
// Member Operators
//- Append a list as a row at the end of the graph
template
inline void appendList(const ListType& l);
//- Append an element to the given row
inline void append(const label rowI, const label);
//- Append an element to the given row if it does not exist there
inline void appendIfNotIn(const label rowI, const label);
//- Set row with the list
template
inline void setRow(const label rowI, const ListType& l);
//- merge graphs with the identical number of rows
//- into a single one. Use for SMP parallelisation
inline void mergeGraphs(const List& graphParts);
//- set the graph to the reverse of the original graph.
//- the rows of such graph store the rows which contain the elements
//- of the original graph
template
inline void reverseAddressing
(
const label nRows,
const GraphType& origGraph
);
template
inline void reverseAddressing(const GraphType& origGraph);
inline void reverseAddressing
(
const label nRows,
const VRWGraph& origGraph
);
inline void reverseAddressing(const VRWGraph& origGraph);
//- optimize memory usage
// this should be used once the graph will not be resized any more
void optimizeMemoryUsage();
//- check if the element is in the given row (takes linear time)
inline bool found(const label rowI, const label e) const;
inline label find(const label rowI, const label e) const;
//- get and set operators
inline label operator()(const label i, const label j) const;
inline label& operator()(const label i, const label j);
inline constRow operator[](const label i) const;
inline row operator[](const label i);
//- Assignment operator
inline void operator=(const VRWGraph&);
// IOstream operators
// Write VRWGraph to Ostream.
friend Ostream& operator<<(Ostream&, const VRWGraph&);
//- Read from Istream, discarding contents of existing VRWGraph.
/* friend Istream& operator>>
(
Istream&,
VRWGraph&
);
*/
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Module
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "VRWGraphI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#define forAllRow(graph, rowI, index) \
for (Foam::label index = 0; index < (graph).sizeOfRow(rowI); ++index)
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //