Line data Source code
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 25245 : int GetLayerCount() override
135 : {
136 25245 : return static_cast<int>(m_apoLayers.size());
137 : }
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 477 : GByte *GetData() const
211 : {
212 477 : return (pabyData);
213 : }
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 1333455 : OGRFeatureDefn *GetLayerDefn() override
282 : {
283 1333455 : return m_poFeatureDefn;
284 : }
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 2583 : const char *GetFIDColumn() override
304 : {
305 2583 : return m_osFIDColumn.c_str();
306 : }
307 :
308 1083 : bool IsUpdatable() const
309 : {
310 1083 : return m_bUpdatable;
311 : }
312 :
313 1645 : void SetUpdatable(bool bUpdatableIn)
314 : {
315 1645 : m_bUpdatable = bUpdatableIn;
316 1645 : }
317 :
318 1010 : void SetAdvertizeUTF8(bool bAdvertizeUTF8In)
319 : {
320 1010 : m_bAdvertizeUTF8 = bAdvertizeUTF8In;
321 1010 : }
322 :
323 1294 : void SetFIDColumn(const char *pszFIDColumn)
324 : {
325 1294 : m_osFIDColumn = pszFIDColumn;
326 1294 : }
327 :
328 507 : bool HasBeenUpdated() const
329 : {
330 507 : return m_bUpdated;
331 : }
332 :
333 410 : void SetUpdated(bool bUpdated)
334 : {
335 410 : m_bUpdated = bUpdated;
336 410 : }
337 :
338 25 : GIntBig GetNextReadFID()
339 : {
340 25 : return m_iNextReadFID;
341 : }
342 :
343 1294 : void SetDataset(GDALDataset *poDS)
344 : {
345 1294 : m_poDS = poDS;
346 1294 : }
347 :
348 459 : GDALDataset *GetDataset() override
349 : {
350 459 : return m_poDS;
351 : }
352 : };
353 :
354 : #endif /* ndef MEMDATASET_H_INCLUDED */
|