Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / applications / utilities / mesh / generation / extrude / extrudeToRegionMesh / patchPointEdgeCirculator.H
blob7249f83fcda0a76305873463b2af1a96fe3ca61f
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::patchPointEdgeCirculator
27 Description
28     Walks from starting edge/face around point on patch.
30     -# Use in-place: \n
31         \code
32             patchPointEdgeCirculator circ(..);
34             // Walk
35             do
36             {
37                 Info<< "edge:" << circ.edgeID() << endl;
38                 ++circ;
39             }
40             while (circ != circ.end());
41         \endcode
43     -# Use like STL iterator: \n
44         \code
45             patchPointEdgeCirculator circ(..);
46             for
47             (
48                 patchPointEdgeCirculator iter = circ.begin();
49                 iter != circ.end();
50                 ++iter
51             )
52             {
53                 Info<< "edge:" << iter.edgeID() << endl;
54             }
55         \endcode
58 SourceFiles
59     patchPointEdgeCirculator.C
61 \*---------------------------------------------------------------------------*/
63 #ifndef patchPointEdgeCirculator_H
64 #define patchPointEdgeCirculator_H
66 #include "face.H"
67 #include "ListOps.H"
68 #include "primitiveFacePatch.H"
69 #include "PackedBoolList.H"
70 #include "InfoProxy.H"
72 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
74 namespace Foam
77 // Forward declaration of classes
79 /*---------------------------------------------------------------------------*\
80                            Class patchPointEdgeCirculator Declaration
81 \*---------------------------------------------------------------------------*/
83 class patchPointEdgeCirculator
85     // Static data members
87         //- end iterator
88         static const patchPointEdgeCirculator endConstIter;
91     // Private data
93         //- Patch
94         const primitiveFacePatch& patch_;
96         const PackedBoolList& nonManifoldEdge_;
98         //- Current edge
99         label edgeID_;
101         //- Current direction (face, expressed as index into edgeFaces()[edgeID]
102         label index_;
104         //- Point
105         label pointID_;
107         //- Starting edge so we know when to stop.
108         label startEdgeID_;
111     // Private Member Functions
113         //- Set to end() iterator
114         inline void setEnd();
116         //- Set edgeID_ to be the other edge on the face that uses the
117         //  point.
118         inline void otherEdge(const label cellI);
120 public:
122     // Constructors
124         //- Construct from components
125         inline patchPointEdgeCirculator
126         (
127             const primitiveFacePatch&,
128             const PackedBoolList& nonManifoldEdge,
129             const label edgeID,
130             const label index,
131             const label pointID
132         );
134         //- Construct as copy
135         inline patchPointEdgeCirculator(const patchPointEdgeCirculator&);
138     // Member Functions
140         inline label edgeID() const;
142         inline label index() const;
144         inline label pointID() const;
146         //- Helper: get face according to the index.
147         //  Returns -1 if on end.
148         inline label faceID() const;
150         //- Walk back until non-manifold edge (if any) or minimum edge.
151         inline void setCanonical();
154     // Member Operators
156         inline void operator=(const patchPointEdgeCirculator& iter);
158         inline bool operator==(const patchPointEdgeCirculator& iter) const;
160         inline bool operator!=(const patchPointEdgeCirculator& iter) const;
162         //- Step to next face.
163         inline patchPointEdgeCirculator& operator++();
165         //- iterator set to the beginning face. For internal edges this is
166         //  the current face. For boundary edges this is the first boundary face
167         //  reached from walking back (i.e. in opposite direction to ++)
168         inline patchPointEdgeCirculator begin() const;
169         inline patchPointEdgeCirculator cbegin() const;
171         //- iterator set to beyond the end of the walk.
172         inline const patchPointEdgeCirculator& end() const;
173         inline const patchPointEdgeCirculator& cend() const;
175     // Info
177         //- Return info proxy.
178         //  Used to print token information to a stream
179         InfoProxy<patchPointEdgeCirculator> info() const
180         {
181             return *this;
182         }
184         friend Ostream& operator<<
185         (
186             Ostream&,
187             const InfoProxy<patchPointEdgeCirculator>&
188         );
191 Ostream& operator<<(Ostream&, const InfoProxy<patchPointEdgeCirculator>&);
193 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
195 } // End namespace Foam
197 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
199 #include "patchPointEdgeCirculatorI.H"
201 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
203 #endif
205 // ************************************************************************* //