00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef PHX_TEMPLATEITERATOR_HPP
00035 #define PHX_TEMPLATEITERATOR_HPP
00036
00037 #include "Phalanx_ConfigDefs.hpp"
00038 #include "Phalanx_TemplateManager.hpp"
00039
00040 namespace PHX {
00041
00050 template <typename TypeSeq, typename BaseT, typename ObjectT>
00051 class TemplateIterator : public std::iterator<std::input_iterator_tag,
00052 BaseT> {
00053 public:
00054
00056 TemplateIterator(
00057 PHX::TemplateManager<TypeSeq,BaseT,ObjectT>& m,
00058 typename std::vector< Teuchos::RCP<BaseT> >::iterator p) :
00059 manager(&m), object_iterator(p) {}
00060
00061
00062
00063
00065 bool operator==(const TemplateIterator& t) const {
00066 return object_iterator == t.objectIterator;
00067 }
00068
00070 bool operator!=(const TemplateIterator& t) const {
00071 return object_iterator != t.object_iterator;
00072 }
00073
00075 typename PHX::TemplateIterator<TypeSeq, BaseT, ObjectT>::reference
00076 operator*() const {
00077 return *(*object_iterator);
00078 }
00079
00081 typename PHX::TemplateIterator<TypeSeq, BaseT, ObjectT>::pointer
00082 operator->() const {
00083 return &(*(*object_iterator));
00084 }
00085
00087 TemplateIterator& operator++() {
00088 ++object_iterator;
00089 return *this;
00090 }
00091
00093 TemplateIterator operator++(int) {
00094 TemplateIterator tmp = *this;
00095 ++(*this);
00096 return tmp;
00097 }
00098
00100 Teuchos::RCP<BaseT> rcp() const {
00101 return *object_iterator;
00102 }
00103
00104 private:
00105
00107 PHX::TemplateManager<TypeSeq,BaseT,ObjectT>* manager;
00108
00110 typename std::vector< Teuchos::RCP<BaseT> >::iterator object_iterator;
00111
00112 };
00113
00122 template <typename TypeSeq, typename BaseT, typename ObjectT>
00123 class ConstTemplateIterator : public std::iterator<std::input_iterator_tag,
00124 BaseT> {
00125 public:
00126
00128 ConstTemplateIterator(
00129 const PHX::TemplateManager<TypeSeq,BaseT,ObjectT>& m,
00130 typename std::vector< Teuchos::RCP<BaseT> >::const_iterator p) :
00131 manager(&m), object_iterator(p) {}
00132
00133
00134
00135
00137 bool operator==(const ConstTemplateIterator& t) const {
00138 return object_iterator == t.objectIterator;
00139 }
00140
00142 bool operator!=(const ConstTemplateIterator& t) const {
00143 return object_iterator != t.object_iterator;
00144 }
00145
00147 const typename PHX::ConstTemplateIterator<TypeSeq, BaseT, ObjectT>::reference
00148 operator*() const {
00149 return *(*object_iterator);
00150 }
00151
00153 const typename PHX::ConstTemplateIterator<TypeSeq, BaseT, ObjectT>::pointer
00154 operator->() const {
00155 return &(*(*object_iterator));
00156 }
00157
00159 ConstTemplateIterator& operator++() {
00160 ++object_iterator;
00161 return *this;
00162 }
00163
00165 ConstTemplateIterator operator++(int) {
00166 ConstTemplateIterator tmp = *this;
00167 ++(*this);
00168 return tmp;
00169 }
00170
00172 Teuchos::RCP<BaseT> rcp() const {
00173 return *object_iterator;
00174 }
00175
00176 private:
00177
00179 const PHX::TemplateManager<TypeSeq,BaseT,ObjectT>* manager;
00180
00182 typename std::vector< Teuchos::RCP<BaseT> >::const_iterator object_iterator;
00183
00184 };
00185
00186 }
00187
00188 #endif