Coverage Report

Created: 2026-05-16 09:25

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