xref: /AOO41X/main/bridges/inc/bridges/cpp_uno/type_misc.hxx (revision 74f1be36d980b87a5a095b012e7b3e9b4a8605eb)
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 #ifndef _BRIDGES_CPP_UNO_TYPE_MISC_HXX_
24 #define _BRIDGES_CPP_UNO_TYPE_MISC_HXX_
25 
26 #include <sal/types.h>
27 #include <typelib/typedescription.h>
28 
29 
30 /** Determines whether given type might relate or relates to an interface,
31     i.e. values of this type are interface or may contain interface(s).<br>
32     @param pTypeDescr type description of type
33     @return true if type might relate to an interface, false otherwise
34 */
cppu_relatesToInterface(typelib_TypeDescription * pTypeDescr)35 inline bool cppu_relatesToInterface( typelib_TypeDescription * pTypeDescr ) SAL_THROW( () )
36 {
37     switch (pTypeDescr->eTypeClass)
38     {
39 //      case typelib_TypeClass_TYPEDEF:
40     case typelib_TypeClass_SEQUENCE:
41     {
42         switch (((typelib_IndirectTypeDescription *)pTypeDescr)->pType->eTypeClass)
43         {
44         case typelib_TypeClass_INTERFACE:
45         case typelib_TypeClass_UNION: // might relate to interface
46         case typelib_TypeClass_ANY: // might relate to interface
47             return true;
48         case typelib_TypeClass_SEQUENCE:
49         case typelib_TypeClass_STRUCT:
50         case typelib_TypeClass_EXCEPTION:
51         {
52             typelib_TypeDescription * pTD = 0;
53             TYPELIB_DANGER_GET( &pTD, ((typelib_IndirectTypeDescription *)pTypeDescr)->pType );
54             bool bRel = cppu_relatesToInterface( pTD );
55             TYPELIB_DANGER_RELEASE( pTD );
56             return bRel;
57         }
58         default:
59             return false;
60         }
61     }
62     case typelib_TypeClass_STRUCT:
63     case typelib_TypeClass_EXCEPTION:
64     {
65         // ...optimized... to avoid getDescription() calls!
66         typelib_CompoundTypeDescription * pComp    = (typelib_CompoundTypeDescription *)pTypeDescr;
67         typelib_TypeDescriptionReference ** pTypes = pComp->ppTypeRefs;
68         for ( sal_Int32 nPos = pComp->nMembers; nPos--; )
69         {
70             switch (pTypes[nPos]->eTypeClass)
71             {
72             case typelib_TypeClass_INTERFACE:
73             case typelib_TypeClass_UNION: // might relate to interface
74             case typelib_TypeClass_ANY: // might relate to interface
75                 return true;
76 //              case typelib_TypeClass_TYPEDEF:
77             case typelib_TypeClass_SEQUENCE:
78             case typelib_TypeClass_STRUCT:
79             case typelib_TypeClass_EXCEPTION:
80             {
81                 typelib_TypeDescription * pTD = 0;
82                 TYPELIB_DANGER_GET( &pTD, pTypes[nPos] );
83                 bool bRel = cppu_relatesToInterface( pTD );
84                 TYPELIB_DANGER_RELEASE( pTD );
85                 if (bRel)
86                     return true;
87             }
88             default:
89                 break;
90             }
91         }
92         if (pComp->pBaseTypeDescription)
93             return cppu_relatesToInterface( (typelib_TypeDescription *)pComp->pBaseTypeDescription );
94         return false;
95     }
96     case typelib_TypeClass_UNION: // might relate to interface
97     case typelib_TypeClass_ANY: // might relate to interface
98     case typelib_TypeClass_INTERFACE:
99         return true;
100     default:
101         return false;
102     }
103 }
104 
105 /** Determines whether given type is a cpp simple type, e.g. int, enum.<br>
106     @param eTypeClass type class of type
107     @return true if type is a cpp simple type, false otherwise
108 */
cppu_isSimpleType(typelib_TypeClass eTypeClass)109 inline bool cppu_isSimpleType( typelib_TypeClass eTypeClass ) SAL_THROW( () )
110 {
111     return (eTypeClass <= typelib_TypeClass_ENUM &&
112             eTypeClass != typelib_TypeClass_STRING &&
113             eTypeClass != typelib_TypeClass_ANY &&
114             eTypeClass != typelib_TypeClass_TYPE);
115 }
116 /** Determines whether given type is a cpp simple type, e.g. int, enum.<br>
117     @param pTypeDescr type description of type
118     @return true if type is a cpp simple type, false otherwise
119 */
cppu_isSimpleType(typelib_TypeDescription * pTypeDescr)120 inline bool cppu_isSimpleType( typelib_TypeDescription * pTypeDescr ) SAL_THROW( () )
121 {
122     return cppu_isSimpleType( pTypeDescr->eTypeClass );
123 }
124 
125 #endif
126