Coverage Report

Created: 2025-12-31 06:48

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(GDALProgressFunc = nullptr, void * = nullptr) 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
    void PrepareCreateFeature(OGRFeature *poFeature);
260
    OGRErr SetFeatureInternal(std::unique_ptr<OGRFeature> poFeature,
261
                              GIntBig *pnFID = nullptr);
262
263
  protected:
264
    OGRFeature *GetFeatureRef(GIntBig nFeatureId);
265
266
  public:
267
    // Clone poSRS if not nullptr
268
    OGRMemLayer(const char *pszName, const OGRSpatialReference *poSRS,
269
                OGRwkbGeometryType eGeomType);
270
    explicit OGRMemLayer(const OGRFeatureDefn &oFeatureDefn);
271
    ~OGRMemLayer() override;
272
273
    void ResetReading() override;
274
    OGRFeature *GetNextFeature() override;
275
    OGRErr SetNextByIndex(GIntBig nIndex) override;
276
277
    OGRFeature *GetFeature(GIntBig nFeatureId) override;
278
279
    OGRErr ISetFeatureUniqPtr(std::unique_ptr<OGRFeature> poFeature) override;
280
    OGRErr ISetFeature(OGRFeature *poFeature) override;
281
282
    OGRErr ICreateFeatureUniqPtr(std::unique_ptr<OGRFeature> poFeature,
283
                                 GIntBig *pnFID = nullptr) override;
284
    OGRErr ICreateFeature(OGRFeature *poFeature) override;
285
286
    OGRErr IUpsertFeature(OGRFeature *poFeature) override;
287
    OGRErr IUpdateFeature(OGRFeature *poFeature, int nUpdatedFieldsCount,
288
                          const int *panUpdatedFieldsIdx,
289
                          int nUpdatedGeomFieldsCount,
290
                          const int *panUpdatedGeomFieldsIdx,
291
                          bool bUpdateStyleString) override;
292
    OGRErr DeleteFeature(GIntBig nFID) override;
293
294
    using OGRLayer::GetLayerDefn;
295
296
    const OGRFeatureDefn *GetLayerDefn() const override
297
0
    {
298
0
        return m_poFeatureDefn;
299
0
    }
300
301
    GIntBig GetFeatureCount(int = true) override;
302
303
    virtual OGRErr CreateField(const OGRFieldDefn *poField,
304
                               int bApproxOK = TRUE) override;
305
    OGRErr DeleteField(int iField) override;
306
    OGRErr ReorderFields(int *panMap) override;
307
    virtual OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
308
                                  int nFlags) override;
309
    virtual OGRErr
310
    AlterGeomFieldDefn(int iGeomField,
311
                       const OGRGeomFieldDefn *poNewGeomFieldDefn,
312
                       int nFlagsIn) override;
313
    virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poGeomField,
314
                                   int bApproxOK = TRUE) override;
315
316
    int TestCapability(const char *) const override;
317
318
    const char *GetFIDColumn() const override
319
0
    {
320
0
        return m_osFIDColumn.c_str();
321
0
    }
322
323
    bool IsUpdatable() const
324
0
    {
325
0
        return m_bUpdatable;
326
0
    }
327
328
    void SetUpdatable(bool bUpdatableIn)
329
0
    {
330
0
        m_bUpdatable = bUpdatableIn;
331
0
    }
332
333
    void SetAdvertizeUTF8(bool bAdvertizeUTF8In)
334
0
    {
335
0
        m_bAdvertizeUTF8 = bAdvertizeUTF8In;
336
0
    }
337
338
    void SetFIDColumn(const char *pszFIDColumn)
339
0
    {
340
0
        m_osFIDColumn = pszFIDColumn;
341
0
    }
342
343
    bool HasBeenUpdated() const
344
0
    {
345
0
        return m_bUpdated;
346
0
    }
347
348
    void SetUpdated(bool bUpdated)
349
0
    {
350
0
        m_bUpdated = bUpdated;
351
0
    }
352
353
    GIntBig GetNextReadFID()
354
0
    {
355
0
        return m_iNextReadFID;
356
0
    }
357
358
    void SetDataset(GDALDataset *poDS)
359
0
    {
360
0
        m_poDS = poDS;
361
0
    }
362
363
    GDALDataset *GetDataset() override
364
0
    {
365
0
        return m_poDS;
366
0
    }
367
};
368
369
#endif /* ndef MEMDATASET_H_INCLUDED */