Stefan Scholz / ETL
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers visitor.h Source File

visitor.h

Go to the documentation of this file.
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