Coverage Report

Created: 2026-07-25 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/port/cpl_conv.h
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  CPL - Common Portability Library
4
 * Purpose:  Convenience functions declarations.
5
 *           This is intended to remain light weight.
6
 * Author:   Frank Warmerdam, warmerdam@pobox.com
7
 *
8
 ******************************************************************************
9
 * Copyright (c) 1998, Frank Warmerdam
10
 * Copyright (c) 2007-2013, Even Rouault <even dot rouault at spatialys.com>
11
 *
12
 * SPDX-License-Identifier: MIT
13
 ****************************************************************************/
14
15
#ifndef CPL_CONV_H_INCLUDED
16
#define CPL_CONV_H_INCLUDED
17
18
#include "cpl_port.h"
19
#include "cpl_vsi.h"
20
#include "cpl_error.h"
21
22
#if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
23
#include <charconv>
24
#include <cstdint>
25
#include <limits>
26
#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
27
#include <optional>
28
#define HAVE_STRING_VIEW
29
#include <string_view>
30
#endif
31
#endif
32
33
/**
34
 * \file cpl_conv.h
35
 *
36
 * Various convenience functions for CPL.
37
 *
38
 */
39
40
/* -------------------------------------------------------------------- */
41
/*      Runtime check of various configuration items.                   */
42
/* -------------------------------------------------------------------- */
43
CPL_C_START
44
45
/*! @cond Doxygen_Suppress */
46
void CPL_DLL CPLVerifyConfiguration(void);
47
/*! @endcond */
48
49
bool CPL_DLL CPLIsDebugEnabled(void);
50
51
/** Special value to indicate setting the null value to a configuration option,
52
 * even if there is an environment variable defining it.
53
 *
54
 * @since 3.13
55
 */
56
20.9k
#define CPL_NULL_VALUE "__CPL_NULL_VALUE__"
57
58
const char CPL_DLL *CPL_STDCALL CPLGetConfigOption(const char *, const char *)
59
    CPL_WARN_UNUSED_RESULT;
60
const char CPL_DLL *CPL_STDCALL CPLGetThreadLocalConfigOption(
61
    const char *, const char *) CPL_WARN_UNUSED_RESULT;
62
const char CPL_DLL *CPL_STDCALL
63
CPLGetGlobalConfigOption(const char *, const char *) CPL_WARN_UNUSED_RESULT;
64
void CPL_DLL CPL_STDCALL CPLSetConfigOption(const char *, const char *);
65
void CPL_DLL CPL_STDCALL CPLSetThreadLocalConfigOption(const char *pszKey,
66
                                                       const char *pszValue);
67
void CPL_DLL CPLDeclareKnownConfigOption(const char *pszKey,
68
                                         const char *pszDefinition);
69
char CPL_DLL **CPLGetKnownConfigOptions(void);
70
71
/** Callback for CPLSubscribeToSetConfigOption() */
72
typedef void (*CPLSetConfigOptionSubscriber)(const char *pszKey,
73
                                             const char *pszValue,
74
                                             bool bThreadLocal,
75
                                             void *pUserData);
76
int CPL_DLL CPLSubscribeToSetConfigOption(
77
    CPLSetConfigOptionSubscriber pfnCallback, void *pUserData);
78
void CPL_DLL CPLUnsubscribeToSetConfigOption(int nSubscriberId);
79
80
/*! @cond Doxygen_Suppress */
81
void CPL_DLL CPL_STDCALL CPLFreeConfig(void);
82
/*! @endcond */
83
char CPL_DLL **CPLGetConfigOptions(void);
84
void CPL_DLL CPLSetConfigOptions(const char *const *papszConfigOptions);
85
char CPL_DLL **CPLGetThreadLocalConfigOptions(void);
86
void CPL_DLL
87
CPLSetThreadLocalConfigOptions(const char *const *papszConfigOptions);
88
void CPL_DLL CPLLoadConfigOptionsFromFile(const char *pszFilename,
89
                                          int bOverrideEnvVars);
