Coverage Report

Created: 2025-11-16 06:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/frmts/mem/memdataset.h
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  Memory Array Translator
4
 * Purpose:  Declaration of MEMDataset, and MEMRasterBand.
5
 * Author:   Frank Warmerdam, warmerdam@pobox.com
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2000, Frank Warmerdam
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#ifndef MEMDATASET_H_INCLUDED
14
#define MEMDATASET_H_INCLUDED
15
16
#include "gdal_pam.h"
17
#include "gdal_priv.h"
18
#include "gdal_rat.h"
19
#include "ogrsf_frmts.h"
20
21
#include <map>
22
#include <memory>
23
24
CPL_C_START
25
26
void CPL_DLL GDALRegister_MEM();
27
28
/* Caution: if changing this prototype, also change in
29
   swig/include/gdal_python.i where it is redefined */
30
GDALRasterBandH CPL_DLL MEMCreateRasterBand(GDALDataset *, int, GByte *,
31
                                            GDALDataType, int, int, int);
32
GDALRasterBandH CPL_DLL MEMCreateRasterBandEx(GDALDataset *, int, GByte *,
33
                                              GDALDataType, GSpacing, GSpacing,
34
                                              int);
35
CPL_C_END
36
37
/************************************************************************/
38
/*                            MEMDataset                                */
39
/************************************************************************/
40
41
class MEMRasterBand;
42
class OGRMemLayer;
43
44
class CPL_DLL MEMDataset CPL_NON_FINAL : public GDALDataset
45
{
46
    CPL_DISALLOW_COPY_ASSIGN(MEMDataset)
47
48
    friend class MEMRasterBand;
49
50
    int bGeoTransformSet;
51
    GDALGeoTransform m_gt{};
52
53
    OGRSpatialReference m_oSRS{};
54
55
    std::vector<gdal::GCP> m_aoGCPs{};
56
    OGRSpatialReference m_oGCPSRS{};
57
58
    using GDALDatasetRefCountedPtr =
59
        std::unique_ptr<GDALDataset, GDALDatasetUniquePtrReleaser>;
60
61
    std::vector<GDALDatasetRefCountedPtr> m_apoOverviewDS{};
62
63
    struct Private;
64
    std::unique_ptr<Private> m_poPrivate;
65
66
    std::vector<std::unique_ptr<OGRMemLayer>> m_apoLayers{};
67
68
#if 0
69
  protected:
70
    virtual int                 EnterReadWrite(GDALRWFlag eRWFlag);
71
    virtual void                LeaveReadWrite();
72
#endif
73
74
    friend void GDALRegister_MEM();
75
76
    // cppcheck-suppress unusedPrivateFunction
77
    static GDALDataset *CreateBase(const char *pszFilename, int nXSize,
78
                                   int nYSize, int nBands, GDALDataType eType,
79
                                   char **papszParamList);
80
81
  protected:
82
    bool CanBeCloned(int nScopeFlags, bool bCanShareState) const override;
83
84
    std::unique_ptr<GDALDataset> Clone(int nScopeFlags,
85
                                       bool bCanShareState) const override;
86
87
  public:
88
    MEMDataset();
89
    ~MEMDataset() override;
90
91
    CPLErr Close() override;
92
93
    const OGRSpatialReference *GetSpatialRef() const override;
94
    const OGRSpatialReference *GetSpatialRefRasterOnly() const override;
95
    CPLErr SetSpatialRef(const OGRSpatialReference *poSRS) override;
96
97
    CPLErr GetGeoTransform(GDALGeoTransform &gt) const override;
98
    CPLErr SetGeoTransform(const GDALGeoTransform &gt) override;
99
100
    void *GetInternalHandle(const char *) override;
101
102
    int GetGCPCount() override;
103
    const OGRSpatialReference *GetGCPSpatialRef() const override;
104
    const GDAL_GCP *GetGCPs() override;
105
    CPLErr SetGCPs(int nGCPCount, const GDAL_GCP *pasGCPList,
106
                   const OGRSpatialReference *poSRS) override;
107
    virtual CPLErr AddBand(GDALDataType eType,
108
                           char **papszOptions = nullptr) override;
109
    CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
110
                     int nYSize, void *pData, int nBufXSize, int nBufYSize,
111
                     GDALDataType eBufType, int nBandCount,
112
                     BANDMAP_TYPE panBandMap, GSpacing nPixelSpaceBuf,
113
                     GSpacing nLineSpaceBuf, GSpacing nBandSpaceBuf,
114
                     GDALRasterIOExtraArg *psExtraArg) override;
