SundanceCellIterator.hpp
Go to the documentation of this file.
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

Site Contact