90
void CPL_DLL CPLLoadConfigOptionsFromPredefinedFiles(void);
91
92
/* -------------------------------------------------------------------- */
93
/*      Safe malloc() API.  Thin cover over VSI functions with fatal    */
94
/*      error reporting if memory allocation fails.                     */
95
/* -------------------------------------------------------------------- */
96
void CPL_DLL *CPLMalloc(size_t) CPL_WARN_UNUSED_RESULT;
97
void CPL_DLL *CPLCalloc(size_t, size_t) CPL_WARN_UNUSED_RESULT;
98
void CPL_DLL *CPLRealloc(void *, size_t) CPL_WARN_UNUSED_RESULT;
99
char CPL_DLL *
100
CPLStrdup(const char *) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
101
char CPL_DLL *CPLStrlwr(char *);
102
103
/** Alias of VSIFree() */
104
43.4k
#define CPLFree VSIFree
105
106
/* -------------------------------------------------------------------- */
107
/*      Read a line from a text file, and strip of CR/LF.               */
108
/* -------------------------------------------------------------------- */
109
char CPL_DLL *CPLFGets(char *, int, FILE *);
110
const char CPL_DLL *CPLReadLine(FILE *);
111
const char CPL_DLL *CPLReadLineL(VSILFILE *);
112
const char CPL_DLL *CPLReadLine2L(VSILFILE *, int, CSLConstList);
113
const char CPL_DLL *CPLReadLine3L(VSILFILE *, int, int *, CSLConstList);
114
115
/* -------------------------------------------------------------------- */
116
/*      Convert ASCII string to floating point number                  */
117
/*      (THESE FUNCTIONS ARE NOT LOCALE AWARE!).                        */
118
/* -------------------------------------------------------------------- */
119
double CPL_DLL CPLAtof(const char *);
120
double CPL_DLL CPLAtofDelim(const char *, char);
121
double CPL_DLL CPLStrtod(const char *, char **);
122
double CPL_DLL CPLStrtodM(const char *, char **);
123
double CPL_DLL CPLStrtodDelim(const char *, char **, char);
124
float CPL_DLL CPLStrtof(const char *, char **);
125
float CPL_DLL CPLStrtofDelim(const char *, char **, char);
126
127
#if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
128
extern "C++"
129
{
130
    namespace cpl
131
    {
132
#if defined(DOXYGEN_SKIP) || defined(HAVE_STRING_VIEW)
133
    double CPL_DLL strtod_delim(std::string_view, char **, char);
134
#endif
135
    }  // namespace cpl
136
}
137
#endif
138
139
/* -------------------------------------------------------------------- */
140
/*      Convert number to string.  This function is locale agnostic     */
141
/*      (i.e. it will support "," or "." regardless of current locale)  */
142
/* -------------------------------------------------------------------- */
143
double CPL_DLL CPLAtofM(const char *);
144
145
/* -------------------------------------------------------------------- */
146
/*      Read a numeric value from an ASCII character string.            */
147
/* -------------------------------------------------------------------- */
148
char CPL_DLL *CPLScanString(const char *, int, int, int);
149
double CPL_DLL CPLScanDouble(const char *, int);
150
long CPL_DLL CPLScanLong(const char *, int);
151
unsigned long CPL_DLL CPLScanULong(const char *, int);
152
GUIntBig CPL_DLL CPLScanUIntBig(const char *, int);
153
GIntBig CPL_DLL CPLAtoGIntBig(const char *pszString);
154
GIntBig CPL_DLL CPLAtoGIntBigEx(const char *pszString, int bWarn,
155
                                int *pbOverflow);
156
void CPL_DLL *CPLScanPointer(const char *, int);
157
158
/* -------------------------------------------------------------------- */
159
/*      Print a value to an ASCII character string.                     */
160
/* -------------------------------------------------------------------- */
161
int CPL_DLL CPLPrintString(char *, const char *, int);
162
int CPL_DLL CPLPrintStringFill(char *, const char *, int);
163
int CPL_DLL CPLPrintInt32(char *, GInt32, int);
164
int CPL_DLL CPLPrintUIntBig(char *, GUIntBig, int);
165
int CPL_DLL CPLPrintDouble(char *, const char *, double, const char *);
166
int CPL_DLL CPLPrintTime(char *, int, const char *, const struct tm *,
167
                         const char *);
168
int CPL_DLL CPLPrintPointer(char *, void *, int);
169
170
#if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
171
extern "C++"
172
{
173
    std::string CPL_DLL CPLFormatReadableFileSize(uint64_t nSizeInBytes);
174
    std::string CPL_DLL CPLFormatReadableFileSize(double dfSizeInBytes);
175
}
176
#endif
177
178
/* -------------------------------------------------------------------- */
179
/*      Fetch a function from DLL / so.                                 */
180
/* -------------------------------------------------------------------- */
181
182
void CPL_DLL *CPLGetSymbol(const char *, const char *);
183
184
/* -------------------------------------------------------------------- */
185
/*      Fetch executable path.                                          */
186
/* -------------------------------------------------------------------- */
187
int CPL_DLL CPLGetExecPath(char *pszPathBuf, int nMaxLength);
188
189
/* -------------------------------------------------------------------- */
190
/*      Filename handling functions.                                    */
191
/* -------------------------------------------------------------------- */
192
193
#if defined(DOXYGEN_SKIP) || !defined(__cplusplus) ||                          \
194
    !defined(GDAL_COMPILATION) ||                                              \
