Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
visitor.h
00001 ///\file 00002 00003 /****************************************************************************** 00004 The MIT License(MIT) 00005 00006 Embedded Template Library. 00007 https://github.com/ETLCPP/etl 00008 http://www.etlcpp.com 00009 00010 Copyright(c) 2014 jwellbelove 00011 00012 Permission is hereby granted, free of charge, to any person obtaining a copy 00013 of this software and associated documentation files(the "Software"), to deal 00014 in the Software without restriction, including without limitation the rights 00015 to use, copy, modify, merge, publish, distribute, sublicense, and / or sell 00016 copies of the Software, and to permit persons to whom the Software is 00017 furnished to do so, subject to the following conditions : 00018 00019 The above copyright notice and this permission notice shall be included in all 00020 copies or substantial portions of the Software. 00021 00022 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00023 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00024 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE 00025 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00026 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00027 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 00028 SOFTWARE. 00029 ******************************************************************************/ 00030 00031 #ifndef __ETL_VISITOR__ 00032 #define __ETL_VISITOR__ 00033 00034 #include "platform.h " 00035 00036 //***************************************************************************** 00037 ///\defgroup visitor visitor 00038 /// A set of template classes for easy implementation of the visitor pattern.<br> 00039 /// The visitor design pattern is a way of separating an algorithm from an object 00040 /// structure on which it operates. A practical result of this separation is the 00041 /// ability to add new operations to existing object structures without modifying 00042 /// those structures. It is one way to easily follow the open/closed principle. 00043 /// In essence, the visitor allows one to add new virtual functions to a family 00044 /// of classes without modifying the classes themselves; instead, one creates a 00045 /// visitor class that implements all of the appropriate specialisations of the 00046 /// virtual function. The visitor takes the instance as input, and implements 00047 /// the goal through double dispatch.<br> 00048 /// \ingroup patterns 00049 //***************************************************************************** 00050 00051 namespace etl 00052 { 00053 //***************************************************************** 00054 /// The visitable base class for four visitor types. 00055 /// Derive visitable classes from this. 00056 ///\ingroup visitor 00057 //***************************************************************** 00058 template <typename T1, typename T2 = void, typename T3 = void, typename T4 = void> 00059 class visitable 00060 { 00061 public: 00062 00063 virtual void accept(T1&) = 0; 00064 virtual void accept(T2&) = 0; 00065 virtual void accept(T3&) = 0; 00066 virtual void accept(T4&) = 0; 00067 }; 00068 00069 //***************************************************************** 00070 /// The visitable base class for three visitor types. 00071 /// Derive visitable classes from this. 00072 ///\ingroup visitor 00073 //***************************************************************** 00074 template <typename T1, typename T2, typename T3> 00075 class visitable<T1, T2, T3> 00076 { 00077 public: 00078 00079 virtual void accept(T1&) = 0; 00080 virtual void accept(T2&) = 0; 00081 virtual void accept(T3&) = 0; 00082 }; 00083 00084 //***************************************************************** 00085 /// The visitable base class for two visitor types. 00086 /// Derive visitable classes from this. 00087 ///\ingroup visitor 00088 //***************************************************************** 00089 template <typename T1, typename T2> 00090 class visitable<T1, T2> 00091 { 00092 public: 00093 00094 virtual void accept(T1&) = 0; 00095 virtual void accept(T2&) = 0; 00096 }; 00097 00098 //***************************************************************** 00099 /// The visitable base class for one visitor type. 00100 /// Derive visitable classes from this. 00101 ///\ingroup visitor 00102 //***************************************************************** 00103 template <typename T1> 00104 class visitable<T1> 00105 { 00106 public: 00107 00108 virtual void accept(T1&) = 0; 00109 }; 00110 00111 //***************************************************************** 00112 /// The visitor base class for sixteen types. 00113 /// Derive visitors from this. 00114 ///\ingroup visitor 00115 //***************************************************************** 00116 template <typename T1, typename T2 = void, typename T3 = void, typename T4 = void, 00117 typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void, 00118 typename T9 = void, typename T10 = void, typename T11 = void, typename T12 = void, 00119 typename T13 = void, typename T14 = void, typename T15 = void, typename T16 = void> 00120 class visitor 00121 { 00122 public: 00123 00124 virtual void visit(T1&) = 0; 00125 virtual void visit(T2&) = 0; 00126 virtual void visit(T3&) = 0; 00127 virtual void visit(T4&) = 0; 00128 virtual void visit(T5&) = 0; 00129 virtual void visit(T6&) = 0; 00130 virtual void visit(T7&) = 0; 00131 virtual void visit(T8&) = 0; 00132 virtual void visit(T9&) = 0; 00133 virtual void visit(T10&) = 0; 00134 virtual void visit(T11&) = 0; 00135 virtual void visit(T12&) = 0; 00136 virtual void visit(T13&) = 0; 00137 virtual void visit(T14&) = 0; 00138 virtual void visit(T15&) = 0; 00139 virtual void visit(T16&) = 0; 00140 }; 00141 00142 //***************************************************************** 00143 /// The visitor base class for fifteen types. 00144 /// Derive visitors from this. 00145 ///\ingroup visitor 00146 //***************************************************************** 00147 template <typename T1, typename T2, typename T3, typename T4, 00148 typename T5, typename T6, typename T7, typename T8, 00149 typename T9, typename T10, typename T11, typename T12, 00150 typename T13, typename T14, typename T15> 00151 class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> 00152 { 00153 public: 00154 00155 virtual void visit(T1&) = 0; 00156 virtual void visit(T2&) = 0; 00157 virtual void visit(T3&) = 0; 00158 virtual void visit(T4&) = 0; 00159 virtual void visit(T5&) = 0; 00160 virtual void visit(T6&) = 0; 00161 virtual void visit(T7&) = 0; 00162 virtual void visit(T8&) = 0; 00163 virtual void visit(T9&) = 0; 00164 virtual void visit(T10&) = 0; 00165 virtual void visit(T11&) = 0; 00166 virtual void visit(T12&) = 0; 00167 virtual void visit(T13&) = 0; 00168 virtual void visit(T14&) = 0; 00169 virtual void visit(T15&) = 0; 00170 }; 00171 00172 //***************************************************************** 00173 /// The visitor base class for fourteen types. 00174 /// Derive visitors from this. 00175 ///\ingroup visitor 00176 //***************************************************************** 00177 template <typename T1, typename T2, typename T3, typename T4, 00178 typename T5, typename T6, typename T7, typename T8, 00179 typename T9, typename T10, typename T11, typename T12, 00180 typename T13, typename T14> 00181 class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> 00182 { 00183 public: 00184 00185 virtual void visit(T1&) = 0; 00186 virtual void visit(T2&) = 0; 00187 virtual void visit(T3&) = 0; 00188 virtual void visit(T4&) = 0; 00189 virtual void visit(T5&) = 0; 00190 virtual void visit(T6&) = 0; 00191 virtual void visit(T7&) = 0; 00192 virtual void visit(T8&) = 0; 00193 virtual void visit(T9&) = 0; 00194 virtual void visit(T10&) = 0; 00195 virtual void visit(T11&) = 0; 00196 virtual void visit(T12&) = 0; 00197 virtual void visit(T13&) = 0; 00198 virtual void visit(T14&) = 0; 00199 }; 00200 00201 //***************************************************************** 00202 /// The visitor base class for thirteen types. 00203 /// Derive visitors from this. 00204 ///\ingroup visitor 00205 //***************************************************************** 00206 template <typename T1, typename T2, typename T3, typename T4, 00207 typename T5, typename T6, typename T7, typename T8, 00208 typename T9, typename T10, typename T11, typename T12, 00209 typename T13> 00210 class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> 00211 { 00212 public: 00213 00214 virtual void visit(T1&) = 0; 00215 virtual void visit(T2&) = 0; 00216 virtual void visit(T3&) = 0; 00217 virtual void visit(T4&) = 0; 00218 virtual void visit(T5&) = 0; 00219 virtual void visit(T6&) = 0; 00220 virtual void visit(T7&) = 0; 00221 virtual void visit(T8&) = 0; 00222 virtual void visit(T9&) = 0; 00223 virtual void visit(T10&) = 0; 00224 virtual void visit(T11&) = 0; 00225 virtual void visit(T12&) = 0; 00226 virtual void visit(T13&) = 0; 00227 }; 00228 00229 //***************************************************************** 00230 /// The visitor base class for twelve types. 00231 /// Derive visitors from this. 00232 ///\ingroup visitor 00233 //***************************************************************** 00234 template <typename T1, typename T2, typename T3, typename T4, 00235 typename T5, typename T6, typename T7, typename T8, 00236 typename T9, typename T10, typename T11, typename T12> 00237 class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> 00238 { 00239 public: 00240 00241 virtual void visit(T1&) = 0; 00242 virtual void visit(T2&) = 0; 00243 virtual void visit(T3&) = 0; 00244 virtual void visit(T4&) = 0; 00245 virtual void visit(T5&) = 0; 00246 virtual void visit(T6&) = 0; 00247 virtual void visit(T7&) = 0; 00248 virtual void visit(T8&) = 0; 00249 virtual void visit(T9&) = 0; 00250 virtual void visit(T10&) = 0; 00251 virtual void visit(T11&) = 0; 00252 virtual void visit(T12&) = 0; 00253 }; 00254 00255 //***************************************************************** 00256 /// The visitor base class for eleven types. 00257 /// Derive visitors from this. 00258 ///\ingroup visitor 00259 //***************************************************************** 00260 template <typename T1, typename T2, typename T3, typename T4, 00261 typename T5, typename T6, typename T7, typename T8, 00262 typename T9, typename T10, typename T11> 00263 class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> 00264 { 00265 public: 00266 00267 virtual void visit(T1&) = 0; 00268 virtual void visit(T2&) = 0; 00269 virtual void visit(T3&) = 0; 00270 virtual void visit(T4&) = 0; 00271 virtual void visit(T5&) = 0; 00272 virtual void visit(T6&) = 0; 00273 virtual void visit(T7&) = 0; 00274 virtual void visit(T8&) = 0; 00275 virtual void visit(T9&) = 0; 00276 virtual void visit(T10&) = 0; 00277 virtual void visit(T11&) = 0; 00278 }; 00279 00280 //***************************************************************** 00281 /// The visitor base class for ten types. 00282 /// Derive visitors from this. 00283 ///\ingroup visitor 00284 //***************************************************************** 00285 template <typename T1, typename T2, typename T3, typename T4, 00286 typename T5, typename T6, typename T7, typename T8, 00287 typename T9, typename T10> 00288 class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> 00289 { 00290 public: 00291 00292 virtual void visit(T1&) = 0; 00293 virtual void visit(T2&) = 0; 00294 virtual void visit(T3&) = 0; 00295 virtual void visit(T4&) = 0; 00296 virtual void visit(T5&) = 0; 00297 virtual void visit(T6&) = 0; 00298 virtual void visit(T7&) = 0; 00299 virtual void visit(T8&) = 0; 00300 virtual void visit(T9&) = 0; 00301 virtual void visit(T10&) = 0; 00302 }; 00303 00304 //***************************************************************** 00305 /// The visitor base class for nine types. 00306 /// Derive visitors from this. 00307 ///\ingroup visitor 00308 //***************************************************************** 00309 template <typename T1, typename T2, typename T3, typename T4, 00310 typename T5, typename T6, typename T7, typename T8, 00311 typename T9> 00312 class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9> 00313 { 00314 public: 00315 00316 virtual void visit(T1&) = 0; 00317 virtual void visit(T2&) = 0; 00318 virtual void visit(T3&) = 0; 00319 virtual void visit(T4&) = 0; 00320 virtual void visit(T5&) = 0; 00321 virtual void visit(T6&) = 0; 00322 virtual void visit(T7&) = 0; 00323 virtual void visit(T8&) = 0; 00324 virtual void visit(T9&) = 0; 00325 }; 00326 00327 //***************************************************************** 00328 /// The visitor base class for eight types. 00329 /// Derive visitors from this. 00330 ///\ingroup visitor 00331 //***************************************************************** 00332 template <typename T1, typename T2, typename T3, typename T4, 00333 typename T5, typename T6, typename T7, typename T8> 00334 class visitor<T1, T2, T3, T4, T5, T6, T7, T8> 00335 { 00336 public: 00337 00338 virtual void visit(T1&) = 0; 00339 virtual void visit(T2&) = 0; 00340 virtual void visit(T3&) = 0; 00341 virtual void visit(T4&) = 0; 00342 virtual void visit(T5&) = 0; 00343 virtual void visit(T6&) = 0; 00344 virtual void visit(T7&) = 0; 00345 virtual void visit(T8&) = 0; 00346 }; 00347 00348 //***************************************************************** 00349 /// The visitor base class for seven types. 00350 /// Derive visitors from this. 00351 ///\ingroup visitor 00352 //***************************************************************** 00353 template <typename T1, typename T2, typename T3, typename T4, 00354 typename T5, typename T6, typename T7> 00355 class visitor<T1, T2, T3, T4, T5, T6, T7> 00356 { 00357 public: 00358 00359 virtual void visit(T1&) = 0; 00360 virtual void visit(T2&) = 0; 00361 virtual void visit(T3&) = 0; 00362 virtual void visit(T4&) = 0; 00363 virtual void visit(T5&) = 0; 00364 virtual void visit(T6&) = 0; 00365 virtual void visit(T7&) = 0; 00366 }; 00367 00368 //***************************************************************** 00369 /// The visitor base class for six types. 00370 /// Derive visitors from this. 00371 ///\ingroup visitor 00372 //***************************************************************** 00373 template <typename T1, typename T2, typename T3, typename T4, 00374 typename T5, typename T6> 00375 class visitor<T1, T2, T3, T4, T5, T6> 00376 { 00377 public: 00378 00379 virtual void visit(T1&) = 0; 00380 virtual void visit(T2&) = 0; 00381 virtual void visit(T3&) = 0; 00382 virtual void visit(T4&) = 0; 00383 virtual void visit(T5&) = 0; 00384 virtual void visit(T6&) = 0; 00385 }; 00386 00387 //***************************************************************** 00388 /// The visitor base class for five types. 00389 /// Derive visitors from this. 00390 ///\ingroup visitor 00391 //***************************************************************** 00392 template <typename T1, typename T2, typename T3, typename T4, 00393 typename T5> 00394 class visitor<T1, T2, T3, T4, T5> 00395 { 00396 public: 00397 00398 virtual void visit(T1&) = 0; 00399 virtual void visit(T2&) = 0; 00400 virtual void visit(T3&) = 0; 00401 virtual void visit(T4&) = 0; 00402 virtual void visit(T5&) = 0; 00403 }; 00404 00405 //***************************************************************** 00406 /// The visitor base class for four types. 00407 /// Derive visitors from this. 00408 ///\ingroup visitor 00409 //***************************************************************** 00410 template <typename T1, typename T2, typename T3, typename T4> 00411 class visitor<T1, T2, T3, T4> 00412 { 00413 public: 00414 00415 virtual void visit(T1&) = 0; 00416 virtual void visit(T2&) = 0; 00417 virtual void visit(T3&) = 0; 00418 virtual void visit(T4&) = 0; 00419 }; 00420 00421 //***************************************************************** 00422 /// The visitor base class for three types. 00423 /// Derive visitors from this. 00424 ///\ingroup visitor 00425 //***************************************************************** 00426 template <typename T1, typename T2, typename T3> 00427 class visitor<T1, T2, T3> 00428 { 00429 public: 00430 00431 virtual void visit(T1&) = 0; 00432 virtual void visit(T2&) = 0; 00433 virtual void visit(T3&) = 0; 00434 }; 00435 00436 //***************************************************************** 00437 /// The visitor base class for two types. 00438 /// Derive visitors from this. 00439 ///\ingroup visitor 00440 //***************************************************************** 00441 template <typename T1, typename T2> 00442 class visitor<T1, T2> 00443 { 00444 public: 00445 00446 virtual void visit(T1&) = 0; 00447 virtual void visit(T2&) = 0; 00448 }; 00449 00450 //***************************************************************** 00451 /// The visitor base class for one type. 00452 /// Derive visitors from this. 00453 ///\ingroup visitor 00454 //***************************************************************** 00455 template <typename T1> 00456 class visitor<T1> 00457 { 00458 public: 00459 00460 virtual void visit(T1&) = 0; 00461 }; 00462 } 00463 00464 #endif 00465
Generated on Tue Jul 12 2022 14:05:46 by
