Coverage Report

Created: 2025-06-13 06:18

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