195
    (defined(__cplusplus) && defined(ALLOW_DEPRECATED_CPL_PATH_FUNCTIONS))
196
const char CPL_DLL *
197
CPLGetPath(const char *) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
198
const char CPL_DLL *
199
CPLGetDirname(const char *) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
200
const char CPL_DLL *
201
CPLGetBasename(const char *) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
202
const char CPL_DLL *
203
CPLGetExtension(const char *) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
204
const char CPL_DLL *CPLFormFilename(
205
    const char *pszPath, const char *pszBasename,
206
    const char *pszExtension) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
207
const char CPL_DLL *CPLFormCIFilename(
208
    const char *pszPath, const char *pszBasename,
209
    const char *pszExtension) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
210
const char CPL_DLL *CPLResetExtension(const char *, const char *)
211
    CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
212
const char CPL_DLL *CPLProjectRelativeFilename(const char *pszProjectDir,
213
                                               const char *pszSecondaryFilename)
214
    CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
215
const char CPL_DLL *
216
CPLCleanTrailingSlash(const char *) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
217
const char CPL_DLL *CPLGenerateTempFilename(const char *pszStem)
218
    CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
219
const char CPL_DLL *CPLExpandTilde(const char *pszFilename)
220
    CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
221
const char CPL_DLL *
222
CPLLaunderForFilename(const char *pszName,
223
                      const char *pszOutputPath) CPL_WARN_UNUSED_RESULT;
224
#endif
225
226
char CPL_DLL *CPLGetCurrentDir(void);
227
const char CPL_DLL *
228
CPLGetFilename(const char *) CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
229
int CPL_DLL CPLIsFilenameRelative(const char *pszFilename);
230
const char CPL_DLL *CPLExtractRelativePath(const char *, const char *, int *)
231
    CPL_WARN_UNUSED_RESULT CPL_RETURNS_NONNULL;
232
char CPL_DLL **
233
CPLCorrespondingPaths(const char *pszOldFilename, const char *pszNewFilename,
234
                      CSLConstList papszFileList) CPL_WARN_UNUSED_RESULT;
235
int CPL_DLL CPLCheckForFile(char *pszFilename, CSLConstList papszSiblingList);
236
237
const char CPL_DLL *CPLGetHomeDir(void) CPL_WARN_UNUSED_RESULT;
238
239
#if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
240
241
extern "C++"
242
{
243
    std::string CPL_DLL CPLGetPathSafe(const char *) CPL_WARN_UNUSED_RESULT;
244
    std::string CPL_DLL CPLGetDirnameSafe(const char *) CPL_WARN_UNUSED_RESULT;
245
    std::string CPL_DLL CPLGetBasenameSafe(const char *) CPL_WARN_UNUSED_RESULT;
246
    std::string CPL_DLL CPLGetExtensionSafe(const char *)
247
        CPL_WARN_UNUSED_RESULT;
248
    std::string CPL_DLL CPLFormFilenameSafe(
249
        const char *pszPath, const char *pszBasename,
250
        const char *pszExtension = nullptr) CPL_WARN_UNUSED_RESULT;
251
    std::string CPL_DLL CPLFormCIFilenameSafe(
252
        const char *pszPath, const char *pszBasename,
253
        const char *pszExtension = nullptr) CPL_WARN_UNUSED_RESULT;
254
    std::string CPL_DLL CPLResetExtensionSafe(const char *, const char *)
255
        CPL_WARN_UNUSED_RESULT;
256
    std::string CPL_DLL CPLProjectRelativeFilenameSafe(
257
        const char *pszProjectDir,
258
        const char *pszSecondaryFilename) CPL_WARN_UNUSED_RESULT;
259
    std::string CPL_DLL CPLCleanTrailingSlashSafe(const char *pszPath)
260
        CPL_WARN_UNUSED_RESULT;
261
    std::string CPL_DLL CPLGenerateTempFilenameSafe(const char *pszStem)
262
        CPL_WARN_UNUSED_RESULT;
263
    std::string CPL_DLL CPLExpandTildeSafe(const char *pszFilename)
264
        CPL_WARN_UNUSED_RESULT;
265
    std::string CPL_DLL CPLLaunderForFilenameSafe(
266
        const char *pszName, const char *pszOutputPath) CPL_WARN_UNUSED_RESULT;
267
    std::string CPL_DLL CPLLaunderForFilenameSafe(
268
        const std::string &osName, char chReplacementChar = '_',
269
        const char *pszExtraReservedCharacters = nullptr)
270
        CPL_WARN_UNUSED_RESULT;
271
272
#ifdef HAVE_STRING_VIEW
273
    std::string
274
        CPL_DLL CPLLexicallyNormalize(std::string_view svPath, char sep1,
275
                                      char sep2 = 0) CPL_WARN_UNUSED_RESULT;
276
#endif
277
}
278
279
#endif  // defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
280
281
bool CPL_DLL CPLHasPathTraversal(const char *pszFilename);
282
bool CPL_DLL CPLHasUnbalancedPathTraversal(const char *pszFilename);
283
284
/* -------------------------------------------------------------------- */
285
/*      Find File Function                                              */
286
/* -------------------------------------------------------------------- */
287
288
/** Callback for CPLPushFileFinder */
289
typedef char const *(*CPLFileFinder)(const char *, const char *);
290
291
const char CPL_DLL *CPLFindFile(const char *pszClass, const char *pszBasename);
292
const char CPL_DLL *CPLDefaultFindFile(const char *pszClass,
293
                                       const char *pszBasename);
