Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__tria_iterator_h
00013 #define __deal2__tria_iterator_h
00014
00015
00016
00017
00018
00019 #include <deal.II/base/config.h>
00020 #include <deal.II/base/exceptions.h>
00021
00022 #include <deal.II/base/point.h>
00023 #include <deal.II/grid/tria_iterator_base.h>
00024
00025 #include <iterator>
00026
00027
00028
00029 #ifdef HAVE_STD_OSTREAM_HEADER
00030 # include <ostream>
00031 #else
00032 # include <iostream>
00033 #endif
00034
00035 DEAL_II_NAMESPACE_OPEN
00036
00037 template <int dim, int spacedim> class Triangulation;
00038
00039 template <typename> class TriaRawIterator;
00040 template <typename> class TriaIterator;
00041 template <typename> class TriaActiveIterator;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00233 template <typename Accessor>
00234 class TriaRawIterator :
00235 #ifdef HAVE_STD_ITERATOR_CLASS
00236 public std::iterator<std::bidirectional_iterator_tag,Accessor>
00237 #else
00238 public bidirectional_iterator<Accessor,int>
00239 #endif
00240 {
00241 public:
00249 typedef Accessor AccessorType;
00250
00255 TriaRawIterator ();
00256
00260 TriaRawIterator (const TriaRawIterator &);
00261
00278 TriaRawIterator (const Accessor &a);
00279
00286 template <typename OtherAccessor>
00287 TriaRawIterator (const OtherAccessor &a);
00288
00297 TriaRawIterator (const Triangulation<Accessor::dimension,Accessor::space_dimension> *parent,
00298 const int level,
00299 const int index,
00300 const typename AccessorType::AccessorData *local_data = 0);
00301
00317 template <typename OtherAccessor>
00318 TriaRawIterator (const TriaRawIterator<OtherAccessor> &i);
00319
00327 template <typename OtherAccessor>
00328 TriaRawIterator (const TriaIterator<OtherAccessor> &i);
00329
00337 template <typename OtherAccessor>
00338 TriaRawIterator (const TriaActiveIterator<OtherAccessor> &i);
00339
00360 const Accessor & operator * () const;
00361
00366 Accessor & operator * ();
00367
00376 const Accessor * operator -> () const;
00377
00382 Accessor * operator -> ();
00388 TriaRawIterator & operator = (const TriaRawIterator &);
00389
00393
00394
00395
00399
00400
00401
00405
00406
00407
00411 bool operator == (const TriaRawIterator &) const;
00412
00416 bool operator != (const TriaRawIterator &) const;
00417
00435 bool operator < (const TriaRawIterator &) const;
00436
00453 TriaRawIterator & operator ++ ();
00454
00472 TriaRawIterator operator ++ (int);
00473
00488 TriaRawIterator & operator -- ();
00489
00507 TriaRawIterator operator -- (int);
00513 IteratorState::IteratorStates state () const;
00514
00519 void print (std::ostream &out) const;
00520
00521
00527 std::size_t memory_consumption () const;
00528
00529
00536 DeclException1 (ExcDereferenceInvalidCell,
00537 Accessor,
00538 << "You tried to dereference a cell iterator for which this "
00539 << "is not possible. More information on this iterator: "
00540 << "level=" << arg1.level()
00541 << ", index=" << arg1.index()
00542 << ", state="
00543 << (arg1.state() == IteratorState::valid ? "valid" :
00544 (arg1.state() == IteratorState::past_the_end ?
00545 "past_the_end" : "invalid")));
00546
00553 DeclException1 (ExcDereferenceInvalidObject,
00554 Accessor,
00555 << "You tried to dereference an iterator for which this "
00556 << "is not possible. More information on this iterator: "
00557 << "index=" << arg1.index()
00558 << ", state="
00559 << (arg1.state() == IteratorState::valid ? "valid" :
00560 (arg1.state() == IteratorState::past_the_end ?
00561 "past_the_end" : "invalid")));
00562
00566 DeclException0 (ExcAdvanceInvalidObject);
00570 DeclException0 (ExcInvalidComparison);
00571
00573 protected:
00577 Accessor accessor;
00578
00579
00593 template <typename SomeAccessor> friend class TriaRawIterator;
00594 template <typename SomeAccessor> friend class TriaIterator;
00595 template <typename SomeAccessor> friend class TriaActiveIterator;
00596 };
00597
00598
00606 template <typename Accessor>
00607 class TriaIterator : public TriaRawIterator<Accessor>
00608 {
00609 public:
00614 TriaIterator ();
00615
00619 TriaIterator (const TriaIterator<Accessor> &);
00620
00631 TriaIterator (const TriaRawIterator<Accessor> &);
00632
00646 TriaIterator (const Triangulation<Accessor::dimension,Accessor::space_dimension> *parent,
00647 const int level,
00648 const int index,
00649 const typename Accessor::AccessorData *local_data = 0);
00650
00666 template <typename OtherAccessor>
00667 TriaIterator (const TriaIterator<OtherAccessor> &i);
00668
00675 template <typename OtherAccessor>
00676 TriaIterator (const TriaRawIterator<OtherAccessor> &i);
00677
00684 template <typename OtherAccessor>
00685 TriaIterator (const TriaActiveIterator<OtherAccessor> &i);
00686
00690 TriaIterator<Accessor> &
00691 operator = (const TriaIterator<Accessor>&);
00692
00699 TriaIterator<Accessor> &
00700 operator = (const TriaRawIterator<Accessor>&);
00701
00708 template <class OtherAccessor>
00709 TriaIterator<Accessor> &
00710 operator = (const TriaIterator<OtherAccessor>&);
00711
00720 template <class OtherAccessor>
00721 TriaIterator<Accessor> &
00722 operator = (const TriaRawIterator<OtherAccessor>&);
00723
00732 TriaIterator<Accessor> & operator ++ ();
00733
00751 TriaIterator<Accessor> operator ++ (int);
00752
00759 TriaIterator<Accessor> & operator -- ();
00760
00764 TriaIterator<Accessor> operator -- (int);
00770 DeclException0 (ExcAssignmentOfUnusedObject);
00771 };
00772
00773
00783 template <typename Accessor>
00784 class TriaActiveIterator : public TriaIterator<Accessor>
00785 {
00786 public:
00791 TriaActiveIterator ();
00792
00796 TriaActiveIterator (const TriaActiveIterator<Accessor> &);
00797
00808 TriaActiveIterator (const TriaRawIterator<Accessor> &);
00809
00820 TriaActiveIterator (const TriaIterator<Accessor> &);
00821
00835 TriaActiveIterator (const Triangulation<Accessor::dimension,Accessor::space_dimension> *parent,
00836 const int level,
00837 const int index,
00838 const typename Accessor::AccessorData *local_data = 0);
00839
00855 template <typename OtherAccessor>
00856 TriaActiveIterator (const TriaActiveIterator<OtherAccessor> &i);
00857
00868 template <typename OtherAccessor>
00869 TriaActiveIterator (const TriaRawIterator<OtherAccessor> &i);
00870
00874 TriaActiveIterator<Accessor> &
00875 operator = (const TriaActiveIterator<Accessor> &);
00876
00883 TriaActiveIterator<Accessor> &
00884 operator = (const TriaIterator<Accessor> &);
00885
00892 TriaActiveIterator<Accessor> &
00893 operator = (const TriaRawIterator<Accessor> &);
00894
00900 template <class OtherAccessor>
00901 TriaActiveIterator<Accessor> &
00902 operator = (const TriaActiveIterator<OtherAccessor> &);
00903
00912 template <class OtherAccessor>
00913 TriaActiveIterator<Accessor> &
00914 operator = (const TriaRawIterator<OtherAccessor> &);
00915
00924 template <class OtherAccessor>
00925 TriaActiveIterator<Accessor> &
00926 operator = (const TriaIterator<OtherAccessor> &);
00927
00934 TriaActiveIterator<Accessor> & operator ++ ();
00935
00955 TriaActiveIterator<Accessor> operator ++ (int);
00956
00963 TriaActiveIterator<Accessor> & operator -- ();
00964
00968 TriaActiveIterator<Accessor> operator -- (int);
00974 DeclException0 (ExcAssignmentOfInactiveObject);
00975 };
00976
00977
00978
00979
00980
00981 template <typename Accessor>
00982 inline
00983 TriaRawIterator<Accessor>::
00984 TriaRawIterator (const Accessor &a)
00985 :
00986 accessor (a)
00987 {}
00988
00989
00990
00991 template <typename Accessor>
00992 template <typename OtherAccessor>
00993 inline
00994 TriaRawIterator<Accessor>::
00995 TriaRawIterator (const OtherAccessor &a)
00996 :
00997 accessor (a)
00998 {}
00999
01000
01001
01002 template <typename Accessor>
01003 template <typename OtherAccessor>
01004 inline
01005 TriaRawIterator<Accessor>::
01006 TriaRawIterator (const TriaRawIterator<OtherAccessor> &i)
01007 :
01008 accessor (i.accessor)
01009 {}
01010
01011
01012
01013 template <typename Accessor>
01014 template <typename OtherAccessor>
01015 inline
01016 TriaRawIterator<Accessor>::
01017 TriaRawIterator (const TriaIterator<OtherAccessor> &i)
01018 :
01019 accessor (i.accessor)
01020 {}
01021
01022
01023
01024 template <typename Accessor>
01025 template <typename OtherAccessor>
01026 inline
01027 TriaRawIterator<Accessor>::
01028 TriaRawIterator (const TriaActiveIterator<OtherAccessor> &i)
01029 :
01030 accessor (i.accessor)
01031 {}
01032
01033
01034
01035 template <typename Accessor>
01036 inline
01037 const Accessor &
01038 TriaRawIterator<Accessor>::operator * () const
01039 {
01040 Assert (Accessor::structure_dimension!=Accessor::dimension ||
01041 state() == IteratorState::valid,
01042 ExcDereferenceInvalidCell(accessor));
01043 Assert (Accessor::structure_dimension==Accessor::dimension ||
01044 state() == IteratorState::valid,
01045 ExcDereferenceInvalidObject(accessor));
01046
01047 return accessor;
01048 }
01049
01050
01051
01052 template <typename Accessor>
01053 inline
01054 Accessor &
01055 TriaRawIterator<Accessor>::operator * ()
01056 {
01057 Assert (Accessor::structure_dimension!=Accessor::dimension ||
01058 state() == IteratorState::valid,
01059 ExcDereferenceInvalidCell(accessor));
01060 Assert (Accessor::structure_dimension==Accessor::dimension ||
01061 state() == IteratorState::valid,
01062 ExcDereferenceInvalidObject(accessor));
01063
01064 return accessor;
01065 }
01066
01067
01068
01069 template <typename Accessor>
01070 inline
01071 const Accessor *
01072 TriaRawIterator<Accessor>::operator -> () const
01073 {
01074 return &(this->operator* ());
01075 }
01076
01077
01078
01079 template <typename Accessor>
01080 inline
01081 Accessor *
01082 TriaRawIterator<Accessor>::operator -> ()
01083 {
01084 return &(this->operator* ());
01085 }
01086
01087
01088
01089 template <typename Accessor>
01090 inline
01091 IteratorState::IteratorStates
01092 TriaRawIterator<Accessor>::state () const
01093 {
01094 return accessor.state ();
01095 }
01096
01097
01098
01099 template <typename Accessor>
01100 inline
01101 bool
01102 TriaRawIterator<Accessor>::operator < (const TriaRawIterator &i) const
01103 {
01104 Assert (Accessor::structure_dimension!=Accessor::dimension ||
01105 state() != IteratorState::invalid,
01106 ExcDereferenceInvalidCell(accessor));
01107 Assert (Accessor::structure_dimension==Accessor::dimension ||
01108 state() != IteratorState::invalid,
01109 ExcDereferenceInvalidObject(accessor));
01110
01111 Assert (Accessor::structure_dimension!=Accessor::dimension ||
01112 i.state() != IteratorState::invalid,
01113 ExcDereferenceInvalidCell(i.accessor));
01114 Assert (Accessor::structure_dimension==Accessor::dimension ||
01115 i.state() != IteratorState::invalid,
01116 ExcDereferenceInvalidObject(i.accessor));
01117
01118 Assert (&accessor.get_triangulation() == &i.accessor.get_triangulation(),
01119 ExcInvalidComparison());
01120
01121 if (Accessor::structure_dimension==Accessor::dimension)
01122 return ((((accessor.level() < i.accessor.level()) ||
01123 ((accessor.level() == i.accessor.level()) &&
01124 (accessor.index() < i.accessor.index())) ) &&
01125 (state()==IteratorState::valid) &&
01126 (i.state()==IteratorState::valid) ) ||
01127 ((state()==IteratorState::valid) &&
01128 (i.state()==IteratorState::past_the_end)));
01129 else
01130 return ((((accessor.index() < i.accessor.index()) ) &&
01131 (state()==IteratorState::valid) &&
01132 (i.state()==IteratorState::valid) ) ||
01133 ((state()==IteratorState::valid) &&
01134 (i.state()==IteratorState::past_the_end)));
01135 }
01136
01137
01138 template <typename Accessor>
01139 inline
01140 TriaRawIterator<Accessor> &
01141 TriaRawIterator<Accessor>::operator ++ ()
01142 {
01143 Assert (state() == IteratorState::valid, ExcAdvanceInvalidObject());
01144
01145 ++accessor;
01146 return *this;
01147 }
01148
01149
01150
01151 template <typename Accessor>
01152 inline
01153 TriaRawIterator<Accessor> &
01154 TriaRawIterator<Accessor>::operator -- ()
01155 {
01156 Assert (state() == IteratorState::valid, ExcAdvanceInvalidObject());
01157
01158 --accessor;
01159 return *this;
01160 }
01161
01162
01163
01164 template <typename Accessor>
01165 inline
01166 void
01167 TriaRawIterator<Accessor>::print (std::ostream &out) const
01168 {
01169 if (Accessor::structure_dimension==Accessor::dimension)
01170 out << accessor.level() << "." << accessor.index();
01171 else
01172 out << accessor.index();
01173 }
01174
01175
01176
01177 template <typename Accessor>
01178 inline
01179 std::size_t
01180 TriaRawIterator<Accessor>::memory_consumption () const
01181 {
01182 return sizeof(TriaRawIterator<Accessor>);
01183 }
01184
01185
01186
01187 template <typename Accessor>
01188 template <typename OtherAccessor>
01189 inline
01190 TriaIterator<Accessor>::TriaIterator (const TriaIterator<OtherAccessor> &i)
01191 :
01192 TriaRawIterator<Accessor> (i.accessor)
01193 {}
01194
01195
01196
01197 template <typename Accessor>
01198 template <typename OtherAccessor>
01199 inline
01200 TriaIterator<Accessor>::TriaIterator (const TriaActiveIterator<OtherAccessor> &i)
01201 :
01202 TriaRawIterator<Accessor> (i.accessor)
01203 {}
01204
01205
01206
01207 template <typename Accessor>
01208 template <typename OtherAccessor>
01209 inline
01210 TriaIterator<Accessor>::TriaIterator (const TriaRawIterator<OtherAccessor> &i)
01211 :
01212 TriaRawIterator<Accessor> (i.accessor)
01213 {
01214 #ifdef DEBUG
01215
01216
01217
01218
01219
01220
01221 if (this->state() != IteratorState::past_the_end)
01222 Assert (this->accessor.used(),
01223 ExcAssignmentOfUnusedObject());
01224 #endif
01225 }
01226
01227
01228
01229 template <typename Accessor>
01230 template <typename OtherAccessor>
01231 inline
01232 TriaActiveIterator<Accessor>::TriaActiveIterator (const TriaActiveIterator<OtherAccessor> &i)
01233 :
01234 TriaIterator<Accessor> (i.accessor)
01235 {}
01236
01237
01238
01239 template <typename Accessor>
01240 template <typename OtherAccessor>
01241 inline
01242 TriaActiveIterator<Accessor>::TriaActiveIterator (const TriaRawIterator<OtherAccessor> &i)
01243 :
01244 TriaIterator<Accessor> (i)
01245 {
01246 #ifdef DEBUG
01247
01248
01249
01250
01251
01252
01253 if (this->state() != IteratorState::past_the_end)
01254 Assert (this->accessor.has_children()==false,
01255 ExcAssignmentOfInactiveObject());
01256 #endif
01257 }
01258
01259
01260
01269 template <typename Accessor>
01270 inline
01271 std::ostream & operator << (std::ostream &out,
01272 const TriaRawIterator<Accessor> &i)
01273 {
01274 i.print(out);
01275 return out;
01276 }
01277
01278
01279
01288 template <typename Accessor>
01289 inline
01290 std::ostream & operator << (std::ostream &out,
01291 const TriaIterator<Accessor> &i)
01292 {
01293 i.print(out);
01294 return out;
01295 }
01296
01297
01298
01307 template <typename Accessor>
01308 inline
01309 std::ostream & operator << (std::ostream &out,
01310 const TriaActiveIterator<Accessor> &i)
01311 {
01312 i.print(out);
01313 return out;
01314 }
01315
01316
01317 DEAL_II_NAMESPACE_CLOSE
01318
01319
01320
01321 #ifndef DEBUG
01322 # include "tria_iterator.templates.h"
01323 #endif
01324
01325
01326
01327 #endif
01328
01329