Salome HOME
Update copyright information
[modules/visu.git] / src / CONVERTOR / VISU_TypeList.hxx
1 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  VISU OBJECT : interactive object for VISU entities implementation
24 //  File   : VISU_TypeList.hxx
25 //  Author : Oleg UVAROV
26 //  Module : VISU
27 //
28 #ifndef VISU_TypeList_HeaderFile
29 #define VISU_TypeList_HeaderFile
30
31
32 //----------------------------------------------------------------------------
33 namespace VISU
34 {
35   //----------------------------------------------------------------------------
36   namespace TL
37   {
38     //----------------------------------------------------------------------------
39     struct TNullType {};
40     
41
42     //----------------------------------------------------------------------------
43     template < class T, class U >
44     struct TList
45     {
46       typedef T THead;
47       typedef U TTail;
48     };
49     
50     template < int v >
51     struct TInt2Type
52     {
53       enum { value = v };
54     };
55     
56
57     //----------------------------------------------------------------------------
58     template < class TypeList, unsigned int index > 
59     struct TTypeAt;
60
61     template < class THead, class TTail >
62     struct TTypeAt< TList< THead, TTail >, 0 >
63     {
64       typedef THead TResult;
65     };
66
67
68     template < class THead, class TTail, unsigned int index >
69     struct TTypeAt< TList< THead, TTail >, index >
70     {
71       typedef typename TTypeAt< TTail, index - 1 >::TResult TResult;
72     };
73
74
75     //----------------------------------------------------------------------------
76     template < class TypeList, class T > 
77     struct TIndexOf;
78
79     template < class T >
80     struct TIndexOf< TNullType, T >
81     {
82       enum { value = -1 };
83     };
84
85     template < class T, class TTail >
86     struct TIndexOf< TList< T, TTail >, T >
87     {
88       enum { value = 0 };
89     };
90
91     template < class THead, class TTail, class T >
92     struct TIndexOf< TList< THead, TTail >, T >
93     {
94     private:
95       enum { temp = TIndexOf< TTail, T >::value };
96     public:
97       enum { value = temp == -1? -1 : 1 + temp };
98     };
99     
100
101     //----------------------------------------------------------------------------
102     template
103     <
104       class T01 = TNullType, class T02 = TNullType, class T03 = TNullType, class T04 = TNullType, class T05 = TNullType,
105       class T06 = TNullType, class T07 = TNullType, class T08 = TNullType, class T09 = TNullType, class T10 = TNullType,
106       class T11 = TNullType, class T12 = TNullType, class T13 = TNullType, class T14 = TNullType, class T15 = TNullType,
107       class T16 = TNullType, class T17 = TNullType, class T18 = TNullType, class T19 = TNullType, class T20 = TNullType,
108       class T21 = TNullType, class T22 = TNullType, class T23 = TNullType, class T24 = TNullType, class T25 = TNullType,
109       class T26 = TNullType, class T27 = TNullType, class T28 = TNullType, class T29 = TNullType, class T30 = TNullType,
110       class T31 = TNullType, class T32 = TNullType, class T33 = TNullType, class T34 = TNullType, class T35 = TNullType,
111       class T36 = TNullType, class T37 = TNullType, class T38 = TNullType, class T39 = TNullType, class T40 = TNullType
112     >
113     struct TSequence
114     {
115     private:
116       typedef typename TSequence<      T02, T03, T04, T05, T06, T07, T08, T09, T10,
117                                   T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
118                                   T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
119                                   T31, T32, T33, T34, T35, T36, T37, T38, T39, T40
120                                        >::TResult 
121                        TailResult;
122     public:
123       typedef TList< T01, TailResult > TResult;
124     };
125         
126
127     //----------------------------------------------------------------------------
128     template<>
129     struct TSequence<>
130     {
131       typedef TNullType TResult;
132     };
133
134
135     //----------------------------------------------------------------------------
136   }
137
138   
139   //----------------------------------------------------------------------------
140 }
141
142 #endif