294
void CPL_DLL CPLPushFileFinder(CPLFileFinder pfnFinder);
295
CPLFileFinder CPL_DLL CPLPopFileFinder(void);
296
void CPL_DLL CPLPushFinderLocation(const char *);
297
void CPL_DLL CPLPopFinderLocation(void);
298
void CPL_DLL CPLFinderClean(void);
299
300
/* -------------------------------------------------------------------- */
301
/*      Safe version of stat() that works properly on stuff like "C:".  */
302
/* -------------------------------------------------------------------- */
303
int CPL_DLL CPLStat(const char *, VSIStatBuf *) CPL_WARN_UNUSED_RESULT;
304
305
/* -------------------------------------------------------------------- */
306
/*      Reference counted file handle manager.  Makes sharing file      */
307
/*      handles more practical.                                         */
308
/* -------------------------------------------------------------------- */
309
310
/** Information on a shared file */
311
typedef struct
312
{
313
    FILE *fp;          /**< File pointer */
314
    int nRefCount;     /**< Reference counter */
315
    int bLarge;        /**< Whether fp must be interpreted as VSIFILE* */
316
    char *pszFilename; /**< Filename */
317
    char *pszAccess;   /**< Access mode */
318
} CPLSharedFileInfo;
319
320
FILE CPL_DLL *CPLOpenShared(const char *, const char *, int);
321
void CPL_DLL CPLCloseShared(FILE *);
322
CPLSharedFileInfo CPL_DLL *CPLGetSharedList(int *);
323
void CPL_DLL CPLDumpSharedList(FILE *);
324
/*! @cond Doxygen_Suppress */
325
void CPL_DLL CPLCleanupSharedFileMutex(void);
326
/*! @endcond */
327
328
/* -------------------------------------------------------------------- */
329
/*      DMS to Dec to DMS conversion.                                   */
330
/* -------------------------------------------------------------------- */
331
double CPL_DLL CPLDMSToDec(const char *is);
332
const char CPL_DLL *CPLDecToDMS(double dfAngle, const char *pszAxis,
333
                                int nPrecision);
334
double CPL_DLL CPLPackedDMSToDec(double);
335
double CPL_DLL CPLDecToPackedDMS(double dfDec);
336
337
CPLErr CPL_DLL CPLStringToComplex(const char *pszString, double *pdfReal,
338
                                  double *pdfImag);
339
340
/* -------------------------------------------------------------------- */
341
/*      Misc other functions.                                           */
342
/* -------------------------------------------------------------------- */
343
int CPL_DLL CPLUnlinkTree(const char *);
344
int CPL_DLL CPLCopyFile(const char *pszNewPath, const char *pszOldPath);
345
int CPL_DLL CPLCopyTree(const char *pszNewPath, const char *pszOldPath);
346
int CPL_DLL CPLMoveFile(const char *pszNewPath, const char *pszOldPath);
347
int CPL_DLL CPLSymlink(const char *pszOldPath, const char *pszNewPath,
348
                       CSLConstList papszOptions);
