Branch libreoffice-5-0-4
[LibreOffice.git] / include / cppuhelper / implbase3.hxx
blob6f97475ea4e1275aabee2e7ef58a20d7a703dfb7
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
19 #ifndef INCLUDED_CPPUHELPER_IMPLBASE3_HXX
20 #define INCLUDED_CPPUHELPER_IMPLBASE3_HXX
22 #include <cppuhelper/implbase_ex.hxx>
23 #include <rtl/instance.hxx>
25 namespace cppu
27 /// @cond INTERNAL
29 struct class_data3
31 sal_Int16 m_nTypes;
32 sal_Bool m_storedTypeRefs;
33 sal_Bool m_storedId;
34 sal_Int8 m_id[ 16 ];
35 type_entry m_typeEntries[ 3 + 1 ];
38 template< typename Ifc1, typename Ifc2, typename Ifc3, typename Impl > struct ImplClassData3
40 class_data* operator ()()
42 static class_data3 s_cd =
44 3 +1, sal_False, sal_False,
45 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
47 CPPUHELPER_DETAIL_TYPEENTRY(Ifc1),
48 CPPUHELPER_DETAIL_TYPEENTRY(Ifc2),
49 CPPUHELPER_DETAIL_TYPEENTRY(Ifc3),
50 CPPUHELPER_DETAIL_TYPEENTRY(com::sun::star::lang::XTypeProvider)
53 return reinterpret_cast< class_data * >(&s_cd);
57 /// @endcond
59 /** Implementation helper implementing interface com::sun::star::lang::XTypeProvider
60 and method XInterface::queryInterface(), but no reference counting.
62 @derive
63 Inherit from this class giving your interface(s) to be implemented as template argument(s).
64 Your sub class defines method implementations for these interface(s) including acquire()/
65 release() and delegates incoming queryInterface() calls to this base class.
67 template< class Ifc1, class Ifc2, class Ifc3 >
68 class SAL_NO_VTABLE SAL_DLLPUBLIC_TEMPLATE ImplHelper3
69 : public com::sun::star::lang::XTypeProvider
70 , public Ifc1, public Ifc2, public Ifc3
72 struct cd : public rtl::StaticAggregate< class_data, ImplClassData3 < Ifc1, Ifc2, Ifc3, ImplHelper3<Ifc1, Ifc2, Ifc3> > > {};
73 public:
74 virtual com::sun::star::uno::Any SAL_CALL queryInterface( com::sun::star::uno::Type const & rType ) throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
75 { return ImplHelper_query( rType, cd::get(), this ); }
76 virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL getTypes() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
77 { return ImplHelper_getTypes( cd::get() ); }
78 virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
79 { return ImplHelper_getImplementationId( cd::get() ); }
81 #if !defined _MSC_VER // public -> protected changes mangled names there
82 protected:
83 #endif
84 ~ImplHelper3() throw () {}
86 /** Implementation helper implementing interfaces com::sun::star::lang::XTypeProvider and
87 com::sun::star::uno::XInterface which supports weak mechanism to be held weakly
88 (supporting com::sun::star::uno::XWeak through ::cppu::OWeakObject).
90 @derive
91 Inherit from this class giving your interface(s) to be implemented as template argument(s).
92 Your sub class defines method implementations for these interface(s).
94 template< class Ifc1, class Ifc2, class Ifc3 >
95 class SAL_NO_VTABLE SAL_DLLPUBLIC_TEMPLATE WeakImplHelper3
96 : public OWeakObject
97 , public com::sun::star::lang::XTypeProvider
98 , public Ifc1, public Ifc2, public Ifc3
100 struct cd : public rtl::StaticAggregate< class_data, ImplClassData3 < Ifc1, Ifc2, Ifc3, WeakImplHelper3<Ifc1, Ifc2, Ifc3> > > {};
101 public:
102 virtual com::sun::star::uno::Any SAL_CALL queryInterface( com::sun::star::uno::Type const & rType ) throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
103 { return WeakImplHelper_query( rType, cd::get(), this, static_cast<OWeakObject *>(this) ); }
104 virtual void SAL_CALL acquire() throw () SAL_OVERRIDE
105 { OWeakObject::acquire(); }
106 virtual void SAL_CALL release() throw () SAL_OVERRIDE
107 { OWeakObject::release(); }
108 virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL getTypes() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
109 { return WeakImplHelper_getTypes( cd::get() ); }
110 virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
111 { return ImplHelper_getImplementationId( cd::get() ); }
113 /** Implementation helper implementing interfaces com::sun::star::lang::XTypeProvider and
114 com::sun::star::uno::XInterface which supports weak mechanism to be held weakly
115 (supporting com::sun::star::uno::XWeak through ::cppu::OWeakAggObject).
116 In addition, it supports also aggregation meaning object of this class can be aggregated
117 (com::sun::star::uno::XAggregation through ::cppu::OWeakAggObject).
118 If a delegator is set (this object is aggregated), then incoming queryInterface()
119 calls are delegated to the delegator object. If the delegator does not support the
120 demanded interface, it calls queryAggregation() on its aggregated objects.
122 @derive
123 Inherit from this class giving your interface(s) to be implemented as template argument(s).
124 Your sub class defines method implementations for these interface(s).
126 template< class Ifc1, class Ifc2, class Ifc3 >
127 class SAL_NO_VTABLE SAL_DLLPUBLIC_TEMPLATE WeakAggImplHelper3
128 : public OWeakAggObject
129 , public com::sun::star::lang::XTypeProvider
130 , public Ifc1, public Ifc2, public Ifc3
132 struct cd : public rtl::StaticAggregate< class_data, ImplClassData3 < Ifc1, Ifc2, Ifc3, WeakAggImplHelper3<Ifc1, Ifc2, Ifc3> > > {};
133 public:
134 virtual com::sun::star::uno::Any SAL_CALL queryInterface( com::sun::star::uno::Type const & rType ) throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
135 { return OWeakAggObject::queryInterface( rType ); }
136 virtual com::sun::star::uno::Any SAL_CALL queryAggregation( com::sun::star::uno::Type const & rType ) throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
137 { return WeakAggImplHelper_queryAgg( rType, cd::get(), this, static_cast<OWeakAggObject *>(this) ); }
138 virtual void SAL_CALL acquire() throw () SAL_OVERRIDE
139 { OWeakAggObject::acquire(); }
140 virtual void SAL_CALL release() throw () SAL_OVERRIDE
141 { OWeakAggObject::release(); }
142 virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL getTypes() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
143 { return WeakAggImplHelper_getTypes( cd::get() ); }
144 virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
145 { return ImplHelper_getImplementationId( cd::get() ); }
147 /** Implementation helper implementing interfaces com::sun::star::lang::XTypeProvider and
148 com::sun::star::uno::XInterface inherting from a BaseClass.
149 All acquire() and release() calls are delegated to the BaseClass. Upon queryInterface(),
150 if a demanded interface is not supported by this class directly, the request is
151 delegated to the BaseClass.
153 @attention
154 The BaseClass has to be complete in a sense, that com::sun::star::uno::XInterface
155 and com::sun::star::lang::XTypeProvider are implemented properly. The
156 BaseClass must have at least one ctor that can be called with six or
157 fewer arguments, of which none is of non-const reference type.
158 also has to have a default ctor.
160 @derive
161 Inherit from this class giving your additional interface(s) to be implemented as
162 template argument(s). Your sub class defines method implementations for these interface(s).
164 template< class BaseClass, class Ifc1, class Ifc2, class Ifc3 >
165 class SAL_NO_VTABLE SAL_DLLPUBLIC_TEMPLATE ImplInheritanceHelper3
166 : public BaseClass
167 , public Ifc1, public Ifc2, public Ifc3
169 struct cd : public rtl::StaticAggregate< class_data, ImplClassData3 < Ifc1, Ifc2, Ifc3, ImplInheritanceHelper3<BaseClass, Ifc1, Ifc2, Ifc3> > > {};
170 protected:
171 template< typename T1 >
172 explicit ImplInheritanceHelper3(T1 const & arg1): BaseClass(arg1) {}
173 template< typename T1, typename T2 >
174 ImplInheritanceHelper3(T1 const & arg1, T2 const & arg2):
175 BaseClass(arg1, arg2) {}
176 template< typename T1, typename T2, typename T3 >
177 ImplInheritanceHelper3(
178 T1 const & arg1, T2 const & arg2, T3 const & arg3):
179 BaseClass(arg1, arg2, arg3) {}
180 template< typename T1, typename T2, typename T3, typename T4 >
181 ImplInheritanceHelper3(
182 T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4):
183 BaseClass(arg1, arg2, arg3, arg4) {}
184 template<
185 typename T1, typename T2, typename T3, typename T4, typename T5 >
186 ImplInheritanceHelper3(
187 T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4,
188 T5 const & arg5):
189 BaseClass(arg1, arg2, arg3, arg4, arg5) {}
190 template<
191 typename T1, typename T2, typename T3, typename T4, typename T5,
192 typename T6 >
193 ImplInheritanceHelper3(
194 T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4,
195 T5 const & arg5, T6 const & arg6):
196 BaseClass(arg1, arg2, arg3, arg4, arg5, arg6) {}
197 public:
198 ImplInheritanceHelper3() {}
199 virtual com::sun::star::uno::Any SAL_CALL queryInterface( com::sun::star::uno::Type const & rType ) throw (com::sun::star::uno::RuntimeException) SAL_OVERRIDE
201 com::sun::star::uno::Any aRet( ImplHelper_queryNoXInterface( rType, cd::get(), this ) );
202 if (aRet.hasValue())
203 return aRet;
204 return BaseClass::queryInterface( rType );
206 virtual void SAL_CALL acquire() throw () SAL_OVERRIDE
207 { BaseClass::acquire(); }
208 virtual void SAL_CALL release() throw () SAL_OVERRIDE
209 { BaseClass::release(); }
210 virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL getTypes() throw (com::sun::star::uno::RuntimeException) SAL_OVERRIDE
211 { return ImplInhHelper_getTypes( cd::get(), BaseClass::getTypes() ); }
212 virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (com::sun::star::uno::RuntimeException) SAL_OVERRIDE
213 { return ImplHelper_getImplementationId( cd::get() ); }
215 /** Implementation helper implementing interfaces com::sun::star::lang::XTypeProvider and
216 com::sun::star::uno::XInterface inherting from a BaseClass.
217 All acquire(), release() and queryInterface() calls are delegated to the BaseClass.
218 Upon queryAggregation(), if a demanded interface is not supported by this class directly,
219 the request is delegated to the BaseClass.
221 @attention
222 The BaseClass has to be complete in a sense, that com::sun::star::uno::XInterface,
223 com::sun::star::uno::XAggregation and com::sun::star::lang::XTypeProvider
224 are implemented properly. The BaseClass must have at least one ctor
225 that can be called with six or fewer arguments, of which none is of
226 non-const reference type.
228 @derive
229 Inherit from this class giving your additional interface(s) to be implemented as
230 template argument(s). Your sub class defines method implementations for these interface(s).
232 template< class BaseClass, class Ifc1, class Ifc2, class Ifc3 >
233 class SAL_NO_VTABLE SAL_DLLPUBLIC_TEMPLATE AggImplInheritanceHelper3
234 : public BaseClass
235 , public Ifc1, public Ifc2, public Ifc3
237 struct cd : public rtl::StaticAggregate< class_data, ImplClassData3 < Ifc1, Ifc2, Ifc3, AggImplInheritanceHelper3<BaseClass, Ifc1, Ifc2, Ifc3> > > {};
238 protected:
239 template< typename T1 >
240 explicit AggImplInheritanceHelper3(T1 const & arg1): BaseClass(arg1) {}
241 template< typename T1, typename T2 >
242 AggImplInheritanceHelper3(T1 const & arg1, T2 const & arg2):
243 BaseClass(arg1, arg2) {}
244 template< typename T1, typename T2, typename T3 >
245 AggImplInheritanceHelper3(
246 T1 const & arg1, T2 const & arg2, T3 const & arg3):
247 BaseClass(arg1, arg2, arg3) {}
248 template< typename T1, typename T2, typename T3, typename T4 >
249 AggImplInheritanceHelper3(
250 T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4):
251 BaseClass(arg1, arg2, arg3, arg4) {}
252 template<
253 typename T1, typename T2, typename T3, typename T4, typename T5 >
254 AggImplInheritanceHelper3(
255 T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4,
256 T5 const & arg5):
257 BaseClass(arg1, arg2, arg3, arg4, arg5) {}
258 template<
259 typename T1, typename T2, typename T3, typename T4, typename T5,
260 typename T6 >
261 AggImplInheritanceHelper3(
262 T1 const & arg1, T2 const & arg2, T3 const & arg3, T4 const & arg4,
263 T5 const & arg5, T6 const & arg6):
264 BaseClass(arg1, arg2, arg3, arg4, arg5, arg6) {}
265 public:
266 AggImplInheritanceHelper3() {}
267 virtual com::sun::star::uno::Any SAL_CALL queryInterface( com::sun::star::uno::Type const & rType ) throw (com::sun::star::uno::RuntimeException) SAL_OVERRIDE
268 { return BaseClass::queryInterface( rType ); }
269 virtual com::sun::star::uno::Any SAL_CALL queryAggregation( com::sun::star::uno::Type const & rType ) throw (com::sun::star::uno::RuntimeException) SAL_OVERRIDE
271 com::sun::star::uno::Any aRet( ImplHelper_queryNoXInterface( rType, cd::get(), this ) );
272 if (aRet.hasValue())
273 return aRet;
274 return BaseClass::queryAggregation( rType );
276 virtual void SAL_CALL acquire() throw () SAL_OVERRIDE
277 { BaseClass::acquire(); }
278 virtual void SAL_CALL release() throw () SAL_OVERRIDE
279 { BaseClass::release(); }
280 virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL getTypes() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
281 { return ImplInhHelper_getTypes( cd::get(), BaseClass::getTypes() ); }
282 virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
283 { return ImplHelper_getImplementationId( cd::get() ); }
287 #endif
289 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */