LCOV - code coverage report
Current view: top level - cppu/source/uno - eq.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 150 284 52.8 %
Date: 2012-08-25 Functions: 4 4 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 149 385 38.7 %

           Branch data     Line data    Source code
       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                 :            : #ifndef EQ_HXX
      20                 :            : #define EQ_HXX
      21                 :            : 
      22                 :            : #include <math.h>
      23                 :            : #include <rtl/memory.h>
      24                 :            : 
      25                 :            : #include "prim.hxx"
      26                 :            : #include "destr.hxx"
      27                 :            : 
      28                 :            : 
      29                 :            : namespace cppu
      30                 :            : {
      31                 :            : 
      32                 :            : //##################################################################################################
      33                 :            : //#### equality ####################################################################################
      34                 :            : //##################################################################################################
      35                 :            : 
      36                 :            : //--------------------------------------------------------------------------------------------------
      37                 :       3772 : inline sal_Bool _equalObject(
      38                 :            :     void * pI1, void * pI2,
      39                 :            :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
      40                 :            :     SAL_THROW(())
      41                 :            : {
      42         [ +  + ]:       3772 :     if (pI1 == pI2)
      43                 :       3559 :         return sal_True;
      44 [ +  + ][ -  + ]:        213 :     if ((0 == pI1) || (0 == pI2))
      45                 :        102 :         return sal_False;
      46                 :        111 :     sal_Bool bRet = sal_False;
      47                 :            : 
      48                 :            :     typelib_TypeDescriptionReference * type_XInterface =
      49                 :        111 :         * typelib_static_type_getByTypeClass( typelib_TypeClass_INTERFACE );
      50         [ -  + ]:        111 :     if (0 == queryInterface)
      51                 :          0 :         queryInterface = binuno_queryInterface;
      52                 :        111 :     pI1 = (*queryInterface)( pI1, type_XInterface );
      53         [ +  - ]:        111 :     if (0 != pI1)
      54                 :            :     {
      55                 :        111 :         pI2 = (*queryInterface)( pI2, type_XInterface );
      56         [ +  - ]:        111 :         if (0 != pI2)
      57                 :            :         {
      58                 :        111 :             bRet = (pI1 == pI2);
      59                 :        111 :             _release( pI2, release );
      60                 :            :         }
      61                 :        111 :         _release( pI1, release );
      62                 :            :     }
      63                 :       3772 :     return bRet;
      64                 :            : }
      65                 :            : 
      66                 :            : //==================================================================================================
      67                 :            : sal_Bool equalStruct(
      68                 :            :     void * pDest, void *pSource,
      69                 :            :     typelib_CompoundTypeDescription * pTypeDescr,
      70                 :            :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
      71                 :            :     SAL_THROW(());
      72                 :            : //--------------------------------------------------------------------------------------------------
      73                 :      57675 : inline sal_Bool _equalStruct(
      74                 :            :     void * pDest, void *pSource,
      75                 :            :     typelib_CompoundTypeDescription * pTypeDescr,
      76                 :            :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
      77                 :            :     SAL_THROW(())
      78                 :            : {
      79   [ +  +  -  + ]:      57835 :     if (pTypeDescr->pBaseTypeDescription &&
                 [ -  + ]
      80                 :        160 :         !equalStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription, queryInterface, release ))
      81                 :            :     {
      82                 :          0 :         return sal_False;
      83                 :            :     }
      84                 :            : 
      85                 :      57675 :     typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
      86                 :      57675 :     sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
      87                 :      57675 :     sal_Int32 nDescr = pTypeDescr->nMembers;
      88                 :            : 
      89         [ +  + ]:     211262 :     while (nDescr--)
      90                 :            :     {
      91                 :     167196 :         sal_Int32 nOffset = pMemberOffsets[nDescr];
      92         [ +  + ]:     167196 :         if (! ::uno_type_equalData( (char *)pDest + nOffset,
      93                 :     167196 :                                     ppTypeRefs[nDescr],
      94                 :     167196 :                                     (char *)pSource + nOffset,
      95                 :     167196 :                                     ppTypeRefs[nDescr],
      96                 :     167196 :                                     queryInterface, release ))
      97                 :            :         {
      98                 :      13609 :             return sal_False;
      99                 :            :         }
     100                 :            :     }
     101                 :      57675 :     return sal_True;
     102                 :            : }
     103                 :            : //==================================================================================================
     104                 :            : sal_Bool equalSequence(
     105                 :            :     uno_Sequence * pDest, uno_Sequence * pSource,
     106                 :            :     typelib_TypeDescriptionReference * pElementType,
     107                 :            :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
     108                 :            :     SAL_THROW(());
     109                 :            : //--------------------------------------------------------------------------------------------------
     110                 :      56182 : inline sal_Bool _equalSequence(
     111                 :            :     uno_Sequence * pDest, uno_Sequence * pSource,
     112                 :            :     typelib_TypeDescriptionReference * pElementType,
     113                 :            :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
     114                 :            :     SAL_THROW(())
     115                 :            : {
     116         [ +  + ]:      56182 :     if (pDest == pSource)
     117                 :       7085 :         return sal_True;
     118                 :      49097 :     sal_Int32 nElements = pDest->nElements;
     119         [ +  + ]:      49097 :     if (nElements != pSource->nElements)
     120                 :      27128 :         return sal_False;
     121         [ +  + ]:      21969 :     if (! nElements)
     122                 :         15 :         return sal_True;
     123                 :            : 
     124                 :      21954 :     void * pDestElements = pDest->elements;
     125                 :      21954 :     void * pSourceElements = pSource->elements;
     126                 :            : 
     127   [ -  +  +  +  :      21954 :     switch (pElementType->eTypeClass)
          +  +  +  +  +  
          -  +  +  +  -  
                +  +  - ]
     128                 :            :     {
     129                 :            :     case typelib_TypeClass_CHAR:
     130                 :          0 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Unicode) * nElements ));
     131                 :            :     case typelib_TypeClass_BOOLEAN:
     132                 :            :     {
     133         [ +  + ]:         40 :         for ( sal_Int32 nPos = nElements; nPos--; )
     134                 :            :         {
     135         [ -  + ]:         30 :             if ((((sal_Bool *)pDestElements)[nPos] != sal_False) !=
     136                 :         30 :                 (((sal_Bool *)pSourceElements)[nPos] != sal_False))
     137                 :            :             {
     138                 :          0 :                 return sal_False;
     139                 :            :             }
     140                 :            :         }
     141                 :         10 :         return sal_True;
     142                 :            :     }
     143                 :            :     case typelib_TypeClass_BYTE:
     144                 :        159 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int8) * nElements ));
     145                 :            :     case typelib_TypeClass_SHORT:
     146                 :            :     case typelib_TypeClass_UNSIGNED_SHORT:
     147                 :        116 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int16) * nElements ));
     148                 :            :     case typelib_TypeClass_LONG:
     149                 :            :     case typelib_TypeClass_UNSIGNED_LONG:
     150                 :        275 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int32) * nElements ));
     151                 :            :     case typelib_TypeClass_HYPER:
     152                 :            :     case typelib_TypeClass_UNSIGNED_HYPER:
     153                 :         20 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int64) * nElements ));
     154                 :            :     case typelib_TypeClass_FLOAT:
     155                 :            :     {
     156         [ +  + ]:         40 :         for ( sal_Int32 nPos = nElements; nPos--; )
     157                 :            :         {
     158         [ -  + ]:         30 :             if (((float *)pDestElements)[nPos] != ((float *)pSourceElements)[nPos])
     159                 :          0 :                 return sal_False;
     160                 :            :         }
     161                 :         10 :         return sal_True;
     162                 :            :     }
     163                 :            :     case typelib_TypeClass_DOUBLE:
     164                 :            :     {
     165         [ +  + ]:         40 :         for ( sal_Int32 nPos = nElements; nPos--; )
     166                 :            :         {
     167         [ -  + ]:         30 :             if (((double *)pDestElements)[nPos] != ((double *)pSourceElements)[nPos])
     168                 :          0 :                 return sal_False;
     169                 :            :         }
     170                 :         10 :         return sal_True;
     171                 :            :     }
     172                 :            :     case typelib_TypeClass_STRING:
     173                 :            :     {
     174         [ +  + ]:       3761 :         for ( sal_Int32 nPos = nElements; nPos--; )
     175                 :            :         {
     176         [ +  + ]:       3379 :             if (! ((::rtl::OUString *)pDestElements +nPos)->equals( ((const ::rtl::OUString *)pSourceElements)[nPos] ))
     177                 :          2 :                 return sal_False;
     178                 :            :         }
     179                 :        382 :         return sal_True;
     180                 :            :     }
     181                 :            :     case typelib_TypeClass_TYPE:
     182                 :            :     {
     183         [ #  # ]:          0 :         for ( sal_Int32 nPos = nElements; nPos--; )
     184                 :            :         {
     185         [ #  # ]:          0 :             if (! _type_equals( ((typelib_TypeDescriptionReference **)pDestElements)[nPos],
     186                 :          0 :                                 ((typelib_TypeDescriptionReference **)pSourceElements)[nPos] ))
     187                 :            :             {
     188                 :          0 :                 return sal_False;
     189                 :            :             }
     190                 :            :         }
     191                 :          0 :         return sal_True;
     192                 :            :     }
     193                 :            :     case typelib_TypeClass_ANY:
     194                 :            :     {
     195         [ +  + ]:         60 :         for ( sal_Int32 nPos = nElements; nPos--; )
     196                 :            :         {
     197                 :         45 :             uno_Any * pDest2 = (uno_Any *)pDestElements + nPos;
     198                 :         45 :             uno_Any * pSource2 = (uno_Any *)pSourceElements + nPos;
     199         [ -  + ]:         45 :             if (! ::uno_type_equalData( pDest2->pData, pDest2->pType,
     200                 :            :                                         pSource2->pData, pSource2->pType,
     201                 :         45 :                                         queryInterface, release ))
     202                 :            :             {
     203                 :          0 :                 return sal_False;
     204                 :            :             }
     205                 :            :         }
     206                 :         15 :         return sal_True;
     207                 :            :     }
     208                 :            :     case typelib_TypeClass_ENUM:
     209                 :         10 :         return (0 == memcmp( pDestElements, pSourceElements, sizeof(sal_Int32) * nElements ));
     210                 :            :     case typelib_TypeClass_STRUCT:
     211                 :            :     case typelib_TypeClass_EXCEPTION:
     212                 :            :     {
     213                 :      15335 :         typelib_TypeDescription * pElementTypeDescr = 0;
     214 [ +  - ][ -  + ]:      15335 :         TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
         [ +  - ][ -  + ]
                 [ #  # ]
     215                 :      15335 :         sal_Int32 nElementSize = pElementTypeDescr->nSize;
     216         [ +  + ]:      37020 :         for ( sal_Int32 nPos = nElements; nPos--; )
     217                 :            :         {
     218         [ +  + ]:      32090 :             if (! _equalStruct( (char *)pDestElements + (nPos * nElementSize),
     219                 :      32090 :                                 (char *)pSourceElements + (nPos * nElementSize),
     220                 :            :                                 (typelib_CompoundTypeDescription *)pElementTypeDescr,
     221         [ +  - ]:      32090 :                                 queryInterface, release ))
     222                 :            :             {
     223 [ +  - ][ -  + ]:      10405 :                 TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     224                 :      10405 :                 return sal_False;
     225                 :            :             }
     226                 :            :         }
     227 [ +  - ][ -  + ]:       4930 :         TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     228                 :      15335 :         return sal_True;
     229                 :            :     }
     230                 :            :     case typelib_TypeClass_UNION:
     231                 :            :     {
     232                 :          0 :         typelib_TypeDescription * pElementTypeDescr = 0;
     233 [ #  # ][ #  # ]:          0 :         TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
         [ #  # ][ #  # ]
                 [ #  # ]
     234                 :          0 :         sal_Int32 nElementSize = pElementTypeDescr->nSize;
     235                 :          0 :         sal_Int32 nValueOffset = ((typelib_UnionTypeDescription *)pElementTypeDescr)->nValueOffset;
     236         [ #  # ]:          0 :         for ( sal_Int32 nPos = nElements; nPos--; )
     237                 :            :         {
     238                 :          0 :             char * pDest2 = (char *)pDestElements + (nPos * nElementSize);
     239                 :          0 :             char * pSource2 = (char *)pSourceElements + (nPos * nElementSize);
     240                 :            :             typelib_TypeDescriptionReference * pSetType = _unionGetSetType(
     241                 :          0 :                 pDest2, pElementTypeDescr );
     242                 :            :             sal_Bool bRet = ::uno_type_equalData(
     243                 :          0 :                 pDest2 + nValueOffset, pSetType,
     244                 :          0 :                 pSource2 + nValueOffset, pSetType,
     245                 :          0 :                 queryInterface, release );
     246                 :          0 :             ::typelib_typedescriptionreference_release( pSetType );
     247         [ #  # ]:          0 :             if (! bRet)
     248                 :            :             {
     249 [ #  # ][ #  # ]:          0 :                 TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     250                 :          0 :                 return sal_False;
     251                 :            :             }
     252                 :            :         }
     253 [ #  # ][ #  # ]:          0 :         TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     254                 :          0 :         return sal_True;
     255                 :            :     }
     256                 :            :     case typelib_TypeClass_SEQUENCE: // sequence of sequence
     257                 :            :     {
     258                 :       5595 :         typelib_TypeDescription * pElementTypeDescr = 0;
     259 [ +  - ][ -  + ]:       5595 :         TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
         [ +  - ][ -  + ]
                 [ #  # ]
     260                 :            :         typelib_TypeDescriptionReference * pSeqElementType =
     261                 :       5595 :             ((typelib_IndirectTypeDescription *)pElementTypeDescr)->pType;
     262         [ +  + ]:       6230 :         for ( sal_Int32 nPos = nElements; nPos--; )
     263                 :            :         {
     264         [ +  + ]:       5655 :             if (! equalSequence( ((uno_Sequence **)pDestElements)[nPos],
     265                 :       5655 :                                  ((uno_Sequence **)pSourceElements)[nPos],
     266         [ +  - ]:       5655 :                                  pSeqElementType, queryInterface, release ))
     267                 :            :             {
     268 [ +  - ][ -  + ]:       5020 :                 TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     269                 :       5020 :                 return sal_False;
     270                 :            :             }
     271                 :            :         }
     272 [ +  - ][ -  + ]:        575 :         TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     273                 :       5595 :         return sal_True;
     274                 :            :     }
     275                 :            :     case typelib_TypeClass_INTERFACE:
     276                 :            :     {
     277         [ +  + ]:         60 :         for ( sal_Int32 nPos = nElements; nPos--; )
     278                 :            :         {
     279         [ -  + ]:         45 :             if (! _equalObject( ((void **)pDestElements)[nPos], ((void **)pSourceElements)[nPos],
     280                 :         45 :                                 queryInterface, release ))
     281                 :            :             {
     282                 :          0 :                 return sal_False;
     283                 :            :             }
     284                 :            :         }
     285                 :         15 :         return sal_True;
     286                 :            :     }
     287                 :            :     default:
     288                 :            :         OSL_ASSERT(false);
     289                 :      56182 :         return sal_False;
     290                 :            :     }
     291                 :            : }
     292                 :            : //--------------------------------------------------------------------------------------------------
     293                 :     652095 : inline sal_Bool _equalData(
     294                 :            :     void * pDest,
     295                 :            :     typelib_TypeDescriptionReference * pDestType, typelib_TypeDescription * pDestTypeDescr,
     296                 :            :     void * pSource,
     297                 :            :     typelib_TypeDescriptionReference * pSourceType,
     298                 :            :     uno_QueryInterfaceFunc queryInterface, uno_ReleaseFunc release )
     299                 :            :     SAL_THROW(())
     300                 :            : {
     301                 :            :     typelib_TypeClass eSourceTypeClass, eDestTypeClass;
     302         [ +  + ]:     690580 :     while (typelib_TypeClass_ANY == (eDestTypeClass = pDestType->eTypeClass))
     303                 :            :     {
     304                 :      38485 :         pDestTypeDescr = 0;
     305                 :      38485 :         pDestType = ((uno_Any *)pDest)->pType;
     306                 :      38485 :         pDest = ((uno_Any *)pDest)->pData;
     307                 :            :     }
     308         [ +  + ]:     690580 :     while (typelib_TypeClass_ANY == (eSourceTypeClass = pSourceType->eTypeClass))
     309                 :            :     {
     310                 :      38485 :         pSourceType = ((uno_Any *)pSource)->pType;
     311                 :      38485 :         pSource = ((uno_Any *)pSource)->pData;
     312                 :            :     }
     313                 :            : 
     314   [ +  +  +  +  :     652095 :     switch (eDestTypeClass)
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  -  +  +  
                      - ]
     315                 :            :     {
     316                 :            :     case typelib_TypeClass_VOID:
     317                 :      15784 :         return eSourceTypeClass == typelib_TypeClass_VOID;
     318                 :            :     case typelib_TypeClass_CHAR:
     319                 :            :         return eSourceTypeClass == typelib_TypeClass_CHAR
     320 [ +  - ][ +  - ]:        150 :             && *(sal_Unicode *)pDest == *(sal_Unicode *)pSource;
     321                 :            :     case typelib_TypeClass_BOOLEAN:
     322                 :            :         return eSourceTypeClass == typelib_TypeClass_BOOLEAN
     323                 :            :             && ((*(sal_Bool *)pDest != sal_False)
     324 [ +  + ][ +  + ]:      45879 :                 == (*(sal_Bool *)pSource != sal_False));
     325                 :            :     case typelib_TypeClass_BYTE:
     326   [ +  -  -  -  :        150 :         switch (eSourceTypeClass)
          -  -  -  -  -  
                      - ]
     327                 :            :         {
     328                 :            :         case typelib_TypeClass_BYTE:
     329                 :        150 :             return (*(sal_Int8 *)pDest == *(sal_Int8 *)pSource);
     330                 :            :         case typelib_TypeClass_SHORT:
     331                 :          0 :             return ((sal_Int16)*(sal_Int8 *)pDest == *(sal_Int16 *)pSource);
     332                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     333                 :          0 :             return ((sal_Int32)*(sal_Int8 *)pDest == (sal_Int32)*(sal_uInt16 *)pSource);
     334                 :            :         case typelib_TypeClass_LONG:
     335                 :          0 :             return ((sal_Int32)*(sal_Int8 *)pDest == *(sal_Int32 *)pSource);
     336                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     337                 :          0 :             return ((sal_Int64)*(sal_Int8 *)pDest == (sal_Int64)*(sal_uInt32 *)pSource);
     338                 :            :         case typelib_TypeClass_HYPER:
     339                 :          0 :             return ((sal_Int64)*(sal_Int8 *)pDest == *(sal_Int64 *)pSource);
     340                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     341                 :            :             return (*(sal_Int8 *)pDest >= 0 &&
     342 [ #  # ][ #  # ]:          0 :                     (sal_Int64)*(sal_Int8 *)pDest == *(sal_Int64 *)pSource); // same size
     343                 :            :         case typelib_TypeClass_FLOAT:
     344                 :          0 :             return ((float)*(sal_Int8 *)pDest == *(float *)pSource);
     345                 :            :         case typelib_TypeClass_DOUBLE:
     346                 :          0 :             return ((double)*(sal_Int8 *)pDest == *(double *)pSource);
     347                 :            :         default:
     348                 :          0 :             return sal_False;
     349                 :            :         }
     350                 :            :     case typelib_TypeClass_SHORT:
     351   [ -  +  -  -  :      70968 :         switch (eSourceTypeClass)
          -  -  -  -  -  
                      + ]
     352                 :            :         {
     353                 :            :         case typelib_TypeClass_BYTE:
     354                 :          0 :             return (*(sal_Int16 *)pDest == (sal_Int16)*(sal_Int8 *)pSource);
     355                 :            :         case typelib_TypeClass_SHORT:
     356                 :      70962 :             return (*(sal_Int16 *)pDest == *(sal_Int16 *)pSource);
     357                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     358                 :          0 :             return ((sal_Int32)*(sal_Int16 *)pDest == (sal_Int32)*(sal_uInt16 *)pSource);
     359                 :            :         case typelib_TypeClass_LONG:
     360                 :          0 :             return ((sal_Int32)*(sal_Int16 *)pDest == *(sal_Int32 *)pSource);
     361                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     362                 :          0 :             return ((sal_Int64)*(sal_Int16 *)pDest == (sal_Int64)*(sal_uInt32 *)pSource);
     363                 :            :         case typelib_TypeClass_HYPER:
     364                 :          0 :             return ((sal_Int64)*(sal_Int16 *)pDest == *(sal_Int64 *)pSource);
     365                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     366                 :            :             return (*(sal_Int16 *)pDest >= 0 &&
     367 [ #  # ][ #  # ]:          0 :                     (sal_Int64)*(sal_Int16 *)pDest == *(sal_Int64 *)pSource); // same size
     368                 :            :         case typelib_TypeClass_FLOAT:
     369                 :          0 :             return ((float)*(sal_Int16 *)pDest == *(float *)pSource);
     370                 :            :         case typelib_TypeClass_DOUBLE:
     371                 :          0 :             return ((double)*(sal_Int16 *)pDest == *(double *)pSource);
     372                 :            :         default:
     373                 :          6 :             return sal_False;
     374                 :            :         }
     375                 :            :     case typelib_TypeClass_UNSIGNED_SHORT:
     376   [ -  -  +  -  :        192 :         switch (eSourceTypeClass)
          -  -  -  -  -  
                      - ]
     377                 :            :         {
     378                 :            :         case typelib_TypeClass_BYTE:
     379                 :          0 :             return ((sal_Int32)*(sal_uInt16 *)pDest == (sal_Int32)*(sal_Int8 *)pSource);
     380                 :            :         case typelib_TypeClass_SHORT:
     381                 :          0 :             return ((sal_Int32)*(sal_uInt16 *)pDest == (sal_Int32)*(sal_Int16 *)pSource);
     382                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     383                 :        192 :             return (*(sal_uInt16 *)pDest == *(sal_uInt16 *)pSource);
     384                 :            :         case typelib_TypeClass_LONG:
     385                 :          0 :             return ((sal_Int32)*(sal_uInt16 *)pDest == *(sal_Int32 *)pSource);
     386                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     387                 :          0 :             return ((sal_uInt32)*(sal_uInt16 *)pDest == *(sal_uInt32 *)pSource);
     388                 :            :         case typelib_TypeClass_HYPER:
     389                 :          0 :             return ((sal_Int64)*(sal_uInt16 *)pDest == *(sal_Int64 *)pSource);
     390                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     391                 :          0 :             return ((sal_uInt64)*(sal_uInt16 *)pDest == *(sal_uInt64 *)pSource);
     392                 :            :         case typelib_TypeClass_FLOAT:
     393                 :          0 :             return ((float)*(sal_uInt16 *)pDest == *(float *)pSource);
     394                 :            :         case typelib_TypeClass_DOUBLE:
     395                 :          0 :             return ((double)*(sal_uInt16 *)pDest == *(double *)pSource);
     396                 :            :         default:
     397                 :          0 :             return sal_False;
     398                 :            :         }
     399                 :            :     case typelib_TypeClass_LONG:
     400   [ -  -  -  +  :     266394 :         switch (eSourceTypeClass)
          +  -  -  -  -  
                      + ]
     401                 :            :         {
     402                 :            :         case typelib_TypeClass_BYTE:
     403                 :          0 :             return (*(sal_Int32 *)pDest == (sal_Int32)*(sal_Int8 *)pSource);
     404                 :            :         case typelib_TypeClass_SHORT:
     405                 :          0 :             return (*(sal_Int32 *)pDest == (sal_Int32)*(sal_Int16 *)pSource);
     406                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     407                 :          0 :             return (*(sal_Int32 *)pDest == (sal_Int32)*(sal_uInt16 *)pSource);
     408                 :            :         case typelib_TypeClass_LONG:
     409                 :     266266 :             return (*(sal_Int32 *)pDest == *(sal_Int32 *)pSource);
     410                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     411                 :         48 :             return ((sal_Int64)*(sal_Int32 *)pDest == (sal_Int64)*(sal_uInt32 *)pSource);
     412                 :            :         case typelib_TypeClass_HYPER:
     413                 :          0 :             return ((sal_Int64)*(sal_Int32 *)pDest == *(sal_Int64 *)pSource);
     414                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     415                 :            :             return (*(sal_Int32 *)pDest >= 0 &&
     416 [ #  # ][ #  # ]:          0 :                     (sal_Int64)*(sal_Int32 *)pDest == *(sal_Int64 *)pSource); // same size
     417                 :            :         case typelib_TypeClass_FLOAT:
     418                 :          0 :             return ((float)*(sal_Int32 *)pDest == *(float *)pSource);
     419                 :            :         case typelib_TypeClass_DOUBLE:
     420                 :          0 :             return ((double)*(sal_Int32 *)pDest == *(double *)pSource);
     421                 :            :         default:
     422                 :         80 :             return sal_False;
     423                 :            :         }
     424                 :            :     case typelib_TypeClass_UNSIGNED_LONG:
     425   [ -  -  -  +  :        712 :         switch (eSourceTypeClass)
          +  -  -  -  -  
                      - ]
     426                 :            :         {
     427                 :            :         case typelib_TypeClass_BYTE:
     428                 :          0 :             return ((sal_Int64)*(sal_uInt32 *)pDest == (sal_Int64)*(sal_Int8 *)pSource);
     429                 :            :         case typelib_TypeClass_SHORT:
     430                 :          0 :             return ((sal_Int64)*(sal_uInt32 *)pDest == (sal_Int64)*(sal_Int16 *)pSource);
     431                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     432                 :          0 :             return (*(sal_uInt32 *)pDest == (sal_uInt32)*(sal_uInt16 *)pSource);
     433                 :            :         case typelib_TypeClass_LONG:
     434                 :         12 :             return ((sal_Int64)*(sal_uInt32 *)pDest == (sal_Int64)*(sal_Int32 *)pSource);
     435                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     436                 :        700 :             return (*(sal_uInt32 *)pDest == *(sal_uInt32 *)pSource);
     437                 :            :         case typelib_TypeClass_HYPER:
     438                 :          0 :             return ((sal_Int64)*(sal_uInt32 *)pDest == *(sal_Int64 *)pSource);
     439                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     440                 :          0 :             return ((sal_uInt64)*(sal_uInt32 *)pDest == *(sal_uInt64 *)pSource);
     441                 :            :         case typelib_TypeClass_FLOAT:
     442                 :          0 :             return ((float)*(sal_uInt32 *)pDest == *(float *)pSource);
     443                 :            :         case typelib_TypeClass_DOUBLE:
     444                 :          0 :             return ((double)*(sal_uInt32 *)pDest == *(double *)pSource);
     445                 :            :         default:
     446                 :          0 :             return sal_False;
     447                 :            :         }
     448                 :            :     case typelib_TypeClass_HYPER:
     449   [ -  -  -  -  :        376 :         switch (eSourceTypeClass)
          -  +  -  -  -  
                      - ]
     450                 :            :         {
     451                 :            :         case typelib_TypeClass_BYTE:
     452                 :          0 :             return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_Int8 *)pSource);
     453                 :            :         case typelib_TypeClass_SHORT:
     454                 :          0 :             return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_Int16 *)pSource);
     455                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     456                 :          0 :             return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_uInt16 *)pSource);
     457                 :            :         case typelib_TypeClass_LONG:
     458                 :          0 :             return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_Int32 *)pSource);
     459                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     460                 :          0 :             return (*(sal_Int64 *)pDest == (sal_Int64)*(sal_uInt32 *)pSource);
     461                 :            :         case typelib_TypeClass_HYPER:
     462                 :        376 :             return (*(sal_Int64 *)pDest == *(sal_Int64 *)pSource);
     463                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     464                 :            :             return (*(sal_Int64 *)pDest >= 0 &&
     465 [ #  # ][ #  # ]:          0 :                     *(sal_Int64 *)pDest == *(sal_Int64 *)pSource); // same size
     466                 :            :         case typelib_TypeClass_FLOAT:
     467                 :          0 :             return ((float)*(sal_Int64 *)pDest == *(float *)pSource);
     468                 :            :         case typelib_TypeClass_DOUBLE:
     469                 :          0 :             return ((double)*(sal_Int64 *)pDest == *(double *)pSource);
     470                 :            :         default:
     471                 :          0 :             return sal_False;
     472                 :            :         }
     473                 :            :     case typelib_TypeClass_UNSIGNED_HYPER:
     474   [ -  -  -  -  :        150 :         switch (eSourceTypeClass)
          -  -  +  -  -  
                      - ]
     475                 :            :         {
     476                 :            :         case typelib_TypeClass_BYTE:
     477                 :            :             return (*(sal_Int8 *)pSource >= 0 &&
     478 [ #  # ][ #  # ]:          0 :                     *(sal_uInt64 *)pDest == (sal_uInt64)*(sal_Int8 *)pSource);
     479                 :            :         case typelib_TypeClass_SHORT:
     480                 :            :             return (*(sal_Int16 *)pSource >= 0 &&
     481 [ #  # ][ #  # ]:          0 :                     *(sal_uInt64 *)pDest == (sal_uInt64)*(sal_Int16 *)pSource);
     482                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     483                 :          0 :             return (*(sal_uInt64 *)pDest == (sal_uInt64)*(sal_uInt16 *)pSource);
     484                 :            :         case typelib_TypeClass_LONG:
     485                 :            :             return (*(sal_Int32 *)pSource >= 0 &&
     486 [ #  # ][ #  # ]:          0 :                     *(sal_uInt64 *)pDest == (sal_uInt64)*(sal_Int32 *)pSource);
     487                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     488                 :          0 :             return (*(sal_uInt64 *)pDest == (sal_uInt64)*(sal_uInt32 *)pSource);
     489                 :            :         case typelib_TypeClass_HYPER:
     490                 :            :             return (*(sal_Int64 *)pSource >= 0 &&
     491 [ #  # ][ #  # ]:          0 :                     *(sal_uInt64 *)pDest == (sal_uInt64)*(sal_Int64 *)pSource);
     492                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     493                 :        150 :             return (*(sal_uInt64 *)pDest == *(sal_uInt64 *)pSource);
     494                 :            :         case typelib_TypeClass_FLOAT:
     495 [ #  # ][ #  # ]:          0 :             if (::floor( *(float *)pSource ) != *(float *)pSource || *(float *)pSource < 0)
     496                 :          0 :                 return sal_False;
     497                 :          0 :             return (*(sal_uInt64 *)pDest == (sal_uInt64)*(float *)pSource);
     498                 :            :         case typelib_TypeClass_DOUBLE:
     499 [ #  # ][ #  # ]:          0 :             if (::floor( *(double *)pSource ) != *(double *)pSource || *(double *)pSource < 0)
     500                 :          0 :                 return sal_False;
     501                 :          0 :             return (*(sal_uInt64 *)pDest == (sal_uInt64)*(double *)pSource);
     502                 :            :         default:
     503                 :          0 :             return sal_False;
     504                 :            :         }
     505                 :            :     case typelib_TypeClass_FLOAT:
     506   [ -  -  -  -  :      31207 :         switch (eSourceTypeClass)
          -  -  -  +  -  
                      - ]
     507                 :            :         {
     508                 :            :         case typelib_TypeClass_BYTE:
     509                 :          0 :             return (*(float *)pDest == (float)*(sal_Int8 *)pSource);
     510                 :            :         case typelib_TypeClass_SHORT:
     511                 :          0 :             return (*(float *)pDest == (float)*(sal_Int16 *)pSource);
     512                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     513                 :          0 :             return (*(float *)pDest == (float)*(sal_uInt16 *)pSource);
     514                 :            :         case typelib_TypeClass_LONG:
     515                 :          0 :             return (*(float *)pDest == (float)*(sal_Int32 *)pSource);
     516                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     517                 :          0 :             return (*(float *)pDest == (float)*(sal_uInt32 *)pSource);
     518                 :            :         case typelib_TypeClass_HYPER:
     519                 :          0 :             return (*(float *)pDest == (float)*(sal_Int64 *)pSource);
     520                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     521 [ #  # ][ #  # ]:          0 :             if (::floor( *(float *)pDest ) != *(float *)pDest || *(float *)pDest < 0)
     522                 :          0 :                 return sal_False;
     523                 :          0 :             return ((sal_uInt64)*(float *)pDest == *(sal_uInt64 *)pSource);
     524                 :            :         case typelib_TypeClass_FLOAT:
     525                 :      31207 :             return (*(float *)pDest == *(float *)pSource);
     526                 :            :         case typelib_TypeClass_DOUBLE:
     527                 :          0 :             return ((double)*(float *)pDest == *(double *)pSource);
     528                 :            :         default:
     529                 :          0 :             return sal_False;
     530                 :            :         }
     531                 :            :     case typelib_TypeClass_DOUBLE:
     532   [ -  -  -  -  :       1265 :         switch (eSourceTypeClass)
          -  -  -  -  +  
                      + ]
     533                 :            :         {
     534                 :            :         case typelib_TypeClass_BYTE:
     535                 :          0 :             return (*(double *)pDest == (double)*(sal_Int8 *)pSource);
     536                 :            :         case typelib_TypeClass_SHORT:
     537                 :          0 :             return (*(double *)pDest == (double)*(sal_Int16 *)pSource);
     538                 :            :         case typelib_TypeClass_UNSIGNED_SHORT:
     539                 :          0 :             return (*(double *)pDest == (double)*(sal_uInt16 *)pSource);
     540                 :            :         case typelib_TypeClass_LONG:
     541                 :          0 :             return (*(double *)pDest == (double)*(sal_Int32 *)pSource);
     542                 :            :         case typelib_TypeClass_UNSIGNED_LONG:
     543                 :          0 :             return (*(double *)pDest == (double)*(sal_uInt32 *)pSource);
     544                 :            :         case typelib_TypeClass_HYPER:
     545                 :          0 :             return (*(double *)pDest == (double)*(sal_Int64 *)pSource);
     546                 :            :         case typelib_TypeClass_UNSIGNED_HYPER:
     547 [ #  # ][ #  # ]:          0 :             if (::floor( *(double *)pDest ) != *(double *)pDest || *(double *)pDest < 0)
     548                 :          0 :                 return sal_False;
     549                 :          0 :             return ((sal_uInt64)*(double *)pDest == *(sal_uInt64 *)pSource);
     550                 :            :         case typelib_TypeClass_FLOAT:
     551                 :          0 :             return (*(double *)pDest == (double)*(float *)pSource);
     552                 :            :         case typelib_TypeClass_DOUBLE:
     553                 :       1117 :             return (*(double *)pDest == *(double *)pSource);
     554                 :            :         default:
     555                 :        148 :             return sal_False;
     556                 :            :         }
     557                 :            :     case typelib_TypeClass_STRING:
     558                 :            :         return eSourceTypeClass == typelib_TypeClass_STRING
     559                 :            :             && ((::rtl::OUString *)pDest)->equals(
     560 [ +  - ][ +  + ]:      90512 :                 *(::rtl::OUString const *)pSource );
     561                 :            :     case typelib_TypeClass_TYPE:
     562                 :            :         return eSourceTypeClass == typelib_TypeClass_TYPE
     563                 :            :             && _type_equals(
     564                 :            :                 *(typelib_TypeDescriptionReference **)pDest,
     565 [ +  - ][ +  - ]:          5 :                 *(typelib_TypeDescriptionReference **)pSource );
     566                 :            :     case typelib_TypeClass_ENUM:
     567                 :      42542 :         return (_type_equals( pDestType, pSourceType ) &&
     568 [ +  + ][ +  - ]:      42542 :                 *(sal_Int32 *)pDest == *(sal_Int32 *)pSource);
     569                 :            :     case typelib_TypeClass_STRUCT:
     570                 :            :     case typelib_TypeClass_EXCEPTION:
     571         [ -  + ]:      25425 :         if (! _type_equals( pDestType, pSourceType ))
     572                 :          0 :             return sal_False;
     573         [ -  + ]:      25425 :         if (pDestTypeDescr)
     574                 :            :         {
     575                 :            :             return _equalStruct(
     576                 :            :                 pDest, pSource,
     577                 :            :                 (typelib_CompoundTypeDescription *)pDestTypeDescr,
     578                 :          0 :                 queryInterface, release );
     579                 :            :         }
     580                 :            :         else
     581                 :            :         {
     582 [ +  - ][ -  + ]:      25425 :             TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
         [ +  - ][ -  + ]
                 [ #  # ]
     583                 :            :             sal_Bool bRet = _equalStruct(
     584                 :            :                 pDest, pSource,
     585                 :            :                 (typelib_CompoundTypeDescription *)pDestTypeDescr,
     586                 :      25425 :                 queryInterface, release );
     587 [ -  + ][ +  - ]:      25425 :             TYPELIB_DANGER_RELEASE( pDestTypeDescr );
     588                 :      25425 :             return bRet;
     589                 :            :         }
     590                 :            :     case typelib_TypeClass_UNION:
     591 [ #  # ][ #  # ]:          0 :         if (_type_equals( pDestType, pSourceType ) &&
                 [ #  # ]
     592                 :            :             *(sal_Int64 *)pDest == *(sal_Int64 *)pSource) // same discriminant
     593                 :            :         {
     594                 :            :             sal_Bool bRet;
     595         [ #  # ]:          0 :             if (pDestTypeDescr)
     596                 :            :             {
     597                 :            :                 typelib_TypeDescriptionReference * pSetType = _unionGetSetType(
     598                 :          0 :                     pDest, pDestTypeDescr );
     599                 :            :                 bRet = ::uno_type_equalData(
     600                 :          0 :                     (char *)pDest + ((typelib_UnionTypeDescription *)pDestTypeDescr)->nValueOffset,
     601                 :            :                     pSetType,
     602                 :          0 :                     (char *)pSource + ((typelib_UnionTypeDescription *)pDestTypeDescr)->nValueOffset,
     603                 :            :                     pSetType,
     604                 :          0 :                     queryInterface, release );
     605                 :          0 :                 typelib_typedescriptionreference_release( pSetType );
     606                 :            :             }
     607                 :            :             else
     608                 :            :             {
     609 [ #  # ][ #  # ]:          0 :                 TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
         [ #  # ][ #  # ]
                 [ #  # ]
     610                 :            :                 typelib_TypeDescriptionReference * pSetType = _unionGetSetType(
     611                 :          0 :                     pDest, pDestTypeDescr );
     612                 :            :                 bRet = ::uno_type_equalData(
     613                 :          0 :                     (char *)pDest + ((typelib_UnionTypeDescription *)pDestTypeDescr)->nValueOffset,
     614                 :            :                     pSetType,
     615                 :          0 :                     (char *)pSource + ((typelib_UnionTypeDescription *)pDestTypeDescr)->nValueOffset,
     616                 :            :                     pSetType,
     617                 :          0 :                     queryInterface, release );
     618                 :          0 :                 typelib_typedescriptionreference_release( pSetType );
     619 [ #  # ][ #  # ]:          0 :                 TYPELIB_DANGER_RELEASE( pDestTypeDescr );
     620                 :            :             }
     621                 :          0 :             return bRet;
     622                 :            :         }
     623                 :          0 :         return sal_False;
     624                 :            :     case typelib_TypeClass_SEQUENCE:
     625         [ +  + ]:      56396 :         if (_type_equals( pDestType, pSourceType ))
     626                 :            :         {
     627         [ -  + ]:      50527 :             if (pDestTypeDescr)
     628                 :            :             {
     629                 :            :                 return _equalSequence(
     630                 :            :                     *(uno_Sequence **)pDest, *(uno_Sequence **)pSource,
     631                 :            :                     ((typelib_IndirectTypeDescription *)pDestTypeDescr)->pType,
     632                 :          0 :                     queryInterface, release );
     633                 :            :             }
     634                 :            :             else
     635                 :            :             {
     636 [ +  - ][ -  + ]:      50527 :                 TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
         [ +  - ][ -  + ]
                 [ #  # ]
     637                 :            :                 sal_Bool bRet = _equalSequence(
     638                 :            :                     *(uno_Sequence **)pDest, *(uno_Sequence **)pSource,
     639                 :            :                     ((typelib_IndirectTypeDescription *)pDestTypeDescr)->pType,
     640                 :      50527 :                     queryInterface, release );
     641 [ -  + ][ +  - ]:      50527 :                 TYPELIB_DANGER_RELEASE( pDestTypeDescr );
     642                 :      50527 :                 return bRet;
     643                 :            :             }
     644                 :            :         }
     645                 :       5869 :         return sal_False;
     646                 :            :     case typelib_TypeClass_INTERFACE:
     647         [ +  + ]:       3988 :         if (typelib_TypeClass_INTERFACE == eSourceTypeClass)
     648                 :       3727 :             return _equalObject( *(void **)pDest, *(void **)pSource, queryInterface, release );
     649                 :        261 :         break;
     650                 :            :     default:
     651                 :            :         OSL_ASSERT(false);
     652                 :          0 :         break;
     653                 :            :     }
     654                 :     652095 :     return sal_False;
     655                 :            : }
     656                 :            : 
     657                 :            : }
     658                 :            : 
     659                 :            : #endif
     660                 :            : 
     661                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10