349
int CPL_DLL CPLGetRemainingFileDescriptorCount(void);
350
351
/* -------------------------------------------------------------------- */
352
/*      Lock related functions.                                         */
353
/* -------------------------------------------------------------------- */
354
355
/** Return code of CPLLockFileEx(). */
356
typedef enum
357
{
358
    CLFS_OK,                     /**< CPLLockFileEx() succeeded. */
359
    CLFS_CANNOT_CREATE_LOCK,     /**< Lock file creation failed. */
360
    CLFS_LOCK_BUSY,              /**< Lock already taken (and still alive). */
361
    CLFS_API_MISUSE,             /**< API misuse. */
362
    CLFS_THREAD_CREATION_FAILED, /**< Thread creation failed. */
363
} CPLLockFileStatus;
364
365
/** Handle type returned by CPLLockFileEx(). */
366
typedef struct CPLLockFileStruct *CPLLockFileHandle;
367
368
CPLLockFileStatus CPL_DLL CPLLockFileEx(const char *pszLockFileName,
369
                                        CPLLockFileHandle *phLockFileHandle,
370
                                        CSLConstList papszOptions);
371
372
void CPL_DLL CPLUnlockFileEx(CPLLockFileHandle hLockFileHandle);
373
374
/* -------------------------------------------------------------------- */
375
/*      ZIP Creation.                                                   */
376
/* -------------------------------------------------------------------- */
377
378
/*! @cond Doxygen_Suppress */
379
#define CPL_ZIP_API_OFFERED
380
/*! @endcond */
381
void CPL_DLL *CPLCreateZip(const char *pszZipFilename, char **papszOptions);
382
CPLErr CPL_DLL CPLCreateFileInZip(void *hZip, const char *pszFilename,
383
                                  char **papszOptions);
384
CPLErr CPL_DLL CPLWriteFileInZip(void *hZip, const void *pBuffer,
385
                                 int nBufferSize);
386
CPLErr CPL_DLL CPLCloseFileInZip(void *hZip);
387
CPLErr CPL_DLL CPLAddFileInZip(void *hZip, const char *pszArchiveFilename,
388
                               const char *pszInputFilename, VSILFILE *fpInput,
389
                               CSLConstList papszOptions,
390
                               GDALProgressFunc pProgressFunc,
391
                               void *pProgressData);
392
CPLErr CPL_DLL CPLCloseZip(void *hZip);
393
394
/* -------------------------------------------------------------------- */
395
/*      ZLib compression                                                */
396
/* -------------------------------------------------------------------- */
397
398
void CPL_DLL *CPLZLibDeflate(const void *ptr, size_t nBytes, int nLevel,
399
                             void *outptr, size_t nOutAvailableBytes,
400
                             size_t *pnOutBytes);
401
void CPL_DLL *CPLZLibInflate(const void *ptr, size_t nBytes, void *outptr,
402
                             size_t nOutAvailableBytes, size_t *pnOutBytes);
403
void CPL_DLL *CPLZLibInflateEx(const void *ptr, size_t nBytes, void *outptr,
404
                               size_t nOutAvailableBytes,
405
                               bool bAllowResizeOutptr, size_t *pnOutBytes);
406
407
/* -------------------------------------------------------------------- */
408
/*      XML validation.                                                 */
409
/* -------------------------------------------------------------------- */
410
int CPL_DLL CPLValidateXML(const char *pszXMLFilename,
411
                           const char *pszXSDFilename,
412
                           CSLConstList papszOptions);
413
414
/* -------------------------------------------------------------------- */
415
/*      Locale handling. Prevents parallel executions of setlocale().   */
416
/* -------------------------------------------------------------------- */
417
char *CPLsetlocale(int category, const char *locale);
418
/*! @cond Doxygen_Suppress */
419
void CPLCleanupSetlocaleMutex(void);
420
/*! @endcond */
421
422
/*!
423
    CPLIsPowerOfTwo()
424
    @param i - tested number
425
    @return TRUE if i is power of two otherwise return FALSE
426
*/
427
int CPL_DLL CPLIsPowerOfTwo(unsigned int i);
428
429
/* -------------------------------------------------------------------- */
430
/*      Terminal related                                                */
431
/* -------------------------------------------------------------------- */
432
433
bool CPL_DLL CPLIsInteractive(FILE *f);
434
435
CPL_C_END
436
437
/* -------------------------------------------------------------------- */
438
/*      C++ object for temporarily forcing a LC_NUMERIC locale to "C".  */
439
/* -------------------------------------------------------------------- */
440
441
//! @cond Doxygen_Suppress
442
#if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
443
444
extern "C++"
445
{
446
    class CPL_DLL CPLLocaleC
447
    {
448
        CPL_DISALLOW_COPY_ASSIGN(CPLLocaleC)
449
      public:
450
        CPLLocaleC();
451
        ~CPLLocaleC();
452
453
      private:
454
        char *pszOldLocale;
455
    };
456
457
    // Does the same as CPLLocaleC except that, when available, it tries to
458
    // only affect the current thread. But code that would be dependent of
459
    // setlocale(LC_NUMERIC, NULL) returning "C", such as current proj.4
460
    // versions, will not work depending on the actual implementation
461
    class CPLThreadLocaleCPrivate;
462
463
    class CPL_DLL CPLThreadLocaleC
464
    {
465
        CPL_DISALLOW_COPY_ASSIGN(CPLThreadLocaleC)
466
467
      public:
468
        CPLThreadLocaleC();
469
        ~CPLThreadLocaleC();
470
471
      private:
472
        CPLThreadLocaleCPrivate *m_private;
473
    };
474
}
475
476
#endif /* def __cplusplus */
477
//! @endcond
478
479
/* -------------------------------------------------------------------- */
480
/*      C++ object for temporarily forcing a config option              */
481
/* -------------------------------------------------------------------- */
482
483
//! @cond Doxygen_Suppress
484
#if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
485
486
extern "C++"
487
{
488
    class CPL_DLL CPLConfigOptionSetter
489
    {
490
        CPL_DISALLOW_COPY_ASSIGN(CPLConfigOptionSetter)
491
      public:
492
        CPLConfigOptionSetter(const char *pszKey, const char *pszValue,
493
                              bool bSetOnlyIfUndefined);
494
        ~CPLConfigOptionSetter();
495
496
      private:
497
        char *m_pszKey;
498
        char *m_pszOldValue;
499
        bool m_bRestoreOldValue;
500
    };
501
}
502
503
#endif /* def __cplusplus */
504
//! @endcond
505
506
#if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
507
508
extern "C++"
509
{
510
511
#ifndef DOXYGEN_SKIP
512
#include <type_traits>  // for std::is_base_of
513
#endif
514
515
    namespace cpl
516
    {
517
    /** Use cpl::down_cast<Derived*>(pointer_to_base) as equivalent of
518
     * static_cast<Derived*>(pointer_to_base) with safe checking in debug
519
     * mode.
520
     *
521
     * Only works if no virtual inheritance is involved.
522
     *
523
     * @param f pointer to a base class
524
     * @return pointer to a derived class
525
     */
526
    template <typename To, typename From> inline To down_cast(From *f)
527
0
    {
528
0
        static_assert(
529
0
            (std::is_base_of<From,
530
0
                             typename std::remove_pointer<To>::type>::value),
531
0
            "target type not derived from source type");
532
0
        CPLAssert(f == nullptr || dynamic_cast<To>(f) != nullptr);
533
0
        return static_cast<To>(f);
534
0
    }
Unexecuted instantiation: VSIGZipFilesystemHandler* cpl::down_cast<VSIGZipFilesystemHandler*, VSIFilesystemHandler>(VSIFilesystemHandler*)
Unexecuted instantiation: VSIZipReader* cpl::down_cast<VSIZipReader*, VSIArchiveReader>(VSIArchiveReader*)
Unexecuted instantiation: VSIZipWriteHandle* cpl::down_cast<VSIZipWriteHandle*, VSIVirtualHandle>(VSIVirtualHandle*)
Unexecuted instantiation: OGRPolygon const* cpl::down_cast<OGRPolygon const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRPoint* cpl::down_cast<OGRPoint*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRPoint const* cpl::down_cast<OGRPoint const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRCurve* cpl::down_cast<OGRCurve*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRCurve const* cpl::down_cast<OGRCurve const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRSimpleCurve* cpl::down_cast<OGRSimpleCurve*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRSimpleCurve const* cpl::down_cast<OGRSimpleCurve const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRLineString* cpl::down_cast<OGRLineString*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRLineString const* cpl::down_cast<OGRLineString const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRLinearRing* cpl::down_cast<OGRLinearRing*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRLinearRing const* cpl::down_cast<OGRLinearRing const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRCircularString* cpl::down_cast<OGRCircularString*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRCircularString const* cpl::down_cast<OGRCircularString const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRCompoundCurve* cpl::down_cast<OGRCompoundCurve*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRCompoundCurve const* cpl::down_cast<OGRCompoundCurve const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRSurface* cpl::down_cast<OGRSurface*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRSurface const* cpl::down_cast<OGRSurface const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRPolygon* cpl::down_cast<OGRPolygon*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRTriangle* cpl::down_cast<OGRTriangle*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRTriangle const* cpl::down_cast<OGRTriangle const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRCurvePolygon* cpl::down_cast<OGRCurvePolygon*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRCurvePolygon const* cpl::down_cast<OGRCurvePolygon const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRGeometryCollection* cpl::down_cast<OGRGeometryCollection*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRGeometryCollection const* cpl::down_cast<OGRGeometryCollection const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRMultiPoint* cpl::down_cast<OGRMultiPoint*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRMultiPoint const* cpl::down_cast<OGRMultiPoint const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRMultiLineString* cpl::down_cast<OGRMultiLineString*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRMultiLineString const* cpl::down_cast<OGRMultiLineString const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRMultiPolygon* cpl::down_cast<OGRMultiPolygon*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRMultiPolygon const* cpl::down_cast<OGRMultiPolygon const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRMultiCurve* cpl::down_cast<OGRMultiCurve*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRMultiCurve const* cpl::down_cast<OGRMultiCurve const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRMultiSurface* cpl::down_cast<OGRMultiSurface*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRMultiSurface const* cpl::down_cast<OGRMultiSurface const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRPolyhedralSurface* cpl::down_cast<OGRPolyhedralSurface*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRPolyhedralSurface const* cpl::down_cast<OGRPolyhedralSurface const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRTriangulatedSurface* cpl::down_cast<OGRTriangulatedSurface*, OGRGeometry>(OGRGeometry*)
Unexecuted instantiation: OGRTriangulatedSurface const* cpl::down_cast<OGRTriangulatedSurface const*, OGRGeometry const>(OGRGeometry const*)
Unexecuted instantiation: OGRSimpleCurve* cpl::down_cast<OGRSimpleCurve*, OGRCurve>(OGRCurve*)
Unexecuted instantiation: OGRSimpleCurve const* cpl::down_cast<OGRSimpleCurve const*, OGRCurve const>(OGRCurve const*)
Unexecuted instantiation: OGRLineString const* cpl::down_cast<OGRLineString const*, OGRCurve>(OGRCurve*)
Unexecuted instantiation: OGRCurvePolygon const* cpl::down_cast<OGRCurvePolygon const*, OGRCurvePolygon>(OGRCurvePolygon*)
Unexecuted instantiation: OGRPolygon const* cpl::down_cast<OGRPolygon const*, OGRCurvePolygon>(OGRCurvePolygon*)
Unexecuted instantiation: OGRLinearRing* cpl::down_cast<OGRLinearRing*, OGRCurve>(OGRCurve*)
Unexecuted instantiation: OGRCodedFieldDomain* cpl::down_cast<OGRCodedFieldDomain*, OGRFieldDomain>(OGRFieldDomain*)
Unexecuted instantiation: GDALProxyPoolDataset* cpl::down_cast<GDALProxyPoolDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GDALOverviewBand* cpl::down_cast<GDALOverviewBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: GDALOverviewDataset* cpl::down_cast<GDALOverviewDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: VRTSourcedRasterBand* cpl::down_cast<VRTSourcedRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: GDALDatasetFromArray* cpl::down_cast<GDALDatasetFromArray*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GDALMDArrayResampledDataset* cpl::down_cast<GDALMDArrayResampledDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GTiffDataset* cpl::down_cast<GTiffDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GTiffRasterBand* cpl::down_cast<GTiffRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: GTiffJPEGOverviewDS* cpl::down_cast<GTiffJPEGOverviewDS*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GTiffOddBitsBand* cpl::down_cast<GTiffOddBitsBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: MEMRasterBand* cpl::down_cast<MEMRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: VRTDataset* cpl::down_cast<VRTDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: VRTSimpleSource* cpl::down_cast<VRTSimpleSource*, VRTSource>(VRTSource*)
Unexecuted instantiation: VRTComplexSource* cpl::down_cast<VRTComplexSource*, VRTSimpleSource>(VRTSimpleSource*)
Unexecuted instantiation: GDALProxyPoolRasterBand* cpl::down_cast<GDALProxyPoolRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: VRTRasterBand* cpl::down_cast<VRTRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: VRTSourcedRasterBand* cpl::down_cast<VRTSourcedRasterBand*, VRTRasterBand>(VRTRasterBand*)
Unexecuted instantiation: VRTProcessedDataset* cpl::down_cast<VRTProcessedDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: OGRShapeLayer* cpl::down_cast<OGRShapeLayer*, OGRLayer>(OGRLayer*)
Unexecuted instantiation: OGRShapeGeomFieldDefn* cpl::down_cast<OGRShapeGeomFieldDefn*, OGRGeomFieldDefn>(OGRGeomFieldDefn*)
Unexecuted instantiation: OGRShapeGeomFieldDefn const* cpl::down_cast<OGRShapeGeomFieldDefn const*, OGRGeomFieldDefn>(OGRGeomFieldDefn*)
Unexecuted instantiation: OGRGenSQLGeomFieldDefn const* cpl::down_cast<OGRGenSQLGeomFieldDefn const*, OGRGeomFieldDefn const>(OGRGeomFieldDefn const*)
Unexecuted instantiation: OGRUnionLayerGeomFieldDefn* cpl::down_cast<OGRUnionLayerGeomFieldDefn*, OGRGeomFieldDefn>(OGRGeomFieldDefn*)
Unexecuted instantiation: GDALInConstructionAlgorithmArg* cpl::down_cast<GDALInConstructionAlgorithmArg*, GDALAlgorithmArg>(GDALAlgorithmArg*)
Unexecuted instantiation: GDALComputedDataset* cpl::down_cast<GDALComputedDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GDALPamRasterBand* cpl::down_cast<GDALPamRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: RawRasterBand* cpl::down_cast<RawRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: OGRCodedFieldDomain const* cpl::down_cast<OGRCodedFieldDomain const*, OGRFieldDomain const>(OGRFieldDomain const*)
Unexecuted instantiation: VRTDerivedRasterBand* cpl::down_cast<VRTDerivedRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: gdalalg_raster_tile.cpp:(anonymous namespace)::MosaicDataset* cpl::down_cast<(anonymous namespace)::MosaicDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GDALApplyVSGRasterBand* cpl::down_cast<GDALApplyVSGRasterBand*, GDALRasterBand>(GDALRasterBand*)
Unexecuted instantiation: GDALApplyVSGDataset* cpl::down_cast<GDALApplyVSGDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: OGRRangeFieldDomain const* cpl::down_cast<OGRRangeFieldDomain const*, OGRFieldDomain const>(OGRFieldDomain const*)
Unexecuted instantiation: OGRGlobFieldDomain const* cpl::down_cast<OGRGlobFieldDomain const*, OGRFieldDomain const>(OGRFieldDomain const*)
Unexecuted instantiation: GDALColorReliefDataset* cpl::down_cast<GDALColorReliefDataset*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GDALGeneric3x3Dataset<int>* cpl::down_cast<GDALGeneric3x3Dataset<int>*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GDALGeneric3x3Dataset<float>* cpl::down_cast<GDALGeneric3x3Dataset<float>*, GDALDataset>(GDALDataset*)
Unexecuted instantiation: GDALPipelineStepAlgorithm* cpl::down_cast<GDALPipelineStepAlgorithm*, GDALAlgorithm>(GDALAlgorithm*)
535
536
    /** Computes ceil(a/b) where a and b are integers */
537
    template <class T, class U> inline T div_round_up(T a, U b)
538
0
    {
539
0
        return a / b + (((a % b) == 0) ? 0 : 1);
540
0
    }
Unexecuted instantiation: unsigned long cpl::div_round_up<unsigned long, unsigned long>(unsigned long, unsigned long)
Unexecuted instantiation: int cpl::div_round_up<int, int>(int, int)
Unexecuted instantiation: unsigned long long cpl::div_round_up<unsigned long long, unsigned long>(unsigned long long, unsigned long)
Unexecuted instantiation: unsigned long long cpl::div_round_up<unsigned long long, long long>(unsigned long long, long long)
Unexecuted instantiation: unsigned long long cpl::div_round_up<unsigned long long, unsigned long long>(unsigned long long, unsigned long long)
541
542
#ifdef HAVE_STRING_VIEW
543
    template <typename T>
544
    std::optional<T> CPL_DLL strict_parse(std::string_view str);
545
#endif
546
547
    }  // namespace cpl
548
}  // extern "C++"
549
550
#ifdef HAVE_STRING_VIEW
551
#undef HAVE_STRING_VIEW
552
#endif
553
554
#endif /* def __cplusplus */
555
556
#endif /* ndef CPL_CONV_H_INCLUDED */