1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#ifndef INCLUDED_CPPU_UNOTYPE_HXX
21#define INCLUDED_CPPU_UNOTYPE_HXX
22
23#include <sal/config.h>
24#include <com/sun/star/uno/Type.h>
25#include <sal/types.h>
26#include <typelib/typeclass.h>
27#include <typelib/typedescription.h>
28
29namespace com { namespace sun { namespace star { namespace uno {
30 class Any;
31 class Exception;
32 template< typename > class Reference;
33 template< typename > class Sequence;
34 class XInterface;
35} } } }
36namespace rtl { class OUString; }
37
38namespace cppu {
39
40template< typename > class UnoType;
41
42/**
43 A unique C++ type representing the UNO type VOID in cppu::UnoType.
44
45 This type is declared but not defined. Its only use is as a template
46 argument to cppu::UnoType.
47
48 @since UDK 3.2.2
49*/
50struct UnoVoidType;
51
52/**
53 A unique C++ type representing the UNO type UNSIGNED SHORT in cppu::UnoType.
54
55 The UNO types UNSIGNED SHORT and CHAR map to the same C++ type, so this C++
56 type is needed to unambiguously specify UNO types in cppu::UnoType.
57
58 This type is declared but not defined. Its only use is as a template
59 argument to cppu::UnoType.
60
61 @since UDK 3.2.2
62*/
63struct UnoUnsignedShortType;
64
65/**
66 A unique C++ type representing the UNO type UNSIGNED SHORT in cppu::UnoType.
67
68 The UNO types UNSIGNED SHORT and CHAR map to the same C++ type, so this C++
69 type is needed to unambiguously specify UNO types in cppu::UnoType.
70
71 This type is declared but not defined. Its only use is as a template
72 argument to cppu::UnoType.
73
74 @since UDK 3.2.2
75*/
76struct UnoCharType;
77
78/**
79 A unique C++ type template representing the UNO sequence types in
80 cppu::UnoType.
81
82 The UNO types UNSIGNED SHORT and CHAR map to the same C++ type, so this C++
83 type is needed to unambiguously specify UNO types in cppu::UnoType.
84
85 This type is declared but not defined. Its only use is as a template
86 argument to cppu::UnoType.
87
88 @since UDK 3.2.2
89*/
90template< typename > struct UnoSequenceType;
91
92namespace detail {
93
94inline ::com::sun::star::uno::Type const & getTypeFromTypeDescriptionReference(
95 ::typelib_TypeDescriptionReference * const * tdr)
96{
97 return *reinterpret_cast< ::com::sun::star::uno::Type const * >(tdr);
98}
99
100inline ::com::sun::star::uno::Type const &
101getTypeFromTypeClass(::typelib_TypeClass tc) {
102 return getTypeFromTypeDescriptionReference(
103 ::typelib_static_type_getByTypeClass(tc));
104}
105
106}
107
108}
109
110namespace cppu { namespace detail {
111
112inline ::com::sun::star::uno::Type const &
113cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::cppu::UnoVoidType const *) {
114 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_VOID);
115}
116
117inline ::com::sun::star::uno::Type const &
118cppu_detail_getUnoType(SAL_UNUSED_PARAMETER bool const *) {
119 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_BOOLEAN);
120}
121
122inline ::com::sun::star::uno::Type const &
123cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::sal_Bool const *) {
124 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_BOOLEAN);
125}
126
127inline ::com::sun::star::uno::Type const &
128cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::sal_Int8 const *) {
129 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_BYTE);
130}
131
132inline ::com::sun::star::uno::Type const &
133cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::sal_Int16 const *) {
134 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_SHORT);
135}
136
137inline ::com::sun::star::uno::Type const &
138cppu_detail_getUnoType(
139 SAL_UNUSED_PARAMETER ::cppu::UnoUnsignedShortType const *)
140{
141 return ::cppu::detail::getTypeFromTypeClass(
142 ::typelib_TypeClass_UNSIGNED_SHORT);
143}
144
145inline ::com::sun::star::uno::Type const &
146cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::sal_Int32 const *) {
147 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_LONG);
148}
149
150inline ::com::sun::star::uno::Type const &
151cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::sal_uInt32 const *) {
152 return ::cppu::detail::getTypeFromTypeClass(
153 ::typelib_TypeClass_UNSIGNED_LONG);
154}
155
156inline ::com::sun::star::uno::Type const &
157cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::sal_Int64 const *) {
158 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_HYPER);
159}
160
161inline ::com::sun::star::uno::Type const &
162cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::sal_uInt64 const *) {
163 return ::cppu::detail::getTypeFromTypeClass(
164 ::typelib_TypeClass_UNSIGNED_HYPER);
165}
166
167inline ::com::sun::star::uno::Type const &
168cppu_detail_getUnoType(SAL_UNUSED_PARAMETER float const *) {
169 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_FLOAT);
170}
171
172inline ::com::sun::star::uno::Type const &
173cppu_detail_getUnoType(SAL_UNUSED_PARAMETER double const *) {
174 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_DOUBLE);
175}
176
177inline ::com::sun::star::uno::Type const &
178cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::cppu::UnoCharType const *) {
179 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_CHAR);
180}
181
182inline ::com::sun::star::uno::Type const &
183cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::rtl::OUString const *) {
184 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_STRING);
185}
186
187inline ::com::sun::star::uno::Type const &
188cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::com::sun::star::uno::Type const *)
189{
190 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_TYPE);
191}
192
193inline ::com::sun::star::uno::Type const &
194cppu_detail_getUnoType(SAL_UNUSED_PARAMETER ::com::sun::star::uno::Any const *)
195{
196 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_ANY);
197}
198
199template< typename T > inline ::com::sun::star::uno::Type const &
200cppu_detail_getUnoType(
201 SAL_UNUSED_PARAMETER ::cppu::UnoSequenceType< T > const *)
202{
203 //TODO: depending on memory model, the following might not work reliably
204 static typelib_TypeDescriptionReference * p = 0;
205 if (p == 0) {
206 ::typelib_static_sequence_type_init(
207 &p, ::cppu::UnoType< T >::get().getTypeLibType());
208 }
209 return ::cppu::detail::getTypeFromTypeDescriptionReference(&p);
210}
211
212template< typename T > inline ::com::sun::star::uno::Type const &
213cppu_detail_getUnoType(
214 SAL_UNUSED_PARAMETER ::com::sun::star::uno::Sequence< T > const *)
215{
216 return cppu_detail_getUnoType(
217 static_cast< ::cppu::UnoSequenceType< T > * >(0));
218}
219
220inline ::com::sun::star::uno::Type const & cppu_detail_getUnoType(
221 SAL_UNUSED_PARAMETER ::com::sun::star::uno::Exception const *)
222{
223 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_EXCEPTION);
224}
225
226inline ::com::sun::star::uno::Type const & cppu_detail_getUnoType(
227 SAL_UNUSED_PARAMETER ::com::sun::star::uno::XInterface const *)
228{
229 return ::cppu::detail::getTypeFromTypeClass(::typelib_TypeClass_INTERFACE);
230}
231
232template< typename T > inline ::com::sun::star::uno::Type const &
233cppu_detail_getUnoType(
234 SAL_UNUSED_PARAMETER ::com::sun::star::uno::Reference< T > const *)
235{
236 return ::cppu::UnoType< T >::get();
237}
238
239} }
240
241namespace cppu {
242
243/**
244 Get the com::sun::star::uno::Type instance representing a certain UNO type.
245
246 For each C++ type representing a UNO type, the corresponding instantiation of
247 this template has a public static member function get(). (The template is
248 specialized for C++ templates representing polymorphic struct type templates
249 of UNO. In those cases, it does not work to instantiate UnoType with a C++
250 type that is derived from a C++ type that represents a UNO type, but does not
251 itself represent a UNO type. In all other cases, UnoType even works for such
252 C++ types that are unambiguously derived from one C++ type that represents a
253 UNO type.) In addition to those C++ types that are mappings of UNO types
254 (except for sal_uInt16 and sal_Unicode, see below), the following C++ types
255 are appropriate as template arguments: cppu::UnoVoidType, bool,
256 cppu::UnoUnsignedShortType, cppu::UnoCharType, cppu::UnoSequenceType with any
257 appropriate template argument (the latter three to unambiguously specify UNO
258 types, as the UNO types UNSIGNED SHORT and CHAR map to the same C++ type),
259 and com::sun::star::uno::Reference with any appropriate template argument.
260
261 @since UDK 3.2.2
262*/
263template< typename T > class UnoType {
264public:
265 static inline ::com::sun::star::uno::Type const & get() {
266 using namespace ::cppu::detail;
267 return cppu_detail_getUnoType(static_cast< T * >(0));
268 }
269
270private:
271 UnoType(UnoType &); // not defined
272 ~UnoType(); // not defined
273 void operator =(UnoType &); // not defined
274};
275
276/**
277 A working replacement for getCppuType (see there).
278
279 There are three overloads of this function that together form the replacement
280 of getCppuType. The replacement has exactly the same semantics as
281 getCppuType, in that it returns correct results for the UNO type UNSIGNED
282 SHORT but not for the UNO type CHAR.
283
284 @since UDK 3.2.2
285*/
286template< typename T > inline ::com::sun::star::uno::Type const &
287getTypeFavourUnsigned(SAL_UNUSED_PARAMETER T const *) {
288 return ::cppu::UnoType< T >::get();
289}
290
291/**
292 A working replacement for getCppuType (see there).
293
294 There are three overloads of this function that together form the replacement
295 of getCppuType. The replacement has exactly the same semantics as
296 getCppuType, in that it returns correct results for the UNO type UNSIGNED
297 SHORT but not for the UNO type CHAR.
298
299 @since UDK 3.2.2
300*/
301inline ::com::sun::star::uno::Type const &
302getTypeFavourUnsigned(SAL_UNUSED_PARAMETER ::sal_uInt16 const *) {
303 return ::cppu::UnoType< ::cppu::UnoUnsignedShortType >::get();
304}
305
306/**
307 A working replacement for getCppuType (see there).
308
309 There are three overloads of this function that together form the replacement
310 of getCppuType. The replacement has exactly the same semantics as
311 getCppuType, in that it returns correct results for the UNO type UNSIGNED
312 SHORT but not for the UNO type CHAR.
313
314 @since UDK 3.2.2
315*/
316template< typename T > inline ::com::sun::star::uno::Type const &
317getTypeFavourUnsigned(::com::sun::star::uno::Sequence< T > const *);
318 // defined in com/sun/star/uno/Sequence.hxx
319
320/// @cond INTERNAL
321
322/**
323 A working replacement for getCppuType (see there).
324
325 There are three overloads of this function that together form the replacement
326 of the getCppuType template. The replacement has exactly the same semantics
327 as the getCppuType template, in that it returns correct results for the UNO
328 type CHAR but not for the UNO type UNSIGNED SHORT. Additionally, it also
329 returns the intended results for sequence types.
330
331 @since UDK 3.2.3
332*/
333template< typename T > inline ::com::sun::star::uno::Type const &
334getTypeFavourChar(SAL_UNUSED_PARAMETER T const *) {
335 return ::cppu::UnoType< T >::get();
336}
337
338/**
339 A working replacement for getCppuType (see there).
340
341 There are three overloads of this function that together form the replacement
342 of the getCppuType template. The replacement has exactly the same semantics
343 as the getCppuType template, in that it returns correct results for the UNO
344 type CHAR but not for the UNO type UNSIGNED SHORT. Additionally, it also
345 returns the intended results for sequence types.
346
347 @since UDK 3.2.3
348*/
349inline ::com::sun::star::uno::Type const &
350getTypeFavourChar(SAL_UNUSED_PARAMETER ::sal_Unicode const *) {
351 return ::cppu::UnoType< ::cppu::UnoCharType >::get();
352}
353
354/**
355 A working replacement for getCppuType (see there).
356
357 There are three overloads of this function that together form the replacement
358 of the getCppuType template. The replacement has exactly the same semantics
359 as the getCppuType template, in that it returns correct results for the UNO
360 type CHAR but not for the UNO type UNSIGNED SHORT. Additionally, it also
361 returns the intended results for sequence types.
362
363 @since UDK 3.2.3
364*/
365template< typename T > inline ::com::sun::star::uno::Type const &
366getTypeFavourChar(::com::sun::star::uno::Sequence< T > const *);
367 // defined in com/sun/star/uno/Sequence.hxx
368
369/// @endcond
370
371}
372
373#endif
374
375/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
376