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