115
    CPLErr IBuildOverviews(const char *pszResampling, int nOverviews,
116
                           const int *panOverviewList, int nListBands,
117
                           const int *panBandList, GDALProgressFunc pfnProgress,
118
                           void *pProgressData,
119
                           CSLConstList papszOptions) override;
120
121
    CPLErr CreateMaskBand(int nFlagsIn) override;
122
123
    std::shared_ptr<GDALGroup> GetRootGroup() const override;
124
125
    void AddMEMBand(GDALRasterBandH hMEMBand);
126
127
    static GDALDataset *Open(GDALOpenInfo *);
128
    static MEMDataset *Create(const char *pszFilename, int nXSize, int nYSize,
129
                              int nBands, GDALDataType eType,
130
                              char **papszParamList);
131
    static GDALDataset *
132
    CreateMultiDimensional(const char *pszFilename,
133
                           CSLConstList papszRootGroupOptions,
134
                           CSLConstList papszOptions);
135
136
    // Vector capabilities
137
138
    int GetLayerCount() const override
139
0
    {
140
0
        return static_cast<int>(m_apoLayers.size());
141
0
    }
142
143
    const OGRLayer *GetLayer(int) const override;
144
145
    using GDALDataset::CreateLayer;
146
147
    OGRMemLayer *CreateLayer(const OGRFeatureDefn &oDefn,
148
                             CSLConstList papszOptions);
149
150
    OGRLayer *ICreateLayer(const char *pszName,
151
                           const OGRGeomFieldDefn *poGeomFieldDefn,
152
                           CSLConstList papszOptions) override;
153
    OGRErr DeleteLayer(int iLayer) override;
154
155
    int TestCapability(const char *) const override;
156
157
    OGRLayer *ExecuteSQL(const char *pszStatement, OGRGeometry *poSpatialFilter,
158
                         const char *pszDialect) override;
159
160
    bool AddFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain,
161
                        std::string &failureReason) override;
162
163
    bool DeleteFieldDomain(const std::string &name,
164
                           std::string &failureReason) override;
165
166
    bool UpdateFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain,
167
                           std::string &failureReason) override;
168
};
169
170
/************************************************************************/
171
/*                            MEMRasterBand                             */
172
/************************************************************************/
173
174
class CPL_DLL MEMRasterBand CPL_NON_FINAL : public GDALPamRasterBand
175
{
176
  private:
177
    CPL_DISALLOW_COPY_ASSIGN(MEMRasterBand)
178
179
  protected:
180
    friend class MEMDataset;
181
182
    GByte *pabyData;
183
    GSpacing nPixelOffset;
184
    GSpacing nLineOffset;
185
    int bOwnData;
186
187
    bool m_bIsMask = false;
188
189
    MEMRasterBand(GByte *pabyDataIn, GDALDataType eTypeIn, int nXSizeIn,
190
                  int nYSizeIn, bool bOwnDataIn);
191
192
  public:
193
    MEMRasterBand(GDALDataset *poDS, int nBand, GByte *pabyData,
194
                  GDALDataType eType, GSpacing nPixelOffset,
195
                  GSpacing nLineOffset, int bAssumeOwnership,
196
                  const char *pszPixelType = nullptr);
197
    ~MEMRasterBand() override;
198
199
    CPLErr IReadBlock(int, int, void *) override;
200
    CPLErr IWriteBlock(int, int, void *) override;
201
    CPLErr IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize,
202
                     int nYSize, void *pData, int nBufXSize, int nBufYSize,
203
                     GDALDataType eBufType, GSpacing nPixelSpaceBuf,
204
                     GSpacing nLineSpaceBuf,
205
                     GDALRasterIOExtraArg *psExtraArg) override;
206
207
    int GetOverviewCount() override;
208
    GDALRasterBand *GetOverview(int) override;
209
210
    CPLErr CreateMaskBand(int nFlagsIn) override;
211
    bool IsMaskBand() const override;
212
213
    // Allow access to MEM driver's private internal memory buffer.
214
    GByte *GetData() const
215
0
    {
216
0
        return (pabyData);
217
0
    }
