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 :
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 >) const override;
98 : CPLErr SetGeoTransform(const GDALGeoTransform >) 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 38831 : int GetLayerCount() const override
139 : {
140 38831 : return static_cast<int>(m_apoLayers.size());
141 : }
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 477 : GByte *GetData() const
215 : {
216 477 : return (pabyData);
217 : }
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 1043977 : const OGRFeatureDefn *GetLayerDefn() const override
288 : {
289 1043977 : return m_poFeatureDefn;
290 : }
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 2778 : const char *GetFIDColumn() const override
310 : {
311 2778 : return m_osFIDColumn.c_str();
312 : }
313 :
314 1111 : bool IsUpdatable() const
315 : {
316 1111 : return m_bUpdatable;
317 : }
318 :
319 1748 : void SetUpdatable(bool bUpdatableIn)
320 : {
321 1748 : m_bUpdatable = bUpdatableIn;
322 1748 : }
323 :
324 1040 : void SetAdvertizeUTF8(bool bAdvertizeUTF8In)
325 : {
326 1040 : m_bAdvertizeUTF8 = bAdvertizeUTF8In;
327 1040 : }
328 :
329 1542 : void SetFIDColumn(const char *pszFIDColumn)
330 : {
331 1542 : m_osFIDColumn = pszFIDColumn;
332 1542 : }
333 :
334 511 : bool HasBeenUpdated() const
335 : {
336 511 : return m_bUpdated;
337 : }
338 :
339 437 : void SetUpdated(bool bUpdated)
340 : {
341 437 : m_bUpdated = bUpdated;
342 437 : }
343 :
344 25 : GIntBig GetNextReadFID()
345 : {
346 25 : return m_iNextReadFID;
347 : }
348 :
349 1542 : void SetDataset(GDALDataset *poDS)
350 : {
351 1542 : m_poDS = poDS;
352 1542 : }
353 :
354 468 : GDALDataset *GetDataset() override
355 : {
356 468 : return m_poDS;
357 : }
358 : };
359 :
360 : #endif /* ndef MEMDATASET_H_INCLUDED */
|