Version: 6.3.1

src/CONVERTOR/VISU_TypeList.hxx

Go to the documentation of this file.
00001 // Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 //  VISU OBJECT : interactive object for VISU entities implementation
00024 //  File   : VISU_TypeList.hxx
00025 //  Author : Oleg UVAROV
00026 //  Module : VISU
00027 //
00028 #ifndef VISU_TypeList_HeaderFile
00029 #define VISU_TypeList_HeaderFile
00030 
00031 
00032 //----------------------------------------------------------------------------
00033 namespace VISU
00034 {
00035   //----------------------------------------------------------------------------
00036   namespace TL
00037   {
00038     //----------------------------------------------------------------------------
00039     struct TNullType {};
00040     
00041 
00042     //----------------------------------------------------------------------------
00043     template < class T, class U >
00044     struct TList
00045     {
00046       typedef T THead;
00047       typedef U TTail;
00048     };
00049     
00050     template < int v >
00051     struct TInt2Type
00052     {
00053       enum { value = v };
00054     };
00055     
00056 
00057     //----------------------------------------------------------------------------
00058     template < class TypeList, unsigned int index > 
00059     struct TTypeAt;
00060 
00061     template < class THead, class TTail >
00062     struct TTypeAt< TList< THead, TTail >, 0 >
00063     {
00064       typedef THead TResult;
00065     };
00066 
00067 
00068     template < class THead, class TTail, unsigned int index >
00069     struct TTypeAt< TList< THead, TTail >, index >
00070     {
00071       typedef typename TTypeAt< TTail, index - 1 >::TResult TResult;
00072     };
00073 
00074 
00075     //----------------------------------------------------------------------------
00076     template < class TypeList, class T > 
00077     struct TIndexOf;
00078 
00079     template < class T >
00080     struct TIndexOf< TNullType, T >
00081     {
00082       enum { value = -1 };
00083     };
00084 
00085     template < class T, class TTail >
00086     struct TIndexOf< TList< T, TTail >, T >
00087     {
00088       enum { value = 0 };
00089     };
00090 
00091     template < class THead, class TTail, class T >
00092     struct TIndexOf< TList< THead, TTail >, T >
00093     {
00094     private:
00095       enum { temp = TIndexOf< TTail, T >::value };
00096     public:
00097       enum { value = temp == -1? -1 : 1 + temp };
00098     };
00099     
00100 
00101     //----------------------------------------------------------------------------
00102     template
00103     <
00104       class T01 = TNullType, class T02 = TNullType, class T03 = TNullType, class T04 = TNullType, class T05 = TNullType,
00105       class T06 = TNullType, class T07 = TNullType, class T08 = TNullType, class T09 = TNullType, class T10 = TNullType,
00106       class T11 = TNullType, class T12 = TNullType, class T13 = TNullType, class T14 = TNullType, class T15 = TNullType,
00107       class T16 = TNullType, class T17 = TNullType, class T18 = TNullType, class T19 = TNullType, class T20 = TNullType,
00108       class T21 = TNullType, class T22 = TNullType, class T23 = TNullType, class T24 = TNullType, class T25 = TNullType,
00109       class T26 = TNullType, class T27 = TNullType, class T28 = TNullType, class T29 = TNullType, class T30 = TNullType,
00110       class T31 = TNullType, class T32 = TNullType, class T33 = TNullType, class T34 = TNullType, class T35 = TNullType,
00111       class T36 = TNullType, class T37 = TNullType, class T38 = TNullType, class T39 = TNullType, class T40 = TNullType
00112     >
00113     struct TSequence
00114     {
00115     private:
00116       typedef typename TSequence<      T02, T03, T04, T05, T06, T07, T08, T09, T10,
00117                                   T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
00118                                   T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
00119                                   T31, T32, T33, T34, T35, T36, T37, T38, T39, T40
00120                                        >::TResult 
00121                        TailResult;
00122     public:
00123       typedef TList< T01, TailResult > TResult;
00124     };
00125         
00126 
00127     //----------------------------------------------------------------------------
00128     template<>
00129     struct TSequence<>
00130     {
00131       typedef TNullType TResult;
00132     };
00133 
00134 
00135     //----------------------------------------------------------------------------
00136   }
00137 
00138   
00139   //----------------------------------------------------------------------------
00140 }
00141 
00142 #endif
Copyright © 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS