xref: /AOO41X/main/framework/inc/macros/xtypeprovider.hxx (revision f8e07b45f7e1fb69563504f404bb0b75210f0be6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef __FRAMEWORK_MACROS_XTYPEPROVIDER_HXX_
25 #define __FRAMEWORK_MACROS_XTYPEPROVIDER_HXX_
26 
27 //_________________________________________________________________________________________________________________
28 //  my own includes
29 //_________________________________________________________________________________________________________________
30 
31 //_________________________________________________________________________________________________________________
32 //  interface includes
33 //_________________________________________________________________________________________________________________
34 
35 #include <com/sun/star/lang/XTypeProvider.hpp>
36 #include <com/sun/star/uno/RuntimeException.hpp>
37 
38 //_________________________________________________________________________________________________________________
39 //  other includes
40 //_________________________________________________________________________________________________________________
41 #include <com/sun/star/uno/Any.hxx>
42 #include <com/sun/star/uno/Reference.hxx>
43 #include <com/sun/star/uno/Sequence.hxx>
44 #include <com/sun/star/uno/Type.hxx>
45 #include <cppuhelper/typeprovider.hxx>
46 #include <osl/mutex.hxx>
47 #include <rtl/ustring.hxx>
48 
49 //_________________________________________________________________________________________________________________
50 //  namespace
51 //_________________________________________________________________________________________________________________
52 
53 namespace framework{
54 
55 /*_________________________________________________________________________________________________________________
56 
57     macros for declaration and definition of XTypeProvider
58     Please use follow public macros only!
59 
60     1)  DEFINE_XTYPEPROVIDER                                                            => use it in header to declare XTypeProvider and his methods
61     2)  DECLARE_TYPEPROVIDER_0( CLASS )                                                 => use it to define implementation of XTypeProvider for 0 supported type
62         DECLARE_TYPEPROVIDER_1( CLASS, TYPE1 )                                          => use it to define implementation of XTypeProvider for 1 supported type
63         ...
64         DECLARE_TYPEPROVIDER_16( CLASS, TYPE1, ... , TYPE16 )
65     3)  DEFINE_XTYPEPROVIDER_1_WITH_BASECLASS( CLASS, BASECLASS, TYPE1 )                => use it to define implementation of XTypeProvider for 1 additional supported type to baseclass
66         ...
67         DEFINE_XTYPEPROVIDER_5_WITH_BASECLASS( CLASS, BASECLASS, TYPE1, ..., TYPE5 )
68 
69 _________________________________________________________________________________________________________________*/
70 
71 //*****************************************************************************************************************
72 //  private
73 //  implementation of XTypeProvider::getImplementationId()
74 //*****************************************************************************************************************
75 #define PRIVATE_DEFINE_XTYPEPROVIDER_GETIMPLEMENTATIONID( CLASS )                                                                               \
76     ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL CLASS::getImplementationId() throw( ::com::sun::star::uno::RuntimeException )          \
77     {                                                                                                                                           \
78         /* Create one Id for all instances of this class.                                               */                                      \
79         /* Use ethernet address to do this! (sal_True)                                                  */                                      \
80         /* Optimize this method                                                                         */                                      \
81         /* We initialize a static variable only one time. And we don't must use a mutex at every call!  */                                      \
82         /* For the first call; pID is NULL - for the second call pID is different from NULL!            */                                      \
83         static ::cppu::OImplementationId* pID = NULL ;                                                                                          \
84         if ( pID == NULL )                                                                                                                      \
85         {                                                                                                                                       \
86             /* Ready for multithreading; get global mutex for first call of this method only! see before   */                                   \
87             ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );                                                                         \
88             /* Control these pointer again ... it can be, that another instance will be faster then these! */                                   \
89             if ( pID == NULL )                                                                                                                  \
90             {                                                                                                                                   \
91                 /* Create a new static ID ... */                                                                                                \
92                 static ::cppu::OImplementationId aID( sal_False );                                                                              \
93                 /* ... and set his address to static pointer! */                                                                                \
94                 pID = &aID ;                                                                                                                    \
95             }                                                                                                                                   \
96         }                                                                                                                                       \
97         return pID->getImplementationId();                                                                                                      \
98     }
99 
100 //*****************************************************************************************************************
101 //  private
102 //  implementation of XTypeProvider::getTypes() with max. 12 interfaces!
103 //*****************************************************************************************************************
104 #define PRIVATE_DEFINE_XTYPEPROVIDER_GETTYPES( CLASS, TYPES )                                                                                   \
105     ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL CLASS::getTypes() throw( ::com::sun::star::uno::RuntimeException )  \
106     {                                                                                                                                           \
107         /* Optimize this method !                                       */                                                                      \
108         /* We initialize a static variable only one time.               */                                                                      \
109         /* And we don't must use a mutex at every call!                 */                                                                      \
110         /* For the first call; pTypeCollection is NULL -                */                                                                      \
111         /* for the second call pTypeCollection is different from NULL!  */                                                                      \
112         static ::cppu::OTypeCollection* pTypeCollection = NULL ;                                                                                \
113         if ( pTypeCollection == NULL )                                                                                                          \
114         {                                                                                                                                       \
115             /* Ready for multithreading; get global mutex for first call of this method only! see before   */                                   \
116             ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );                                                                         \
117             /* Control these pointer again ... it can be, that another instance will be faster then these! */                                   \
118             if ( pTypeCollection == NULL )                                                                                                      \
119             {                                                                                                                                   \
120                 /* Create a static typecollection ...           */                                                                              \
121                 /* Attention: "TYPES" will expand to "(...)"!   */                                                                              \
122                 static ::cppu::OTypeCollection aTypeCollection TYPES ;                                                                          \
123                 /* ... and set his address to static pointer! */                                                                                \
124                 pTypeCollection = &aTypeCollection ;                                                                                            \
125             }                                                                                                                                   \
126         }                                                                                                                                       \
127         return pTypeCollection->getTypes();                                                                                                     \
128     }
129 
130 //*****************************************************************************************************************
131 //  private
132 //  implementation of XTypeProvider::getTypes() with more then 12 interfaces!
133 //*****************************************************************************************************************
134 #define PRIVATE_DEFINE_XTYPEPROVIDER_GETTYPES_LARGE( CLASS, TYPES_FIRST, TYPES_SECOND )                                                         \
135     ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL CLASS::getTypes() throw( ::com::sun::star::uno::RuntimeException )  \
136     {                                                                                                                                           \
137         /* Optimize this method !                                       */                                                                      \
138         /* We initialize a static variable only one time.               */                                                                      \
139         /* And we don't must use a mutex at every call!                 */                                                                      \
140         /* For the first call; pTypeCollection is NULL -                */                                                                      \
141         /* for the second call pTypeCollection is different from NULL!  */                                                                      \
142         static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >* pTypeCollection = NULL ;                                         \
143         if ( pTypeCollection == NULL )                                                                                                          \
144         {                                                                                                                                       \
145             /* Ready for multithreading; get global mutex for first call of this method only! see before   */                                   \
146             ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );                                                                         \
147             /* Control these pointer again ... it can be, that another instance will be faster then these! */                                   \
148             if ( pTypeCollection == NULL )                                                                                                      \
149             {                                                                                                                                   \
150                 /* Create two typecollections                           */                                                                      \
151                 /* (cppuhelper support 12 items per collection only!)   */                                                                      \
152                 ::cppu::OTypeCollection aTypeCollection1 TYPES_FIRST    ;                                                                       \
153                 ::cppu::OTypeCollection aTypeCollection2 TYPES_SECOND   ;                                                                       \
154                 /* Copy all items from both sequences to one result list! */                                                                    \
155                 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >          seqTypes1   = aTypeCollection1.getTypes();              \
156                 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >          seqTypes2   = aTypeCollection2.getTypes();              \
157                 sal_Int32                                                               nCount1     = seqTypes1.getLength();                    \
158                 sal_Int32                                                               nCount2     = seqTypes2.getLength();                    \
159                 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >   seqResult   ( nCount1+nCount2 );                        \
160                 sal_Int32                                                               nSource     = 0;                                        \
161                 sal_Int32                                                               nDestination= 0;                                        \
162                 while( nSource<nCount1 )                                                                                                        \
163                 {                                                                                                                               \
164                     seqResult[nDestination] = seqTypes1[nSource];                                                                               \
165                     ++nSource;                                                                                                                  \
166                     ++nDestination;                                                                                                             \
167                 }                                                                                                                               \
168                 nSource = 0;                                                                                                                    \
169                 while( nSource<nCount2 )                                                                                                        \
170                 {                                                                                                                               \
171                     seqResult[nDestination] = seqTypes2[nSource];                                                                               \
172                     ++nSource;                                                                                                                  \
173                     ++nDestination;                                                                                                             \
174                 }                                                                                                                               \
175                 /* ... and set his address to static pointer! */                                                                                \
176                 pTypeCollection = &seqResult;                                                                                                   \
177             }                                                                                                                                   \
178         }                                                                                                                                       \
179         return *pTypeCollection;                                                                                                                \
180     }
181 
182 //*****************************************************************************************************************
183 //  private
184 //  implementation of XTypeProvider::getTypes() with using max. 12 interfaces + baseclass!
185 //*****************************************************************************************************************
186 #define PRIVATE_DEFINE_XTYPEPROVIDER_GETTYPES_BASECLASS( CLASS, BASECLASS, TYPES )                                                              \
187     ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL CLASS::getTypes() throw( ::com::sun::star::uno::RuntimeException )  \
188     {                                                                                                                                           \
189         /* Optimize this method !                                       */                                                                      \
190         /* We initialize a static variable only one time.               */                                                                      \
191         /* And we don't must use a mutex at every call!                 */                                                                      \
192         /* For the first call; pTypeCollection is NULL -                */                                                                      \
193         /* for the second call pTypeCollection is different from NULL!  */                                                                      \
194         static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >* pTypeCollection = NULL ;                                         \
195         if ( pTypeCollection == NULL )                                                                                                          \
196         {                                                                                                                                       \
197             /* Ready for multithreading; get global mutex for first call of this method only! see before   */                                   \
198             ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );                                                                         \
199             /* Control these pointer again ... it can be, that another instance will be faster then these! */                                   \
200             if ( pTypeCollection == NULL )                                                                                                      \
201             {                                                                                                                                   \
202                 /* Create static typecollection for my own interfaces!  */                                                                      \
203                 static ::cppu::OTypeCollection aTypeCollection TYPES ;                                                                          \
204                 /* Copy all items from my list sequences and from my baseclass  */                                                              \
205                 /* to one result list!                                          */                                                              \
206                 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >          seqTypes1   = aTypeCollection.getTypes();               \
207                 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >          seqTypes2   = BASECLASS::getTypes();                    \
208                 sal_Int32                                                               nCount1     = seqTypes1.getLength();                    \
209                 sal_Int32                                                               nCount2     = seqTypes2.getLength();                    \
210                 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >   seqResult   ( nCount1+nCount2 );                        \
211                 sal_Int32                                                               nSource     = 0;                                        \
212                 sal_Int32                                                               nDestination= 0;                                        \
213                 while( nSource<nCount1 )                                                                                                        \
214                 {                                                                                                                               \
215                     seqResult[nDestination] = seqTypes1[nSource];                                                                               \
216                     ++nSource;                                                                                                                  \
217                     ++nDestination;                                                                                                             \
218                 }                                                                                                                               \
219                 nSource = 0;                                                                                                                    \
220                 while( nSource<nCount2 )                                                                                                        \
221                 {                                                                                                                               \
222                     seqResult[nDestination] = seqTypes2[nSource];                                                                               \
223                     ++nSource;                                                                                                                  \
224                     ++nDestination;                                                                                                             \
225                 }                                                                                                                               \
226                 /* ... and set his address to static pointer! */                                                                                \
227                 pTypeCollection = &seqResult;                                                                                                   \
228             }                                                                                                                                   \
229         }                                                                                                                                       \
230         return *pTypeCollection;                                                                                                                \
231     }
232 
233 //*****************************************************************************************************************
234 //  private
235 //  help macros to replace TYPES in getTypes() [see before]
236 //*****************************************************************************************************************
237 #define PRIVATE_DEFINE_TYPE_1( TYPE1 )                                                                                                          \
238     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE1 >*)NULL )
239 
240 #define PRIVATE_DEFINE_TYPE_2( TYPE1, TYPE2 )                                                                                                   \
241     PRIVATE_DEFINE_TYPE_1( TYPE1 ),                                                                                                             \
242     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE2 >*)NULL )
243 
244 #define PRIVATE_DEFINE_TYPE_3( TYPE1, TYPE2, TYPE3 )                                                                                            \
245     PRIVATE_DEFINE_TYPE_2( TYPE1, TYPE2 ),                                                                                                      \
246     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE3 >*)NULL )
247 
248 #define PRIVATE_DEFINE_TYPE_4( TYPE1, TYPE2, TYPE3, TYPE4 )                                                                                     \
249     PRIVATE_DEFINE_TYPE_3( TYPE1, TYPE2, TYPE3 ),                                                                                               \
250     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE4 >*)NULL )
251 
252 #define PRIVATE_DEFINE_TYPE_5( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5 )                                                                              \
253     PRIVATE_DEFINE_TYPE_4( TYPE1, TYPE2, TYPE3, TYPE4 ),                                                                                        \
254     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE5 >*)NULL )
255 
256 #define PRIVATE_DEFINE_TYPE_6( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6 )                                                                       \
257     PRIVATE_DEFINE_TYPE_5( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5 ),                                                                                 \
258     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE6 >*)NULL )
259 
260 #define PRIVATE_DEFINE_TYPE_7( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7 )                                                                \
261     PRIVATE_DEFINE_TYPE_6( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6 ),                                                                          \
262     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE7 >*)NULL )
263 
264 #define PRIVATE_DEFINE_TYPE_8( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8 )                                                         \
265     PRIVATE_DEFINE_TYPE_7( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7 ),                                                                   \
266     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE8 >*)NULL )
267 
268 #define PRIVATE_DEFINE_TYPE_9( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9 )                                                  \
269     PRIVATE_DEFINE_TYPE_8( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8 ),                                                            \
270     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE9 >*)NULL )
271 
272 #define PRIVATE_DEFINE_TYPE_10( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10 )                                         \
273     PRIVATE_DEFINE_TYPE_9( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9 ),                                                     \
274     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE10 >*)NULL )
275 
276 #define PRIVATE_DEFINE_TYPE_11( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11 )                                 \
277     PRIVATE_DEFINE_TYPE_10( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10 ),                                            \
278     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE11 >*)NULL )
279 
280 #define PRIVATE_DEFINE_TYPE_12( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12 )                         \
281     PRIVATE_DEFINE_TYPE_11( TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11 ),                                    \
282     ::getCppuType(( const ::com::sun::star::uno::Reference< TYPE12 >*)NULL )
283 
284 //*****************************************************************************************************************
285 //  private
286 //  complete implementation of XTypeProvider
287 //*****************************************************************************************************************
288 #define PRIVATE_DEFINE_XTYPEPROVIDER_PURE( CLASS )                                                                                                          \
289     PRIVATE_DEFINE_XTYPEPROVIDER_GETIMPLEMENTATIONID( CLASS )                                                                                               \
290     PRIVATE_DEFINE_XTYPEPROVIDER_GETTYPES( CLASS, ::getCppuType(( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider >*)NULL ) )
291 
292 #define PRIVATE_DEFINE_XTYPEPROVIDER( CLASS, TYPES )                                                                                                        \
293     PRIVATE_DEFINE_XTYPEPROVIDER_GETIMPLEMENTATIONID( CLASS )                                                                                               \
294     PRIVATE_DEFINE_XTYPEPROVIDER_GETTYPES( CLASS, TYPES )
295 
296 #define PRIVATE_DEFINE_XTYPEPROVIDER_LARGE( CLASS, TYPES_FIRST, TYPES_SECOND )                                                                              \
297     PRIVATE_DEFINE_XTYPEPROVIDER_GETIMPLEMENTATIONID( CLASS )                                                                                               \
298     PRIVATE_DEFINE_XTYPEPROVIDER_GETTYPES_LARGE( CLASS, TYPES_FIRST, TYPES_SECOND )
299 
300 #define PRIVATE_DEFINE_XTYPEPROVIDER_BASECLASS( CLASS, BASECLASS, TYPES )                                                                                   \
301     PRIVATE_DEFINE_XTYPEPROVIDER_GETIMPLEMENTATIONID( CLASS )                                                                                               \
302     PRIVATE_DEFINE_XTYPEPROVIDER_GETTYPES_BASECLASS( CLASS, BASECLASS, TYPES )
303 
304 //*****************************************************************************************************************
305 //  public
306 //  declaration of XTypeProvider
307 //*****************************************************************************************************************
308 #define FWK_DECLARE_XTYPEPROVIDER                                                                                                                               \
309     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >  SAL_CALL getTypes           () throw( ::com::sun::star::uno::RuntimeException );\
310     virtual ::com::sun::star::uno::Sequence< sal_Int8 >                     SAL_CALL getImplementationId() throw( ::com::sun::star::uno::RuntimeException );
311 
312 //*****************************************************************************************************************
313 //  public
314 //  implementation of XTypeProvider
315 //*****************************************************************************************************************
316 //  implementation of XTypeProvider without additional interface for getTypes()
317 //  XTypeProvider is used as the only one interface automaticly.
318 //  Following defines don't use XTypeProvider automaticly!!!!
319 #define DEFINE_XTYPEPROVIDER_0( CLASS )                                                                             \
320     PRIVATE_DEFINE_XTYPEPROVIDER_PURE(  CLASS )
321 
322 //  implementation of XTypeProvider with 1 additional interface for getTypes()
323 #define DEFINE_XTYPEPROVIDER_1( CLASS, TYPE1 )                                                                      \
324     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
325                                         (PRIVATE_DEFINE_TYPE_1  (   TYPE1                                           \
326                                                                 ))                                                  \
327                                     )
328 
329 //  implementation of XTypeProvider with 2 additional interfaces for getTypes()
330 #define DEFINE_XTYPEPROVIDER_2( CLASS, TYPE1, TYPE2 )                                                               \
331     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
332                                         (PRIVATE_DEFINE_TYPE_2  (   TYPE1   ,                                       \
333                                                                     TYPE2                                           \
334                                                                 ))                                                  \
335                                     )
336 
337 //  implementation of XTypeProvider with 3 additional interfaces for getTypes()
338 #define DEFINE_XTYPEPROVIDER_3( CLASS, TYPE1, TYPE2, TYPE3 )                                                        \
339     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
340                                         (PRIVATE_DEFINE_TYPE_3  (   TYPE1   ,                                       \
341                                                                     TYPE2   ,                                       \
342                                                                     TYPE3                                           \
343                                                                 ))                                                  \
344                                     )
345 
346 //  implementation of XTypeProvider with 4 additional interfaces for getTypes()
347 #define DEFINE_XTYPEPROVIDER_4( CLASS, TYPE1, TYPE2, TYPE3, TYPE4 )                                                 \
348     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
349                                         (PRIVATE_DEFINE_TYPE_4  (   TYPE1   ,                                       \
350                                                                     TYPE2   ,                                       \
351                                                                     TYPE3   ,                                       \
352                                                                     TYPE4                                           \
353                                                                 ))                                                  \
354                                     )
355 
356 //  implementation of XTypeProvider with 5 additional interfaces for getTypes()
357 #define DEFINE_XTYPEPROVIDER_5( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5 )                                          \
358     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
359                                         (PRIVATE_DEFINE_TYPE_5  (   TYPE1   ,                                       \
360                                                                     TYPE2   ,                                       \
361                                                                     TYPE3   ,                                       \
362                                                                     TYPE4   ,                                       \
363                                                                     TYPE5                                           \
364                                                                 ))                                                  \
365                                     )
366 
367 //  implementation of XTypeProvider with 6 additional interfaces for getTypes()
368 #define DEFINE_XTYPEPROVIDER_6( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6 )                                   \
369     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
370                                         (PRIVATE_DEFINE_TYPE_6  (   TYPE1   ,                                       \
371                                                                     TYPE2   ,                                       \
372                                                                     TYPE3   ,                                       \
373                                                                     TYPE4   ,                                       \
374                                                                     TYPE5   ,                                       \
375                                                                     TYPE6                                           \
376                                                                 ))                                                  \
377                                     )
378 
379 //  implementation of XTypeProvider with 7 additional interfaces for getTypes()
380 #define DEFINE_XTYPEPROVIDER_7( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7 )                            \
381     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
382                                         (PRIVATE_DEFINE_TYPE_7  (   TYPE1   ,                                       \
383                                                                     TYPE2   ,                                       \
384                                                                     TYPE3   ,                                       \
385                                                                     TYPE4   ,                                       \
386                                                                     TYPE5   ,                                       \
387                                                                     TYPE6   ,                                       \
388                                                                     TYPE7                                           \
389                                                                 ))                                                  \
390                                     )
391 
392 //  implementation of XTypeProvider with 8 additional interfaces for getTypes()
393 #define DEFINE_XTYPEPROVIDER_8( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8 )                     \
394     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
395                                         (PRIVATE_DEFINE_TYPE_8  (   TYPE1   ,                                       \
396                                                                     TYPE2   ,                                       \
397                                                                     TYPE3   ,                                       \
398                                                                     TYPE4   ,                                       \
399                                                                     TYPE5   ,                                       \
400                                                                     TYPE6   ,                                       \
401                                                                     TYPE7   ,                                       \
402                                                                     TYPE8                                           \
403                                                                 ))                                                  \
404                                     )
405 
406 //  implementation of XTypeProvider with 9 additional interfaces for getTypes()
407 #define DEFINE_XTYPEPROVIDER_9( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9 )              \
408     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
409                                         (PRIVATE_DEFINE_TYPE_9  (   TYPE1   ,                                       \
410                                                                     TYPE2   ,                                       \
411                                                                     TYPE3   ,                                       \
412                                                                     TYPE4   ,                                       \
413                                                                     TYPE5   ,                                       \
414                                                                     TYPE6   ,                                       \
415                                                                     TYPE7   ,                                       \
416                                                                     TYPE8   ,                                       \
417                                                                     TYPE9                                           \
418                                                                 ))                                                  \
419                                     )
420 
421 //  implementation of XTypeProvider with 10 additional interfaces for getTypes()
422 #define DEFINE_XTYPEPROVIDER_10( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10 )     \
423     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                      \
424                                         (PRIVATE_DEFINE_TYPE_10 (   TYPE1   ,                                       \
425                                                                     TYPE2   ,                                       \
426                                                                     TYPE3   ,                                       \
427                                                                     TYPE4   ,                                       \
428                                                                     TYPE5   ,                                       \
429                                                                     TYPE6   ,                                       \
430                                                                     TYPE7   ,                                       \
431                                                                     TYPE8   ,                                       \
432                                                                     TYPE9   ,                                       \
433                                                                     TYPE10                                          \
434                                                                 ))                                                  \
435                                     )
436 
437 //  implementation of XTypeProvider with 11 additional interfaces for getTypes()
438 #define DEFINE_XTYPEPROVIDER_11( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11 ) \
439     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                          \
440                                         (PRIVATE_DEFINE_TYPE_11 (   TYPE1   ,                                           \
441                                                                     TYPE2   ,                                           \
442                                                                     TYPE3   ,                                           \
443                                                                     TYPE4   ,                                           \
444                                                                     TYPE5   ,                                           \
445                                                                     TYPE6   ,                                           \
446                                                                     TYPE7   ,                                           \
447                                                                     TYPE8   ,                                           \
448                                                                     TYPE9   ,                                           \
449                                                                     TYPE10  ,                                           \
450                                                                     TYPE11                                              \
451                                                                 ))                                                      \
452                                     )
453 
454 //  implementation of XTypeProvider with 12 additional interfaces for getTypes()
455 #define DEFINE_XTYPEPROVIDER_12( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12 ) \
456     PRIVATE_DEFINE_XTYPEPROVIDER    (   CLASS,                                                                                  \
457                                         (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                   \
458                                                                     TYPE2   ,                                                   \
459                                                                     TYPE3   ,                                                   \
460                                                                     TYPE4   ,                                                   \
461                                                                     TYPE5   ,                                                   \
462                                                                     TYPE6   ,                                                   \
463                                                                     TYPE7   ,                                                   \
464                                                                     TYPE8   ,                                                   \
465                                                                     TYPE9   ,                                                   \
466                                                                     TYPE10  ,                                                   \
467                                                                     TYPE11  ,                                                   \
468                                                                     TYPE12                                                      \
469                                                                 ))                                                              \
470                                     )
471 
472 //  implementation of XTypeProvider with 13 additional interfaces for getTypes()
473 #define DEFINE_XTYPEPROVIDER_13( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12, TYPE13 ) \
474     PRIVATE_DEFINE_XTYPEPROVIDER_LARGE  (   CLASS,                                                                                      \
475                                             (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                       \
476                                                                         TYPE2   ,                                                       \
477                                                                         TYPE3   ,                                                       \
478                                                                         TYPE4   ,                                                       \
479                                                                         TYPE5   ,                                                       \
480                                                                         TYPE6   ,                                                       \
481                                                                         TYPE7   ,                                                       \
482                                                                         TYPE8   ,                                                       \
483                                                                         TYPE9   ,                                                       \
484                                                                         TYPE10  ,                                                       \
485                                                                         TYPE11  ,                                                       \
486                                                                         TYPE12                                                          \
487                                                                     )),                                                                 \
488                                             (PRIVATE_DEFINE_TYPE_1  (   TYPE13                                                          \
489                                                                     ))                                                                  \
490                                         )
491 
492 //  implementation of XTypeProvider with 14 additional interfaces for getTypes()
493 #define DEFINE_XTYPEPROVIDER_14( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12, TYPE13, TYPE14 ) \
494     PRIVATE_DEFINE_XTYPEPROVIDER_LARGE  (   CLASS,                                                                                              \
495                                             (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                               \
496                                                                         TYPE2   ,                                                               \
497                                                                         TYPE3   ,                                                               \
498                                                                         TYPE4   ,                                                               \
499                                                                         TYPE5   ,                                                               \
500                                                                         TYPE6   ,                                                               \
501                                                                         TYPE7   ,                                                               \
502                                                                         TYPE8   ,                                                               \
503                                                                         TYPE9   ,                                                               \
504                                                                         TYPE10  ,                                                               \
505                                                                         TYPE11  ,                                                               \
506                                                                         TYPE12                                                                  \
507                                                                     )),                                                                         \
508                                             (PRIVATE_DEFINE_TYPE_2  (   TYPE13  ,                                                               \
509                                                                         TYPE14                                                                  \
510                                                                     ))                                                                          \
511                                         )
512 
513 //  implementation of XTypeProvider with 15 additional interfaces for getTypes()
514 #define DEFINE_XTYPEPROVIDER_15( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12, TYPE13, TYPE14, TYPE15 ) \
515     PRIVATE_DEFINE_XTYPEPROVIDER_LARGE  (   CLASS,                                                                                                      \
516                                             (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                                       \
517                                                                         TYPE2   ,                                                                       \
518                                                                         TYPE3   ,                                                                       \
519                                                                         TYPE4   ,                                                                       \
520                                                                         TYPE5   ,                                                                       \
521                                                                         TYPE6   ,                                                                       \
522                                                                         TYPE7   ,                                                                       \
523                                                                         TYPE8   ,                                                                       \
524                                                                         TYPE9   ,                                                                       \
525                                                                         TYPE10  ,                                                                       \
526                                                                         TYPE11  ,                                                                       \
527                                                                         TYPE12                                                                          \
528                                                                     )),                                                                                 \
529                                             (PRIVATE_DEFINE_TYPE_3  (   TYPE13  ,                                                                       \
530                                                                         TYPE14  ,                                                                       \
531                                                                         TYPE15                                                                          \
532                                                                     ))                                                                                  \
533                                         )
534 
535 //  implementation of XTypeProvider with 16 additional interfaces for getTypes()
536 #define DEFINE_XTYPEPROVIDER_16( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12, TYPE13, TYPE14, TYPE15, TYPE16 ) \
537     PRIVATE_DEFINE_XTYPEPROVIDER_LARGE  (   CLASS,                                                                                                              \
538                                             (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                                               \
539                                                                         TYPE2   ,                                                                               \
540                                                                         TYPE3   ,                                                                               \
541                                                                         TYPE4   ,                                                                               \
542                                                                         TYPE5   ,                                                                               \
543                                                                         TYPE6   ,                                                                               \
544                                                                         TYPE7   ,                                                                               \
545                                                                         TYPE8   ,                                                                               \
546                                                                         TYPE9   ,                                                                               \
547                                                                         TYPE10  ,                                                                               \
548                                                                         TYPE11  ,                                                                               \
549                                                                         TYPE12                                                                                  \
550                                                                     )),                                                                                         \
551                                             (PRIVATE_DEFINE_TYPE_4  (   TYPE13  ,                                                                               \
552                                                                         TYPE14  ,                                                                               \
553                                                                         TYPE15  ,                                                                               \
554                                                                         TYPE16                                                                                  \
555                                                                     ))                                                                                          \
556                                         )
557 
558 //  implementation of XTypeProvider with 17 additional interfaces for getTypes()
559 #define DEFINE_XTYPEPROVIDER_17( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12, TYPE13, TYPE14, TYPE15, TYPE16, TYPE17 ) \
560     PRIVATE_DEFINE_XTYPEPROVIDER_LARGE  (   CLASS,                                                                                                              \
561                                             (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                                               \
562                                                                         TYPE2   ,                                                                               \
563                                                                         TYPE3   ,                                                                               \
564                                                                         TYPE4   ,                                                                               \
565                                                                         TYPE5   ,                                                                               \
566                                                                         TYPE6   ,                                                                               \
567                                                                         TYPE7   ,                                                                               \
568                                                                         TYPE8   ,                                                                               \
569                                                                         TYPE9   ,                                                                               \
570                                                                         TYPE10  ,                                                                               \
571                                                                         TYPE11  ,                                                                               \
572                                                                         TYPE12                                                                                  \
573                                                                     )),                                                                                         \
574                                             (PRIVATE_DEFINE_TYPE_5  (   TYPE13  ,                                                                               \
575                                                                         TYPE14  ,                                                                               \
576                                                                         TYPE15  ,                                                                               \
577                                                                         TYPE16  ,                                                                               \
578                                                                         TYPE17                                                                                  \
579                                                                     ))                                                                                          \
580                                         )
581 
582 //  implementation of XTypeProvider with 18 additional interfaces for getTypes()
583 #define DEFINE_XTYPEPROVIDER_18( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12, TYPE13, TYPE14, TYPE15, TYPE16, TYPE17, TYPE18 ) \
584     PRIVATE_DEFINE_XTYPEPROVIDER_LARGE  (   CLASS,                                                                                                              \
585                                             (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                                               \
586                                                                         TYPE2   ,                                                                               \
587                                                                         TYPE3   ,                                                                               \
588                                                                         TYPE4   ,                                                                               \
589                                                                         TYPE5   ,                                                                               \
590                                                                         TYPE6   ,                                                                               \
591                                                                         TYPE7   ,                                                                               \
592                                                                         TYPE8   ,                                                                               \
593                                                                         TYPE9   ,                                                                               \
594                                                                         TYPE10  ,                                                                               \
595                                                                         TYPE11  ,                                                                               \
596                                                                         TYPE12                                                                                  \
597                                                                     )),                                                                                         \
598                                             (PRIVATE_DEFINE_TYPE_6  (   TYPE13  ,                                                                               \
599                                                                         TYPE14  ,                                                                               \
600                                                                         TYPE15  ,                                                                               \
601                                                                         TYPE16  ,                                                                               \
602                                                                         TYPE17  ,                                                                               \
603                                                                         TYPE18                                                                                  \
604                                                                     ))                                                                                          \
605                                         )
606 
607 //  implementation of XTypeProvider with 19 additional interfaces for getTypes()
608 #define DEFINE_XTYPEPROVIDER_19( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12, TYPE13, TYPE14, TYPE15, TYPE16, TYPE17, TYPE18, TYPE19 ) \
609     PRIVATE_DEFINE_XTYPEPROVIDER_LARGE  (   CLASS,                                                                                                              \
610                                             (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                                               \
611                                                                         TYPE2   ,                                                                               \
612                                                                         TYPE3   ,                                                                               \
613                                                                         TYPE4   ,                                                                               \
614                                                                         TYPE5   ,                                                                               \
615                                                                         TYPE6   ,                                                                               \
616                                                                         TYPE7   ,                                                                               \
617                                                                         TYPE8   ,                                                                               \
618                                                                         TYPE9   ,                                                                               \
619                                                                         TYPE10  ,                                                                               \
620                                                                         TYPE11  ,                                                                               \
621                                                                         TYPE12                                                                                  \
622                                                                     )),                                                                                         \
623                                             (PRIVATE_DEFINE_TYPE_7  (   TYPE13  ,                                                                               \
624                                                                         TYPE14  ,                                                                               \
625                                                                         TYPE15  ,                                                                               \
626                                                                         TYPE16  ,                                                                               \
627                                                                         TYPE17  ,                                                                               \
628                                                                         TYPE18  ,                                                                               \
629                                                                         TYPE19                                                                                  \
630                                                                     ))                                                                                          \
631                                         )
632 
633 //  implementation of XTypeProvider with 20 additional interfaces for getTypes()
634 #define DEFINE_XTYPEPROVIDER_20( CLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5, TYPE6, TYPE7, TYPE8, TYPE9, TYPE10, TYPE11, TYPE12, TYPE13, TYPE14, TYPE15, TYPE16, TYPE17, TYPE18, TYPE19, TYPE20 ) \
635     PRIVATE_DEFINE_XTYPEPROVIDER_LARGE  (   CLASS,                                                                                                              \
636                                             (PRIVATE_DEFINE_TYPE_12 (   TYPE1   ,                                                                               \
637                                                                         TYPE2   ,                                                                               \
638                                                                         TYPE3   ,                                                                               \
639                                                                         TYPE4   ,                                                                               \
640                                                                         TYPE5   ,                                                                               \
641                                                                         TYPE6   ,                                                                               \
642                                                                         TYPE7   ,                                                                               \
643                                                                         TYPE8   ,                                                                               \
644                                                                         TYPE9   ,                                                                               \
645                                                                         TYPE10  ,                                                                               \
646                                                                         TYPE11  ,                                                                               \
647                                                                         TYPE12                                                                                  \
648                                                                     )),                                                                                         \
649                                             (PRIVATE_DEFINE_TYPE_8  (   TYPE13  ,                                                                               \
650                                                                         TYPE14  ,                                                                               \
651                                                                         TYPE15  ,                                                                               \
652                                                                         TYPE16  ,                                                                               \
653                                                                         TYPE17  ,                                                                               \
654                                                                         TYPE18  ,                                                                               \
655                                                                         TYPE19  ,                                                                               \
656                                                                         TYPE20                                                                                  \
657                                                                     ))                                                                                          \
658                                         )
659 
660 //  implementation of XTypeProvider with 1 additional interface for getTypes() AND using 1 baseclass
661 #define DEFINE_XTYPEPROVIDER_1_WITH_BASECLASS( CLASS, BASECLASS, TYPE1 )                                            \
662     PRIVATE_DEFINE_XTYPEPROVIDER_BASECLASS  (   CLASS,                                                              \
663                                                 BASECLASS,                                                          \
664                                                 (PRIVATE_DEFINE_TYPE_1  (   TYPE1                                   \
665                                                                         ))                                          \
666                                             )
667 
668 //  implementation of XTypeProvider with 2 additional interface for getTypes() AND using 1 baseclass
669 #define DEFINE_XTYPEPROVIDER_2_WITH_BASECLASS( CLASS, BASECLASS, TYPE1, TYPE2 )                                     \
670     PRIVATE_DEFINE_XTYPEPROVIDER_BASECLASS  (   CLASS,                                                              \
671                                                 BASECLASS,                                                          \
672                                                 (PRIVATE_DEFINE_TYPE_2  (   TYPE1   ,                               \
673                                                                             TYPE2                                   \
674                                                                         ))                                          \
675                                             )
676 
677 //  implementation of XTypeProvider with 3 additional interface for getTypes() AND using 1 baseclass
678 #define DEFINE_XTYPEPROVIDER_3_WITH_BASECLASS( CLASS, BASECLASS, TYPE1, TYPE2, TYPE3 )                              \
679     PRIVATE_DEFINE_XTYPEPROVIDER_BASECLASS  (   CLASS,                                                              \
680                                                 BASECLASS,                                                          \
681                                                 (PRIVATE_DEFINE_TYPE_3  (   TYPE1   ,                               \
682                                                                             TYPE2   ,                               \
683                                                                             TYPE3                                   \
684                                                                         ))                                          \
685                                             )
686 //  implementation of XTypeProvider with 4 additional interface for getTypes() AND using 1 baseclass
687 #define DEFINE_XTYPEPROVIDER_4_WITH_BASECLASS( CLASS, BASECLASS, TYPE1, TYPE2, TYPE3, TYPE4 )                       \
688     PRIVATE_DEFINE_XTYPEPROVIDER_BASECLASS  (   CLASS,                                                              \
689                                                 BASECLASS,                                                          \
690                                                 (PRIVATE_DEFINE_TYPE_4  (   TYPE1   ,                               \
691                                                                             TYPE2   ,                               \
692                                                                             TYPE3   ,                               \
693                                                                             TYPE4                                   \
694                                                                         ))                                          \
695                                             )
696 //  implementation of XTypeProvider with 5 additional interface for getTypes() AND using 1 baseclass
697 #define DEFINE_XTYPEPROVIDER_5_WITH_BASECLASS( CLASS, BASECLASS, TYPE1, TYPE2, TYPE3, TYPE4, TYPE5 )                \
698     PRIVATE_DEFINE_XTYPEPROVIDER_BASECLASS  (   CLASS,                                                              \
699                                                 BASECLASS,                                                          \
700                                                 (PRIVATE_DEFINE_TYPE_5  (   TYPE1   ,                               \
701                                                                             TYPE2   ,                               \
702                                                                             TYPE3   ,                               \
703                                                                             TYPE4   ,                               \
704                                                                             TYPE5                                   \
705                                                                         ))                                          \
706                                             )
707 
708 }       //  namespace framework
709 
710 #endif  //  #ifndef __FRAMEWORK_MACROS_XTYPEPROVIDER_HXX_
711