blob: d481300ac67a5273e8828fe11f30a315118c02c9 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _COM_SUN_STAR_UNO_TYPE_HXX_
#define _COM_SUN_STAR_UNO_TYPE_HXX_
#include <osl/mutex.hxx>
#include <com/sun/star/uno/Type.h>
#include "cppu/unotype.hxx"
namespace com
{
namespace sun
{
namespace star
{
namespace uno
{
//__________________________________________________________________________________________________
inline Type::Type() SAL_THROW( () )
{
_pType = reinterpret_cast< const ::com::sun::star::uno::Type * >(
::typelib_static_type_getByTypeClass( typelib_TypeClass_VOID ) )->getTypeLibType();
::typelib_typedescriptionreference_acquire( _pType );
}
//__________________________________________________________________________________________________
inline Type::Type( TypeClass eTypeClass, const ::rtl::OUString & rTypeName ) SAL_THROW( () )
: _pType( 0 )
{
::typelib_typedescriptionreference_new( &_pType, (typelib_TypeClass)eTypeClass, rTypeName.pData );
}
//__________________________________________________________________________________________________
inline Type::Type( TypeClass eTypeClass, const sal_Char * pTypeName ) SAL_THROW( () )
: _pType( 0 )
{
::typelib_typedescriptionreference_newByAsciiName( &_pType, (typelib_TypeClass)eTypeClass, pTypeName );
}
//__________________________________________________________________________________________________
inline Type::Type( typelib_TypeDescriptionReference * pType ) SAL_THROW( () )
: _pType( pType )
{
::typelib_typedescriptionreference_acquire( _pType );
}
//__________________________________________________________________________________________________
inline Type::Type( typelib_TypeDescriptionReference * pType, UnoType_NoAcquire ) SAL_THROW( () )
: _pType( pType )
{
}
//__________________________________________________________________________________________________
inline Type::Type( typelib_TypeDescriptionReference * pType, __sal_NoAcquire ) SAL_THROW( () )
: _pType( pType )
{
}
//__________________________________________________________________________________________________
inline Type::Type( const Type & rType ) SAL_THROW( () )
: _pType( rType._pType )
{
::typelib_typedescriptionreference_acquire( _pType );
}
//__________________________________________________________________________________________________
inline ::rtl::OUString Type::getTypeName() const SAL_THROW( () )
{
return ::rtl::OUString( _pType->pTypeName );
}
//__________________________________________________________________________________________________
inline Type & Type::operator = ( const Type & rType ) SAL_THROW( () )
{
::typelib_typedescriptionreference_assign( &_pType, rType._pType );
return *this;
}
//__________________________________________________________________________________________________
template< class T >
typelib_TypeDescriptionReference * Array< T >::s_pType = 0;
}
}
}
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const ::com::sun::star::uno::Type * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::com::sun::star::uno::Type >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuVoidType() SAL_THROW( () )
{
return ::cppu::UnoType< ::cppu::UnoVoidType >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getVoidCppuType() SAL_THROW( () )
{
return ::cppu::UnoType< ::cppu::UnoVoidType >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuBooleanType() SAL_THROW( () )
{
return ::cppu::UnoType< bool >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getBooleanCppuType() SAL_THROW( () )
{
return ::cppu::UnoType< bool >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const sal_Bool * ) SAL_THROW( () )
{
return ::cppu::UnoType< bool >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType(
bool const * ) SAL_THROW( () )
{
return ::cppu::UnoType< bool >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCharCppuType() SAL_THROW( () )
{
return ::cppu::UnoType< ::cppu::UnoCharType >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuCharType() SAL_THROW( () )
{
return ::cppu::UnoType< ::cppu::UnoCharType >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const sal_Int8 * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::sal_Int8 >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const ::rtl::OUString * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::rtl::OUString >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const sal_Int16 * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::sal_Int16 >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const sal_uInt16 * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::cppu::UnoUnsignedShortType >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const sal_Int32 * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::sal_Int32 >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const sal_uInt32 * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::sal_uInt32 >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const sal_Int64 * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::sal_Int64 >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const sal_uInt64 * ) SAL_THROW( () )
{
return ::cppu::UnoType< ::sal_uInt64 >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const float * ) SAL_THROW( () )
{
return ::cppu::UnoType< float >::get();
}
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType( const double * ) SAL_THROW( () )
{
return ::cppu::UnoType< double >::get();
}
template< class T >
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuArrayType1( T * pT ) SAL_THROW( () )
{
if (! ::com::sun::star::uno::Array< T >::s_pType)
{
const ::com::sun::star::uno::Type & rElementType =
::cppu::getTypeFavourUnsigned( *pT );
sal_Int32 size = sizeof( **pT );
sal_Int32 dim1 = sizeof( *pT ) / size;
::typelib_static_array_type_init(
& ::com::sun::star::uno::Array< T >::s_pType, rElementType.getTypeLibType(),
1, dim1 );
}
return * reinterpret_cast< const ::com::sun::star::uno::Type * >(
& ::com::sun::star::uno::Array< T >::s_pType );
}
template< class T >
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuArrayType2( T * pT ) SAL_THROW( () )
{
if (! ::com::sun::star::uno::Array< T >::s_pType)
{
const ::com::sun::star::uno::Type & rElementType =
::cppu::getTypeFavourUnsigned( **pT );
sal_Int32 size = sizeof( ***pT );
sal_Int32 dim2 = sizeof( **pT ) / size;
sal_Int32 dim1 = sizeof( *pT ) / dim2 / size;
::typelib_static_array_type_init(
& ::com::sun::star::uno::Array< T >::s_pType, rElementType.getTypeLibType(),
2, dim1, dim2 );
}
return * reinterpret_cast< const ::com::sun::star::uno::Type * >(
& ::com::sun::star::uno::Array< T >::s_pType );
}
template< class T >
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuArrayType3( T * pT ) SAL_THROW( () )
{
if (! ::com::sun::star::uno::Array< T >::s_pType)
{
const ::com::sun::star::uno::Type & rElementType =
::cppu::getTypeFavourUnsigned( ***pT );
sal_Int32 size = sizeof( ****pT );
sal_Int32 dim3 = sizeof( ***pT ) / size;
sal_Int32 dim2 = sizeof( **pT ) / dim3 / size;
sal_Int32 dim1 = sizeof( *pT ) / (dim2 * dim3)/ size;
::typelib_static_array_type_init(
& ::com::sun::star::uno::Array< T >::s_pType, rElementType.getTypeLibType(),
3, dim1, dim2, dim3 );
}
return * reinterpret_cast< const ::com::sun::star::uno::Type * >(
& ::com::sun::star::uno::Array< T >::s_pType );
}
template< class T >
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuArrayType4( T * pT ) SAL_THROW( () )
{
if (! ::com::sun::star::uno::Array< T >::s_pType)
{
const ::com::sun::star::uno::Type & rElementType =
::cppu::getTypeFavourUnsigned( ****pT );
sal_Int32 size = sizeof( *****pT );
sal_Int32 dim4 = sizeof( ****pT ) / size;
sal_Int32 dim3 = sizeof( ***pT ) / dim4 / size;
sal_Int32 dim2 = sizeof( **pT ) / (dim3 * dim4) / size;
sal_Int32 dim1 = sizeof( *pT ) / (dim2 * dim3 * dim4) / size;
::typelib_static_array_type_init(
& ::com::sun::star::uno::Array< T >::s_pType, rElementType.getTypeLibType(),
4, dim1, dim2, dim3, dim4 );
}
return * reinterpret_cast< const ::com::sun::star::uno::Type * >(
& ::com::sun::star::uno::Array< T >::s_pType );
}
template< class T >
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuArrayType5( T * pT ) SAL_THROW( () )
{
if (! ::com::sun::star::uno::Array< T >::s_pType)
{
const ::com::sun::star::uno::Type & rElementType =
::cppu::getTypeFavourUnsigned( *****pT );
sal_Int32 size = sizeof( ******pT );
sal_Int32 dim5 = sizeof( *****pT ) / size;
sal_Int32 dim4 = sizeof( ****pT ) / dim5 / size;
sal_Int32 dim3 = sizeof( ***pT ) / (dim4 * dim5) / size;
sal_Int32 dim2 = sizeof( **pT ) / (dim3 * dim4 * dim5) / size;
sal_Int32 dim1 = sizeof( *pT ) / (dim2 * dim3 * dim4 * dim5) / size;
::typelib_static_array_type_init(
& ::com::sun::star::uno::Array< T >::s_pType, rElementType.getTypeLibType(),
5, dim1, dim2, dim3, dim4, dim5 );
}
return * reinterpret_cast< const ::com::sun::star::uno::Type * >(
& ::com::sun::star::uno::Array< T >::s_pType );
}
template< class T >
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuArrayType6( T * pT ) SAL_THROW( () )
{
if (! ::com::sun::star::uno::Array< T >::s_pType)
{
const ::com::sun::star::uno::Type & rElementType =
::cppu::getTypeFavourUnsigned( ******pT );
sal_Int32 size = sizeof( *******pT );
sal_Int32 dim6 = sizeof( ******pT ) / size;
sal_Int32 dim5 = sizeof( *****pT ) / dim6 / size;
sal_Int32 dim4 = sizeof( ****pT ) / (dim5 * dim6) / size;
sal_Int32 dim3 = sizeof( ***pT ) / (dim4 * dim5 * dim6) / size;
sal_Int32 dim2 = sizeof( **pT ) / (dim3 * dim4 * dim5 * dim6) / size;
sal_Int32 dim1 = sizeof( *pT ) / (dim2 * dim3 * dim4 * dim5 * dim6) / size;
::typelib_static_array_type_init(
& ::com::sun::star::uno::Array< T >::s_pType, rElementType.getTypeLibType(),
6, dim1, dim2, dim3, dim4, dim5, dim6 );
}
return * reinterpret_cast< const ::com::sun::star::uno::Type * >(
& ::com::sun::star::uno::Array< T >::s_pType );
}
template< typename T >
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType() SAL_THROW(())
{
return ::cppu::UnoType< T >::get();
}
template<>
inline const ::com::sun::star::uno::Type & SAL_CALL getCppuType< sal_Unicode >()
SAL_THROW(())
{
return ::cppu::UnoType< ::cppu::UnoCharType >::get();
}
#endif