00001 /* @HEADER@ */ 00002 // ************************************************************************ 00003 // 00004 // Sundance 00005 // Copyright 2011 Sandia Corporation 00006 // 00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00008 // the U.S. Government retains certain rights in this software. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are 00012 // met: 00013 // 00014 // 1. Redistributions of source code must retain the above copyright 00015 // notice, this list of conditions and the following disclaimer. 00016 // 00017 // 2. Redistributions in binary form must reproduce the above copyright 00018 // notice, this list of conditions and the following disclaimer in the 00019 // documentation and/or other materials provided with the distribution. 00020 // 00021 // 3. Neither the name of the Corporation nor the names of the 00022 // contributors may be used to endorse or promote products derived from 00023 // this software without specific prior written permission. 00024 // 00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00036 // 00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu) 00038 // 00039 00040 /* @HEADER@ */ 00041 00042 #ifndef SUNDANCE_CELLITERATOR_H 00043 #define SUNDANCE_CELLITERATOR_H 00044 00045 00046 #include "SundanceDefs.hpp" 00047 #include "SundanceSet.hpp" 00048 #include "SundanceMap.hpp" 00049 #include "SundanceCellType.hpp" 00050 #include "SundanceCellReordererImplemBase.hpp" 00051 #include "Teuchos_RefCountPtr.hpp" 00052 #include "SundanceMesh.hpp" 00053 00054 namespace Sundance 00055 { 00056 using namespace Teuchos; 00057 00058 /** 00059 * CellIterator is an iterator for walking through cell sets. 00060 * It satisfies the requirements for an input iterator in STL. 00061 * 00062 * This class design violates the usual rules of good OO style: 00063 * it has polymorphic behavior packed into a single class. The 00064 * justification for this decision is to avoid the expense 00065 * of the clone() operations that would be required by the 00066 * copy ctor for iterators were 00067 * a polymorphic class heirarchy used. 00068 * 00069 * Two cell set types exist: explicit, where the member cells LIDs 00070 * are enumerated in a physical Set<int> object, and implicit, 00071 * where no physical Set is made, rather, the sequence of cell LIDs 00072 * is obtained through some scheme of walking the mesh. 00073 * 00074 * The only cell sets that can represented implicitly are 00075 * the set of all cells of a given dimension. 00076 * 00077 * \see CellSet, CellFilter, CellIteratorPos 00078 */ 00079 class CellIterator : public std::iterator<std::input_iterator_tag, int> 00080 { 00081 public: 00082 00083 00084 /** 00085 * CellIteratorPos is used to specify whether a new CellIterator 00086 * is positioned at the beginning or end of a set. 00087 */ 00088 enum CellIteratorPos {Begin, End}; 00089 00090 /** Empty ctor */ 00091 CellIterator(); 00092 00093 /** Copy ctor */ 00094 CellIterator(const CellIterator& other); 00095 00096 /** Construct an implicit iterator for walking all cells of a given 00097 * dimension on the given mesh. */ 00098 CellIterator(const Mesh& mesh, int cellDim, CellIteratorPos pos); 00099 00100 /** Construct an explicit iterator for walking an explicitly 00101 * enumerated set of cells. */ 00102 CellIterator(const Set<int>* cells, CellIteratorPos pos); 00103 00104 /** */ 00105 CellIterator& operator=(const CellIterator& other); 00106 00107 /** Dereferencing operator */ 00108 const int& operator*() const 00109 { 00110 if (isImplicit_) return currentLID_; 00111 else return *iter_; 00112 } 00113 00114 /** Postfix increment: advances iterator and returns previous value */ 00115 CellIterator operator++(int) 00116 { 00117 CellIterator old = *this; 00118 advance(); 00119 return old; 00120 } 00121 00122 00123 /** Prefix increment: advances iterator, returning new value */ 00124 CellIterator& operator++() 00125 { 00126 advance(); 00127 return *this; 00128 } 00129 00130 /** */ 00131 bool operator==(const CellIterator& other) const 00132 { 00133 if (isImplicit_) 00134 { 00135 return currentLID_ == other.currentLID_; 00136 } 00137 else 00138 { 00139 return iter_ == other.iter_; 00140 } 00141 } 00142 00143 /** */ 00144 bool operator!=(const CellIterator& other) const 00145 { 00146 return !(*this == other); 00147 } 00148 00149 00150 private: 00151 00152 /** Advance the iterator */ 00153 void advance() 00154 { 00155 if (isImplicit_) 00156 { 00157 if (reorderer_ != 0) 00158 { 00159 currentLID_ = reorderer_->advance(currentLID_); 00160 } 00161 else currentLID_++; 00162 } 00163 else iter_++; 00164 } 00165 00166 /** Flag indicating whether this iterator is implicit */ 00167 bool isImplicit_; 00168 00169 /** The LID to which this iterator is currently pointing. 00170 * Used only for implicit iterators. */ 00171 int currentLID_; 00172 00173 /** Unmanaged pointer to the reorderer used for walking 00174 * implicit cell sets. Used only for implicit iterators. */ 00175 const CellReordererImplemBase* reorderer_; 00176 00177 /** iterator for enumerated cells. 00178 * Used only for explicit iterators. */ 00179 Set<int>::const_iterator iter_; 00180 00181 /** */ 00182 static Set<int> dummy() {static Set<int> rtn; return rtn;} 00183 }; 00184 } 00185 00186 00187 #endif