Salome HOME
bf54818100158685d0dd66dcfecb7905d634b51f
[modules/visu.git] / src / CONVERTOR / VISU_TypeList.hxx
1 //  Copyright (C) 2007-2008  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 //  VISU OBJECT : interactive object for VISU entities implementation
23 //  File   : VISU_TypeList.hxx
24 //  Author : Oleg UVAROV
25 //  Module : VISU
26 //
27 #ifndef VISU_TypeList_HeaderFile
28 #define VISU_TypeList_HeaderFile
29
30
31 //----------------------------------------------------------------------------
32 namespace VISU
33 {
34   //----------------------------------------------------------------------------
35   namespace TL
36   {
37     //----------------------------------------------------------------------------
38     struct TNullType {};
39     
40
41     //----------------------------------------------------------------------------
42     template < class T, class U >
43     struct TList
44     {
45       typedef T THead;
46       typedef U TTail;
47     };
48     
49     template < int v >
50     struct TInt2Type
51     {
52       enum { value = v };
53     };
54     
55
56     //----------------------------------------------------------------------------
57     template < class TypeList, unsigned int index > 
58     struct TTypeAt;
59
60     template < class THead, class TTail >
61     struct TTypeAt< TList< THead, TTail >, 0 >
62     {
63       typedef THead TResult;
64     };
65
66
67     template < class THead, class TTail, unsigned int index >
68     struct TTypeAt< TList< THead, TTail >, index >
69     {
70       typedef typename TTypeAt< TTail, index - 1 >::TResult TResult;
71     };
72
73
74     //----------------------------------------------------------------------------
75     template < class TypeList, class T > 
76     struct TIndexOf;
77
78     template < class T >
79     struct TIndexOf< TNullType, T >
80     {
81       enum { value = -1 };
82     };
83
84     template < class T, class TTail >
85     struct TIndexOf< TList< T, TTail >, T >
86     {
87       enum { value = 0 };
88     };
89
90     template < class THead, class TTail, class T >
91     struct TIndexOf< TList< THead, TTail >, T >
92     {
93     private:
94       enum { temp = TIndexOf< TTail, T >::value };
95     public:
96       enum { value = temp == -1? -1 : 1 + temp };
97     };
98     
99
100     //----------------------------------------------------------------------------
101     template
102     <
103       class T01 = TNullType, class T02 = TNullType, class T03 = TNullType, class T04 = TNullType, class T05 = TNullType,
104       class T06 = TNullType, class T07 = TNullType, class T08 = TNullType, class T09 = TNullType, class T10 = TNullType,
105       class T11 = TNullType, class T12 = TNullType, class T13 = TNullType, class T14 = TNullType, class T15 = TNullType,
106       class T16 = TNullType, class T17 = TNullType, class T18 = TNullType, class T19 = TNullType, class T20 = TNullType,
107       class T21 = TNullType, class T22 = TNullType, class T23 = TNullType, class T24 = TNullType, class T25 = TNullType,
108       class T26 = TNullType, class T27 = TNullType, class T28 = TNullType, class T29 = TNullType, class T30 = TNullType,
109       class T31 = TNullType, class T32 = TNullType, class T33 = TNullType, class T34 = TNullType, class T35 = TNullType,
110       class T36 = TNullType, class T37 = TNullType, class T38 = TNullType, class T39 = TNullType, class T40 = TNullType
111     >
112     struct TSequence
113     {
114     private:
115       typedef typename TSequence<      T02, T03, T04, T05, T06, T07, T08, T09, T10,
116                                   T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
117                                   T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
118                                   T31, T32, T33, T34, T35, T36, T37, T38, T39, T40
119                                        >::TResult 
120                        TailResult;
121     public:
122       typedef TList< T01, TailResult > TResult;
123     };
124         
125
126     //----------------------------------------------------------------------------
127     template<>
128     struct TSequence<>
129     {
130       typedef TNullType TResult;
131     };
132
133
134     //----------------------------------------------------------------------------
135   }
136
137   
138   //----------------------------------------------------------------------------
139 }
140
141 #endif