00001 #ifndef _STR_ApplyVisitor_H_ // -*-c++-*-
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifdef __GNUG__
00022 # pragma interface
00023 #endif
00024
00025
00026
00027
00028
00029 #include <StrMod/UseTrackingVisitor.h>
00030
00031 #define _STR_ApplyVisitor_H_
00032
00033 namespace strmod {
00034 namespace strmod {
00035
00036 class StrChunkPtr;
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 class ApplyVisitor_Base : public UseTrackingVisitor {
00048 public:
00049 static const STR_ClassIdent identifier;
00050
00051
00052
00053
00054
00055 ApplyVisitor_Base(const StrChunkPtr &chunk);
00056
00057
00058
00059
00060
00061
00062 ApplyVisitor_Base(const StrChunkPtr &chunk, LinearExtent &extent);
00063
00064
00065
00066 virtual ~ApplyVisitor_Base() { }
00067
00068 virtual int AreYouA(const lcore::ClassIdent &cid) const {
00069 return((identifier == cid) || UseTrackingVisitor::AreYouA(cid));
00070 }
00071
00072
00073
00074
00075 void apply();
00076
00077 protected:
00078 virtual const lcore::ClassIdent *i_GetIdent() const { return &identifier; }
00079
00080 virtual void use_visitStrChunk(const StrChunkPtr &chunk,
00081 const LinearExtent &used)
00082 throw(halt_visitation)
00083 {
00084 }
00085
00086 virtual void use_visitDataBlock(const void *start, size_t len,
00087 const void *realstart, size_t reallen)
00088 throw(halt_visitation) = 0;
00089
00090 private:
00091 const StrChunkPtr chunk_;
00092 const bool extent_used_;
00093 const LinearExtent extent_;
00094 };
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 template <class _Function>
00106 class ApplyVisitor : public ApplyVisitor_Base {
00107 public:
00108
00109
00110
00111
00112
00113
00114
00115 inline ApplyVisitor(const StrChunkPtr &chunk, _Function &func);
00116
00117
00118
00119
00120
00121
00122
00123
00124 inline ApplyVisitor(const StrChunkPtr &chunk, const LinearExtent &extent,
00125 _Function &func);
00126
00127
00128
00129 inline virtual ~ApplyVisitor();
00130
00131 protected:
00132 inline virtual void use_visitDataBlock(const void *start, size_t len,
00133 const void *realstart, size_t reallen)
00134 throw(halt_visitation);
00135
00136 private:
00137 _Function &func_;
00138 };
00139
00140
00141
00142 template <class _Function> inline
00143 ApplyVisitor<_Function>::ApplyVisitor(const StrChunkPtr &chunk, _Function &func)
00144 : ApplyVisitor_Base(chunk), func_(func)
00145 {
00146 }
00147
00148 template <class _Function> inline
00149 ApplyVisitor<_Function>::ApplyVisitor(const StrChunkPtr &chunk,
00150 const LinearExtent &extent,
00151 _Function &func)
00152 : ApplyVisitor_Base(chunk, extent), func_(func)
00153 {
00154 }
00155
00156 template <class _Function> inline
00157 ApplyVisitor<_Function>::~ApplyVisitor()
00158 {
00159 }
00160
00161 template <class _Function> inline void
00162 ApplyVisitor<_Function>::use_visitDataBlock(const void *start, size_t len,
00163 const void *realstart, size_t reallen)
00164 throw(halt_visitation)
00165 {
00166 func_(start, len);
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 template <class _Function>
00178 inline void for_each(const StrChunkPtr &chunk, _Function &func)
00179 {
00180 ApplyVisitor<_Function> av(chunk, func);
00181 av.apply();
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 template <class _Function>
00194 inline void for_each(const StrChunkPtr &chunk, const LinearExtent &extent,
00195 _Function &func)
00196 {
00197 ApplyVisitor<_Function> av(chunk, extent, func);
00198 av.apply();
00199 }
00200
00201 };
00202 };
00203
00204 #endif