218
};
219
220
/************************************************************************/
221
/*                             OGRMemLayer                              */
222
/************************************************************************/
223
224
class IOGRMemLayerFeatureIterator;
225
226
class CPL_DLL OGRMemLayer CPL_NON_FINAL : public OGRLayer
227
{
228
    CPL_DISALLOW_COPY_ASSIGN(OGRMemLayer)
229
230
    typedef std::map<GIntBig, std::unique_ptr<OGRFeature>> FeatureMap;
231
    typedef FeatureMap::iterator FeatureIterator;
232
233
    OGRFeatureDefn *m_poFeatureDefn = nullptr;
234
235
    GIntBig m_nFeatureCount = 0;
236
237
    GIntBig m_iNextReadFID = 0;
238
    GIntBig m_nMaxFeatureCount = 0;  // Max size of papoFeatures.
239
    OGRFeature **m_papoFeatures = nullptr;
240
    bool m_bHasHoles = false;
241
242
    FeatureMap m_oMapFeatures{};
243
    FeatureIterator m_oMapFeaturesIter{};
244
245
    GIntBig m_iNextCreateFID = 0;
246
247
    bool m_bUpdatable = true;
248
    bool m_bAdvertizeUTF8 = false;
249
250
    bool m_bUpdated = false;
251
252
    std::string m_osFIDColumn{};
253
254
    GDALDataset *m_poDS{};
255
256
    // Only use it in the lifetime of a function where the list of features
257
    // doesn't change.
258
    IOGRMemLayerFeatureIterator *GetIterator();
259
260
  protected:
261
    OGRFeature *GetFeatureRef(GIntBig nFeatureId);
262
263
  public:
264
    // Clone poSRS if not nullptr
265
    OGRMemLayer(const char *pszName, const OGRSpatialReference *poSRS,
266
                OGRwkbGeometryType eGeomType);
267
    explicit OGRMemLayer(const OGRFeatureDefn &oFeatureDefn);
268
    ~OGRMemLayer() override;
269
270
    void ResetReading() override;
271
    OGRFeature *GetNextFeature() override;
272
    OGRErr SetNextByIndex(GIntBig nIndex) override;
273
274
    OGRFeature *GetFeature(GIntBig nFeatureId) override;
275
    OGRErr ISetFeature(OGRFeature *poFeature) override;
276
    OGRErr ICreateFeature(OGRFeature *poFeature) override;
277
    OGRErr IUpsertFeature(OGRFeature *poFeature) override;
278
    OGRErr IUpdateFeature(OGRFeature *poFeature, int nUpdatedFieldsCount,
279
                          const int *panUpdatedFieldsIdx,
280
                          int nUpdatedGeomFieldsCount,
281
                          const int *panUpdatedGeomFieldsIdx,
282
                          bool bUpdateStyleString) override;
283
    OGRErr DeleteFeature(GIntBig nFID) override;
284
285
    using OGRLayer::GetLayerDefn;
286
287
    const OGRFeatureDefn *GetLayerDefn() const override
288
0
    {
289
0
        return m_poFeatureDefn;
290
0
    }
291
292
    GIntBig GetFeatureCount(int) override;
293
294
    virtual OGRErr CreateField(const OGRFieldDefn *poField,
295
                               int bApproxOK = TRUE) override;
296
    OGRErr DeleteField(int iField) override;
297
    OGRErr ReorderFields(int *panMap) override;
298
    virtual OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
299
                                  int nFlags) override;
300
    virtual OGRErr
301
    AlterGeomFieldDefn(int iGeomField,
302
                       const OGRGeomFieldDefn *poNewGeomFieldDefn,
303
                       int nFlagsIn) override;
304
    virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomField,
305
                                   int bApproxOK = TRUE) override;
306
307
    int TestCapability(const char *) const override;
308
309
    const char *GetFIDColumn() const override
310
0
    {
311
0
        return m_osFIDColumn.c_str();
312
0
    }
313
314
    bool IsUpdatable() const
315
0
    {
316
0
        return m_bUpdatable;
317
0
    }
318
319
    void SetUpdatable(bool bUpdatableIn)
320
0
    {
321
0
        m_bUpdatable = bUpdatableIn;
322
0
    }
323
324
    void SetAdvertizeUTF8(bool bAdvertizeUTF8In)
325
0
    {
326
0
        m_bAdvertizeUTF8 = bAdvertizeUTF8In;
327
0
    }
328
329
    void SetFIDColumn(const char *pszFIDColumn)
330
0
    {
331
0
        m_osFIDColumn = pszFIDColumn;
332
0
    }
333
334
    bool HasBeenUpdated() const
335
0
    {
336
0
        return m_bUpdated;
337
0
    }
338
339
    void SetUpdated(bool bUpdated)
340
0
    {
341
0
        m_bUpdated = bUpdated;
342
0
    }
343
344
    GIntBig GetNextReadFID()
345
0
    {
346
0
        return m_iNextReadFID;
347
0
    }
348
349
    void SetDataset(GDALDataset *poDS)
350
0
    {
351
0
        m_poDS = poDS;
352
0
    }
353
354
    GDALDataset *GetDataset() override
355
0
    {
356
0
        return m_poDS;
357
0
    }
358
};
359
360
#endif /* ndef MEMDATASET_H_INCLUDED */