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 #ifndef SACADO_TEMPLATEITERATOR_HPP
00033 #define SACADO_TEMPLATEITERATOR_HPP
00034
00035 #include <vector>
00036 #include <iterator>
00037
00038 #include "Sacado_TemplateManager.hpp"
00039
00040 namespace Sacado {
00041
00050 template <typename TypeSeq, typename BaseT, template<typename> class ObjectT>
00051 class TemplateIterator : public std::iterator<std::input_iterator_tag,
00052 BaseT> {
00053 public:
00054
00056 TemplateIterator(
00057 Sacado::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 Sacado::TemplateIterator<TypeSeq, BaseT, ObjectT>::reference
00076 operator*() const {
00077 return *(*object_iterator);
00078 }
00079
00081 typename Sacado::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
00099 private:
00100
00102 Sacado::TemplateManager<TypeSeq,BaseT,ObjectT>* manager;
00103
00105 typename std::vector< Teuchos::RCP<BaseT> >::iterator object_iterator;
00106
00107 };
00108
00117 template <typename TypeSeq, typename BaseT, template<typename> class ObjectT>
00118 class ConstTemplateIterator : public std::iterator<std::input_iterator_tag,
00119 BaseT> {
00120 public:
00121
00123 ConstTemplateIterator(
00124 const Sacado::TemplateManager<TypeSeq,BaseT,ObjectT>& m,
00125 typename std::vector< Teuchos::RCP<BaseT> >::const_iterator p) :
00126 manager(&m), object_iterator(p) {}
00127
00128
00129
00130
00132 bool operator==(const ConstTemplateIterator& t) const {
00133 return object_iterator == t.objectIterator;
00134 }
00135
00137 bool operator!=(const ConstTemplateIterator& t) const {
00138 return object_iterator != t.object_iterator;
00139 }
00140
00142 const typename Sacado::ConstTemplateIterator<TypeSeq, BaseT, ObjectT>::reference
00143 operator*() const {
00144 return *(*object_iterator);
00145 }
00146
00148 const typename Sacado::ConstTemplateIterator<TypeSeq, BaseT, ObjectT>::pointer
00149 operator->() const {
00150 return &(*(*object_iterator));
00151 }
00152
00154 ConstTemplateIterator& operator++() {
00155 ++object_iterator;
00156 return *this;
00157 }
00158
00160 ConstTemplateIterator operator++(int) {
00161 ConstTemplateIterator tmp = *this;
00162 ++(*this);
00163 return tmp;
00164 }
00165
00166 private:
00167
00169 const Sacado::TemplateManager<TypeSeq,BaseT,ObjectT>* manager;
00170
00172 typename std::vector< Teuchos::RCP<BaseT> >::const_iterator object_iterator;
00173
00174 };
00175
00176 }
00177
00178 #endif