xref: /aoo41x/main/cppu/inc/com/sun/star/uno/Sequence.hxx (revision c6ed87c9)
1*c6ed87c9SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*c6ed87c9SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*c6ed87c9SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*c6ed87c9SAndrew Rist  * distributed with this work for additional information
6*c6ed87c9SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*c6ed87c9SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*c6ed87c9SAndrew Rist  * "License"); you may not use this file except in compliance
9*c6ed87c9SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*c6ed87c9SAndrew Rist  *
11*c6ed87c9SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*c6ed87c9SAndrew Rist  *
13*c6ed87c9SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*c6ed87c9SAndrew Rist  * software distributed under the License is distributed on an
15*c6ed87c9SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*c6ed87c9SAndrew Rist  * KIND, either express or implied.  See the License for the
17*c6ed87c9SAndrew Rist  * specific language governing permissions and limitations
18*c6ed87c9SAndrew Rist  * under the License.
19*c6ed87c9SAndrew Rist  *
20*c6ed87c9SAndrew Rist  *************************************************************/
21*c6ed87c9SAndrew Rist 
22*c6ed87c9SAndrew Rist 
23cdf0e10cSrcweir #ifndef _COM_SUN_STAR_UNO_SEQUENCE_HXX_
24cdf0e10cSrcweir #define _COM_SUN_STAR_UNO_SEQUENCE_HXX_
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "osl/diagnose.h"
27cdf0e10cSrcweir #include "osl/interlck.h"
28cdf0e10cSrcweir #include "com/sun/star/uno/Sequence.h"
29cdf0e10cSrcweir #include "typelib/typedescription.h"
30cdf0e10cSrcweir #include "uno/data.h"
31cdf0e10cSrcweir #include "com/sun/star/uno/genfunc.hxx"
32cdf0e10cSrcweir #include "cppu/unotype.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir namespace com
35cdf0e10cSrcweir {
36cdf0e10cSrcweir namespace sun
37cdf0e10cSrcweir {
38cdf0e10cSrcweir namespace star
39cdf0e10cSrcweir {
40cdf0e10cSrcweir namespace uno
41cdf0e10cSrcweir {
42cdf0e10cSrcweir 
43cdf0e10cSrcweir //______________________________________________________________________________
44cdf0e10cSrcweir template< class E >
45cdf0e10cSrcweir typelib_TypeDescriptionReference * Sequence< E >::s_pType = 0;
46cdf0e10cSrcweir 
47cdf0e10cSrcweir //______________________________________________________________________________
48cdf0e10cSrcweir template< class E >
Sequence()49cdf0e10cSrcweir inline Sequence< E >::Sequence() SAL_THROW( () )
50cdf0e10cSrcweir {
51cdf0e10cSrcweir     const Type & rType = ::cppu::getTypeFavourUnsigned( this );
52cdf0e10cSrcweir     ::uno_type_sequence_construct(
53cdf0e10cSrcweir         &_pSequence, rType.getTypeLibType(),
54cdf0e10cSrcweir         0, 0, (uno_AcquireFunc)cpp_acquire );
55cdf0e10cSrcweir     // no bad_alloc, because empty sequence is statically allocated in cppu
56cdf0e10cSrcweir }
57cdf0e10cSrcweir 
58cdf0e10cSrcweir //______________________________________________________________________________
59cdf0e10cSrcweir template< class E >
Sequence(const Sequence<E> & rSeq)60cdf0e10cSrcweir inline Sequence< E >::Sequence( const Sequence< E > & rSeq ) SAL_THROW( () )
61cdf0e10cSrcweir {
62cdf0e10cSrcweir     ::osl_incrementInterlockedCount( &rSeq._pSequence->nRefCount );
63cdf0e10cSrcweir     _pSequence = rSeq._pSequence;
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
66cdf0e10cSrcweir //______________________________________________________________________________
67cdf0e10cSrcweir template< class E >
Sequence(uno_Sequence * pSequence,__sal_NoAcquire)68cdf0e10cSrcweir inline Sequence< E >::Sequence(
69cdf0e10cSrcweir     uno_Sequence * pSequence, __sal_NoAcquire ) SAL_THROW( () )
70cdf0e10cSrcweir         : _pSequence( pSequence )
71cdf0e10cSrcweir {
72cdf0e10cSrcweir }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir //______________________________________________________________________________
75cdf0e10cSrcweir template< class E >
Sequence(const E * pElements,sal_Int32 len)76cdf0e10cSrcweir inline Sequence< E >::Sequence( const E * pElements, sal_Int32 len )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     const Type & rType = ::cppu::getTypeFavourUnsigned( this );
79cdf0e10cSrcweir #if ! defined EXCEPTIONS_OFF
80cdf0e10cSrcweir     sal_Bool success =
81cdf0e10cSrcweir #endif
82cdf0e10cSrcweir     ::uno_type_sequence_construct(
83cdf0e10cSrcweir         &_pSequence, rType.getTypeLibType(),
84cdf0e10cSrcweir         const_cast< E * >( pElements ), len, (uno_AcquireFunc)cpp_acquire );
85cdf0e10cSrcweir #if ! defined EXCEPTIONS_OFF
86cdf0e10cSrcweir     if (! success)
87cdf0e10cSrcweir         throw ::std::bad_alloc();
88cdf0e10cSrcweir #endif
89cdf0e10cSrcweir }
90cdf0e10cSrcweir 
91cdf0e10cSrcweir //______________________________________________________________________________
92cdf0e10cSrcweir template< class E >
Sequence(sal_Int32 len)93cdf0e10cSrcweir inline Sequence< E >::Sequence( sal_Int32 len )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir     const Type & rType = ::cppu::getTypeFavourUnsigned( this );
96cdf0e10cSrcweir #if ! defined EXCEPTIONS_OFF
97cdf0e10cSrcweir     sal_Bool success =
98cdf0e10cSrcweir #endif
99cdf0e10cSrcweir     ::uno_type_sequence_construct(
100cdf0e10cSrcweir         &_pSequence, rType.getTypeLibType(),
101cdf0e10cSrcweir         0, len, (uno_AcquireFunc)cpp_acquire );
102cdf0e10cSrcweir #if ! defined EXCEPTIONS_OFF
103cdf0e10cSrcweir     if (! success)
104cdf0e10cSrcweir         throw ::std::bad_alloc();
105cdf0e10cSrcweir #endif
106cdf0e10cSrcweir }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir //______________________________________________________________________________
109cdf0e10cSrcweir template< class E >
~Sequence()110cdf0e10cSrcweir inline Sequence< E >::~Sequence() SAL_THROW( () )
111cdf0e10cSrcweir {
112cdf0e10cSrcweir     const Type & rType = ::cppu::getTypeFavourUnsigned( this );
113cdf0e10cSrcweir     ::uno_type_destructData(
114cdf0e10cSrcweir         this, rType.getTypeLibType(), (uno_ReleaseFunc)cpp_release );
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir //______________________________________________________________________________
118cdf0e10cSrcweir template< class E >
operator =(const Sequence<E> & rSeq)119cdf0e10cSrcweir inline Sequence< E > & Sequence< E >::operator = ( const Sequence< E > & rSeq ) SAL_THROW( () )
120cdf0e10cSrcweir {
121cdf0e10cSrcweir     const Type & rType = ::cppu::getTypeFavourUnsigned( this );
122cdf0e10cSrcweir     ::uno_type_sequence_assign(
123cdf0e10cSrcweir         &_pSequence, rSeq._pSequence, rType.getTypeLibType(), (uno_ReleaseFunc)cpp_release );
124cdf0e10cSrcweir     return *this;
125cdf0e10cSrcweir }
126cdf0e10cSrcweir 
127cdf0e10cSrcweir //______________________________________________________________________________
128cdf0e10cSrcweir template< class E >
operator ==(const Sequence<E> & rSeq) const129cdf0e10cSrcweir inline sal_Bool Sequence< E >::operator == ( const Sequence< E > & rSeq ) const
130cdf0e10cSrcweir     SAL_THROW( () )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir     if (_pSequence == rSeq._pSequence)
133cdf0e10cSrcweir         return sal_True;
134cdf0e10cSrcweir     const Type & rType = ::cppu::getTypeFavourUnsigned( this );
135cdf0e10cSrcweir     return ::uno_type_equalData(
136cdf0e10cSrcweir         const_cast< Sequence< E > * >( this ), rType.getTypeLibType(),
137cdf0e10cSrcweir         const_cast< Sequence< E > * >( &rSeq ), rType.getTypeLibType(),
138cdf0e10cSrcweir         (uno_QueryInterfaceFunc)cpp_queryInterface,
139cdf0e10cSrcweir         (uno_ReleaseFunc)cpp_release );
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir //______________________________________________________________________________
143cdf0e10cSrcweir template< class E >
operator !=(const Sequence<E> & rSeq) const144cdf0e10cSrcweir inline sal_Bool Sequence< E >::operator != ( const Sequence< E > & rSeq ) const
145cdf0e10cSrcweir     SAL_THROW( () )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir     return (! operator == ( rSeq ));
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir //______________________________________________________________________________
151cdf0e10cSrcweir template< class E >
getArray()152cdf0e10cSrcweir inline E * Sequence< E >::getArray()
153cdf0e10cSrcweir {
154cdf0e10cSrcweir     const Type & rType = ::cppu::getTypeFavourUnsigned( this );
155cdf0e10cSrcweir #if ! defined EXCEPTIONS_OFF
156cdf0e10cSrcweir     sal_Bool success =
157cdf0e10cSrcweir #endif
158cdf0e10cSrcweir     ::uno_type_sequence_reference2One(
159cdf0e10cSrcweir         &_pSequence, rType.getTypeLibType(),
160cdf0e10cSrcweir         (uno_AcquireFunc)cpp_acquire, (uno_ReleaseFunc)cpp_release );
161cdf0e10cSrcweir #if ! defined EXCEPTIONS_OFF
162cdf0e10cSrcweir     if (! success)
163cdf0e10cSrcweir         throw ::std::bad_alloc();
164cdf0e10cSrcweir #endif
165cdf0e10cSrcweir     return reinterpret_cast< E * >( _pSequence->elements );
166cdf0e10cSrcweir }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir //______________________________________________________________________________
169cdf0e10cSrcweir template< class E >
operator [](sal_Int32 nIndex)170cdf0e10cSrcweir inline E & Sequence< E >::operator [] ( sal_Int32 nIndex )
171cdf0e10cSrcweir {
172cdf0e10cSrcweir     OSL_ENSURE(
173cdf0e10cSrcweir         nIndex >= 0 && nIndex < getLength(),
174cdf0e10cSrcweir         "### illegal index of sequence!" );
175cdf0e10cSrcweir     return getArray()[ nIndex ];
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
178cdf0e10cSrcweir //______________________________________________________________________________
179cdf0e10cSrcweir template< class E >
operator [](sal_Int32 nIndex) const180cdf0e10cSrcweir inline const E & Sequence< E >::operator [] ( sal_Int32 nIndex ) const
181cdf0e10cSrcweir     SAL_THROW( () )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir     OSL_ENSURE(
184cdf0e10cSrcweir         nIndex >= 0 && nIndex < getLength(),
185cdf0e10cSrcweir         "### illegal index of sequence!" );
186cdf0e10cSrcweir     return reinterpret_cast< const E * >( _pSequence->elements )[ nIndex ];
187cdf0e10cSrcweir }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir //______________________________________________________________________________
190cdf0e10cSrcweir template< class E >
realloc(sal_Int32 nSize)191cdf0e10cSrcweir inline void Sequence< E >::realloc( sal_Int32 nSize )
192cdf0e10cSrcweir {
193cdf0e10cSrcweir     const Type & rType = ::cppu::getTypeFavourUnsigned( this );
194cdf0e10cSrcweir #if !defined EXCEPTIONS_OFF
195cdf0e10cSrcweir     sal_Bool success =
196cdf0e10cSrcweir #endif
197cdf0e10cSrcweir     ::uno_type_sequence_realloc(
198cdf0e10cSrcweir         &_pSequence, rType.getTypeLibType(), nSize,
199cdf0e10cSrcweir         (uno_AcquireFunc)cpp_acquire, (uno_ReleaseFunc)cpp_release );
200cdf0e10cSrcweir #if !defined EXCEPTIONS_OFF
201cdf0e10cSrcweir     if (!success)
202cdf0e10cSrcweir         throw ::std::bad_alloc();
203cdf0e10cSrcweir #endif
204cdf0e10cSrcweir }
205cdf0e10cSrcweir 
206cdf0e10cSrcweir //------------------------------------------------------------------------------
toUnoSequence(const::rtl::ByteSequence & rByteSequence)207cdf0e10cSrcweir inline ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL toUnoSequence(
208cdf0e10cSrcweir     const ::rtl::ByteSequence & rByteSequence ) SAL_THROW( () )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir     return ::com::sun::star::uno::Sequence< sal_Int8 >(
211cdf0e10cSrcweir         * reinterpret_cast< const ::com::sun::star::uno::Sequence< sal_Int8 > * >( &rByteSequence ) );
212cdf0e10cSrcweir }
213cdf0e10cSrcweir 
214cdf0e10cSrcweir }
215cdf0e10cSrcweir }
216cdf0e10cSrcweir }
217cdf0e10cSrcweir }
218cdf0e10cSrcweir 
219cdf0e10cSrcweir namespace cppu {
220cdf0e10cSrcweir 
221cdf0e10cSrcweir template< typename T > inline ::com::sun::star::uno::Type const &
getTypeFavourUnsigned(::com::sun::star::uno::Sequence<T> const *)222cdf0e10cSrcweir getTypeFavourUnsigned(::com::sun::star::uno::Sequence< T > const *) {
223cdf0e10cSrcweir     if (::com::sun::star::uno::Sequence< T >::s_pType == 0) {
224cdf0e10cSrcweir         ::typelib_static_sequence_type_init(
225cdf0e10cSrcweir             &::com::sun::star::uno::Sequence< T >::s_pType,
226cdf0e10cSrcweir             (::cppu::getTypeFavourUnsigned(
227cdf0e10cSrcweir                 static_cast<
228cdf0e10cSrcweir                 typename ::com::sun::star::uno::Sequence< T >::ElementType * >(
229cdf0e10cSrcweir                     0)).
230cdf0e10cSrcweir              getTypeLibType()));
231cdf0e10cSrcweir     }
232cdf0e10cSrcweir     return detail::getTypeFromTypeDescriptionReference(
233cdf0e10cSrcweir         &::com::sun::star::uno::Sequence< T >::s_pType);
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir template< typename T > inline ::com::sun::star::uno::Type const &
getTypeFavourChar(::com::sun::star::uno::Sequence<T> const *)237cdf0e10cSrcweir getTypeFavourChar(::com::sun::star::uno::Sequence< T > const *) {
238cdf0e10cSrcweir     //TODO  On certain platforms with weak memory models, the following code can
239cdf0e10cSrcweir     // result in some threads observing that td points to garbage:
240cdf0e10cSrcweir     static typelib_TypeDescriptionReference * td = 0;
241cdf0e10cSrcweir     if (td == 0) {
242cdf0e10cSrcweir         ::typelib_static_sequence_type_init(
243cdf0e10cSrcweir             &td,
244cdf0e10cSrcweir             (::cppu::getTypeFavourChar(
245cdf0e10cSrcweir                 static_cast<
246cdf0e10cSrcweir                 typename ::com::sun::star::uno::Sequence< T >::ElementType * >(
247cdf0e10cSrcweir                     0)).
248cdf0e10cSrcweir              getTypeLibType()));
249cdf0e10cSrcweir     }
250cdf0e10cSrcweir     return detail::getTypeFromTypeDescriptionReference(&td);
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir // generic sequence template
256cdf0e10cSrcweir template< class E >
257cdf0e10cSrcweir inline const ::com::sun::star::uno::Type &
getCppuType(const::com::sun::star::uno::Sequence<E> *)258cdf0e10cSrcweir SAL_CALL getCppuType( const ::com::sun::star::uno::Sequence< E > * )
259cdf0e10cSrcweir     SAL_THROW( () )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     return ::cppu::getTypeFavourUnsigned(
262cdf0e10cSrcweir         static_cast< ::com::sun::star::uno::Sequence< E > * >(0));
263cdf0e10cSrcweir }
264cdf0e10cSrcweir 
265cdf0e10cSrcweir // generic sequence template for given element type (e.g. C++ arrays)
266cdf0e10cSrcweir template< class E >
267cdf0e10cSrcweir inline const ::com::sun::star::uno::Type &
getCppuSequenceType(const::com::sun::star::uno::Type & rElementType)268cdf0e10cSrcweir SAL_CALL getCppuSequenceType( const ::com::sun::star::uno::Type & rElementType )
269cdf0e10cSrcweir     SAL_THROW( () )
270cdf0e10cSrcweir {
271cdf0e10cSrcweir     if (! ::com::sun::star::uno::Sequence< E >::s_pType)
272cdf0e10cSrcweir     {
273cdf0e10cSrcweir         ::typelib_static_sequence_type_init(
274cdf0e10cSrcweir             & ::com::sun::star::uno::Sequence< E >::s_pType,
275cdf0e10cSrcweir             rElementType.getTypeLibType() );
276cdf0e10cSrcweir     }
277cdf0e10cSrcweir     return * reinterpret_cast< const ::com::sun::star::uno::Type * >(
278cdf0e10cSrcweir         & ::com::sun::star::uno::Sequence< E >::s_pType );
279cdf0e10cSrcweir }
280cdf0e10cSrcweir 
281cdf0e10cSrcweir #if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))
282cdf0e10cSrcweir static typelib_TypeDescriptionReference * s_pType_com_sun_star_uno_Sequence_Char = 0;
283cdf0e10cSrcweir #endif
284cdf0e10cSrcweir 
285cdf0e10cSrcweir // char sequence
286cdf0e10cSrcweir inline const ::com::sun::star::uno::Type &
getCharSequenceCppuType()287cdf0e10cSrcweir SAL_CALL getCharSequenceCppuType() SAL_THROW( () )
288cdf0e10cSrcweir {
289cdf0e10cSrcweir #if !( defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))
290cdf0e10cSrcweir 	static typelib_TypeDescriptionReference * s_pType_com_sun_star_uno_Sequence_Char = 0;
291cdf0e10cSrcweir #endif
292cdf0e10cSrcweir     if (! s_pType_com_sun_star_uno_Sequence_Char)
293cdf0e10cSrcweir     {
294cdf0e10cSrcweir         const ::com::sun::star::uno::Type & rElementType = ::getCharCppuType();
295cdf0e10cSrcweir         ::typelib_static_sequence_type_init(
296cdf0e10cSrcweir             & s_pType_com_sun_star_uno_Sequence_Char,
297cdf0e10cSrcweir             rElementType.getTypeLibType() );
298cdf0e10cSrcweir     }
299cdf0e10cSrcweir     return * reinterpret_cast< const ::com::sun::star::uno::Type * >(
300cdf0e10cSrcweir         & s_pType_com_sun_star_uno_Sequence_Char );
301cdf0e10cSrcweir }
302cdf0e10cSrcweir 
303cdf0e10cSrcweir #endif
304