LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts - ogrsf_frmts.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 32 33 97.0 %
Date: 2026-04-09 18:10:46 Functions: 41 46 89.1 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  OpenGIS Simple Features Reference Implementation
       4             :  * Purpose:  Classes related to format registration, and file opening.
       5             :  * Author:   Frank Warmerdam, warmerda@home.com
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 1999,  Les Technologies SoftMap Inc.
       9             :  * Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com>
      10             :  *
      11             :  * SPDX-License-Identifier: MIT
      12             :  ****************************************************************************/
      13             : 
      14             : #ifndef OGRSF_FRMTS_H_INCLUDED
      15             : #define OGRSF_FRMTS_H_INCLUDED
      16             : 
      17             : #include "cpl_progress.h"
      18             : #include "ogr_feature.h"
      19             : #include "ogr_featurestyle.h"
      20             : #include "gdal_priv.h"
      21             : 
      22             : #include <memory>
      23             : #include <deque>
      24             : 
      25             : /**
      26             :  * \file ogrsf_frmts.h
      27             :  *
      28             :  * Classes related to registration of format support, and opening datasets.
      29             :  */
      30             : 
      31             : //! @cond Doxygen_Suppress
      32             : #if !defined(GDAL_COMPILATION) && !defined(SUPPRESS_DEPRECATION_WARNINGS)
      33             : #define OGR_DEPRECATED(x) CPL_WARN_DEPRECATED(x)
      34             : #else
      35             : #define OGR_DEPRECATED(x)
      36             : #endif
      37             : 
      38             : #ifndef CPPCHECK_STATIC
      39             : #define CPPCHECK_STATIC
      40             : #endif
      41             : //! @endcond
      42             : 
      43             : class OGRLayerAttrIndex;
      44             : class OGRSFDriver;
      45             : 
      46             : struct ArrowArrayStream;
      47             : 
      48             : /************************************************************************/
      49             : /*                               OGRLayer                               */
      50             : /************************************************************************/
      51             : 
      52             : /**
      53             :  * This class represents a layer of simple features, with access methods.
      54             :  *
      55             :  */
      56             : 
      57             : /* Note: any virtual method added to this class must also be added in the */
      58             : /* OGRLayerDecorator and OGRMutexedLayer classes. */
      59             : 
      60             : class CPL_DLL OGRLayer : public GDALMajorObject
      61             : {
      62             :   private:
      63             :     struct Private;
      64             :     std::unique_ptr<Private> m_poPrivate;
      65             : 
      66             :     void ConvertGeomsIfNecessary(OGRFeature *poFeature);
      67             : 
      68             :     class CPL_DLL FeatureIterator
      69             :     {
      70             :         struct Private;
      71             :         std::unique_ptr<Private> m_poPrivate;
      72             : 
      73             :       public:
      74             :         FeatureIterator(OGRLayer *poLayer, bool bStart);
      75             :         FeatureIterator(
      76             :             FeatureIterator &&oOther) noexcept;  // declared but not defined.
      77             :                                                  // Needed for gcc 5.4 at least
      78             :         ~FeatureIterator();
      79             :         OGRFeatureUniquePtr &operator*();
      80             :         FeatureIterator &operator++();
      81             :         bool operator!=(const FeatureIterator &it) const;
      82             :     };
      83             : 
      84             :     friend inline FeatureIterator begin(OGRLayer *poLayer);
      85             :     friend inline FeatureIterator end(OGRLayer *poLayer);
      86             : 
      87             :     CPL_DISALLOW_COPY_ASSIGN(OGRLayer)
      88             : 
      89             :   protected:
      90             :     //! @cond Doxygen_Suppress
      91             :     int m_bFilterIsEnvelope;
      92             :     OGRGeometry *m_poFilterGeom;
      93             :     OGRPreparedGeometry *m_pPreparedFilterGeom; /* m_poFilterGeom compiled as a
      94             :                                                    prepared geometry */
      95             :     OGREnvelope m_sFilterEnvelope;
      96             :     int m_iGeomFieldFilter;  // specify the index on which the spatial
      97             :                              // filter is active.
      98             : 
      99             :     int FilterGeometry(const OGRGeometry *);
     100             :     // int          FilterGeometry( OGRGeometry *, OGREnvelope*
     101             :     // psGeometryEnvelope);
     102             :     int InstallFilter(const OGRGeometry *);
     103             :     bool
     104             :     ValidateGeometryFieldIndexForSetSpatialFilter(int iGeomField,
     105             :                                                   const OGRGeometry *poGeomIn,
     106             :                                                   bool bIsSelectLayer = false);
     107             :     //! @endcond
     108             : 
     109             :     virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent,
     110             :                               bool bForce) CPL_WARN_UNUSED_RESULT;
     111             : 
     112             :     virtual OGRErr IGetExtent3D(int iGeomField, OGREnvelope3D *psExtent3D,
     113             :                                 bool bForce) CPL_WARN_UNUSED_RESULT;
     114             : 
     115             :     virtual OGRErr ISetSpatialFilter(int iGeomField, const OGRGeometry *);
     116             : 
     117             :     virtual OGRErr ISetFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT;
     118             :     virtual OGRErr
     119             :         ISetFeatureUniqPtr(std::unique_ptr<OGRFeature>) CPL_WARN_UNUSED_RESULT;
     120             :     virtual OGRErr ICreateFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT;
     121             :     virtual OGRErr
     122             :     ICreateFeatureUniqPtr(std::unique_ptr<OGRFeature> poFeature,
     123             :                           GIntBig *pnFID = nullptr) CPL_WARN_UNUSED_RESULT;
     124             :     virtual OGRErr IUpsertFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT;
     125             :     virtual OGRErr
     126             :     IUpdateFeature(OGRFeature *poFeature, int nUpdatedFieldsCount,
     127             :                    const int *panUpdatedFieldsIdx, int nUpdatedGeomFieldsCount,
     128             :                    const int *panUpdatedGeomFieldsIdx,
     129             :                    bool bUpdateStyleString) CPL_WARN_UNUSED_RESULT;
     130             : 
     131             :     //! @cond Doxygen_Suppress
     132             :     CPLStringList m_aosArrowArrayStreamOptions{};
     133             : 
     134             :     friend struct OGRGenSQLResultsLayerArrowStreamPrivateData;
     135             : 
     136             :     struct ArrowArrayStreamPrivateData
     137             :     {
     138             :         bool m_bArrowArrayStreamInProgress = false;
     139             :         bool m_bEOF = false;
     140             :         OGRLayer *m_poLayer = nullptr;
     141             :         std::vector<GIntBig> m_anQueriedFIDs{};
     142             :         size_t m_iQueriedFIDS = 0;
     143             :         std::deque<std::unique_ptr<OGRFeature>> m_oFeatureQueue{};
     144             :     };
     145             : 
     146             :     std::shared_ptr<ArrowArrayStreamPrivateData>
     147             :         m_poSharedArrowArrayStreamPrivateData{};
     148             : 
     149             :     struct ArrowArrayStreamPrivateDataSharedDataWrapper
     150             :     {
     151             :         std::shared_ptr<ArrowArrayStreamPrivateData> poShared{};
     152             :     };
     153             :     //! @endcond
     154             : 
     155             :     friend class OGRArrowArrayHelper;
     156             :     friend class OGRGenSQLResultsLayer;
     157             :     static void ReleaseArray(struct ArrowArray *array);
     158             :     static void ReleaseSchema(struct ArrowSchema *schema);
     159             :     static void ReleaseStream(struct ArrowArrayStream *stream);
     160             :     virtual int GetArrowSchema(struct ArrowArrayStream *,
     161             :                                struct ArrowSchema *out_schema);
     162             :     virtual int GetNextArrowArray(struct ArrowArrayStream *,
     163             :                                   struct ArrowArray *out_array);
     164             :     static int StaticGetArrowSchema(struct ArrowArrayStream *,
     165             :                                     struct ArrowSchema *out_schema);
     166             :     static int StaticGetNextArrowArray(struct ArrowArrayStream *,
     167             :                                        struct ArrowArray *out_array);
     168             :     static const char *GetLastErrorArrowArrayStream(struct ArrowArrayStream *);
     169             : 
     170             :     static struct ArrowSchema *
     171             :     CreateSchemaForWKBGeometryColumn(const OGRGeomFieldDefn *poFieldDefn,
     172             :                                      const char *pszArrowFormat,
     173             :                                      const char *pszExtensionName);
     174             : 
     175             :     virtual bool
     176             :     CanPostFilterArrowArray(const struct ArrowSchema *schema) const;
     177             :     void PostFilterArrowArray(const struct ArrowSchema *schema,
     178             :                               struct ArrowArray *array,
     179             :                               CSLConstList papszOptions) const;
     180             : 
     181             :     //! @cond Doxygen_Suppress
     182             :     bool CreateFieldFromArrowSchemaInternal(const struct ArrowSchema *schema,
     183             :                                             const std::string &osFieldPrefix,
     184             :                                             CSLConstList papszOptions);
     185             :     //! @endcond
     186             : 
     187             :   public:
     188             :     OGRLayer();
     189             :     ~OGRLayer() override;
     190             : 
     191             :     /** Return begin of feature iterator.
     192             :      *
     193             :      * Using this iterator for standard range-based loops is safe, but
     194             :      * due to implementation limitations, you shouldn't try to access
     195             :      * (dereference) more than one iterator step at a time, since the
     196             :      * OGRFeatureUniquePtr reference is reused.
     197             :      *
     198             :      * Only one iterator per layer can be active at a time.
     199             :      */
     200             :     FeatureIterator begin();
     201             : 
     202             :     /** Return end of feature iterator. */
     203             :     FeatureIterator end();
     204             : 
     205             :     virtual OGRGeometry *GetSpatialFilter();
     206             : 
     207             :     OGRErr SetSpatialFilter(const OGRGeometry *);
     208             :     OGRErr SetSpatialFilterRect(double dfMinX, double dfMinY, double dfMaxX,
     209             :                                 double dfMaxY);
     210             : 
     211             :     OGRErr SetSpatialFilter(int iGeomField, const OGRGeometry *);
     212             :     OGRErr SetSpatialFilterRect(int iGeomField, double dfMinX, double dfMinY,
     213             :                                 double dfMaxX, double dfMaxY);
     214             : 
     215             :     virtual OGRErr SetAttributeFilter(const char *);
     216             : 
     217             :     virtual void ResetReading() = 0;
     218             :     virtual OGRFeature *GetNextFeature() CPL_WARN_UNUSED_RESULT = 0;
     219             :     virtual OGRErr SetNextByIndex(GIntBig nIndex);
     220             :     virtual OGRFeature *GetFeature(GIntBig nFID) CPL_WARN_UNUSED_RESULT;
     221             : 
     222             :     virtual GDALDataset *GetDataset();
     223             :     virtual bool GetArrowStream(struct ArrowArrayStream *out_stream,
     224             :                                 CSLConstList papszOptions = nullptr);
     225             :     virtual bool IsArrowSchemaSupported(const struct ArrowSchema *schema,
     226             :                                         CSLConstList papszOptions,
     227             :                                         std::string &osErrorMsg) const;
     228             :     virtual bool
     229             :     CreateFieldFromArrowSchema(const struct ArrowSchema *schema,
     230             :                                CSLConstList papszOptions = nullptr);
     231             :     virtual bool WriteArrowBatch(const struct ArrowSchema *schema,
     232             :                                  struct ArrowArray *array,
     233             :                                  CSLConstList papszOptions = nullptr);
     234             : 
     235             :     OGRErr SetFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT;
     236             :     OGRErr
     237             :     SetFeature(std::unique_ptr<OGRFeature> poFeature) CPL_WARN_UNUSED_RESULT;
     238             :     OGRErr CreateFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT;
     239             :     OGRErr CreateFeature(std::unique_ptr<OGRFeature> poFeature,
     240             :                          GIntBig *pnFID = nullptr) CPL_WARN_UNUSED_RESULT;
     241             :     OGRErr UpsertFeature(OGRFeature *poFeature) CPL_WARN_UNUSED_RESULT;
     242             :     OGRErr UpdateFeature(OGRFeature *poFeature, int nUpdatedFieldsCount,
     243             :                          const int *panUpdatedFieldsIdx,
     244             :                          int nUpdatedGeomFieldsCount,
     245             :                          const int *panUpdatedGeomFieldsIdx,
     246             :                          bool bUpdateStyleString) CPL_WARN_UNUSED_RESULT;
     247             : 
     248             :     virtual OGRErr DeleteFeature(GIntBig nFID) CPL_WARN_UNUSED_RESULT;
     249             : 
     250             :     virtual const char *GetName() const;
     251             :     virtual OGRwkbGeometryType GetGeomType() const;
     252             :     virtual const OGRFeatureDefn *GetLayerDefn() const = 0;
     253             : 
     254     1514002 :     OGRFeatureDefn *GetLayerDefn()
     255             :     {
     256             :         return const_cast<OGRFeatureDefn *>(
     257     1514002 :             const_cast<const OGRLayer *>(this)->GetLayerDefn());
     258             :     }
     259             : 
     260             :     virtual int FindFieldIndex(const char *pszFieldName, int bExactMatch);
     261             : 
     262             :     virtual const OGRSpatialReference *GetSpatialRef() const;
     263             : 
     264             :     /** Return type of OGRLayer::GetSupportedSRSList() */
     265             :     typedef std::vector<OGRSpatialReferenceRefCountedPtr>
     266             :         GetSupportedSRSListRetType;
     267             :     virtual const GetSupportedSRSListRetType &
     268             :     GetSupportedSRSList(int iGeomField);
     269             :     virtual OGRErr SetActiveSRS(int iGeomField,
     270             :                                 const OGRSpatialReference *poSRS);
     271             : 
     272             :     virtual GIntBig GetFeatureCount(int bForce = TRUE);
     273             : 
     274             :     OGRErr GetExtent(OGREnvelope *psExtent,
     275             :                      bool bForce = true) CPL_WARN_UNUSED_RESULT;
     276             :     OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
     277             :                      bool bForce = true) CPL_WARN_UNUSED_RESULT;
     278             : 
     279             :     OGRErr GetExtent3D(int iGeomField, OGREnvelope3D *psExtent,
     280             :                        bool bForce = true) CPL_WARN_UNUSED_RESULT;
     281             : 
     282             :     virtual int TestCapability(const char *) const = 0;
     283             : 
     284             :     virtual OGRErr Rename(const char *pszNewName) CPL_WARN_UNUSED_RESULT;
     285             : 
     286             :     virtual OGRErr CreateField(const OGRFieldDefn *poField,
     287             :                                int bApproxOK = TRUE) CPL_WARN_UNUSED_RESULT;
     288             :     virtual OGRErr DeleteField(int iField);
     289             :     virtual OGRErr ReorderFields(int *panMap);
     290             :     virtual OGRErr AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
     291             :                                   int nFlagsIn);
     292             :     virtual OGRErr
     293             :     AlterGeomFieldDefn(int iGeomField,
     294             :                        const OGRGeomFieldDefn *poNewGeomFieldDefn,
     295             :                        int nFlagsIn);
     296             : 
     297             :     virtual OGRErr CreateGeomField(const OGRGeomFieldDefn *poField,
     298             :                                    int bApproxOK = TRUE);
     299             : 
     300             :     virtual OGRErr SyncToDisk();
     301             : 
     302             :     virtual OGRStyleTable *GetStyleTable();
     303             :     virtual void SetStyleTableDirectly(OGRStyleTable *poStyleTable);
     304             : 
     305             :     virtual void SetStyleTable(OGRStyleTable *poStyleTable);
     306             : 
     307             :     virtual OGRErr StartTransaction() CPL_WARN_UNUSED_RESULT;
     308             :     virtual OGRErr CommitTransaction() CPL_WARN_UNUSED_RESULT;
     309             :     virtual OGRErr RollbackTransaction();
     310             : 
     311             :     //! @cond Doxygen_Suppress
     312             :     // Keep field definitions in sync with transactions
     313             :     virtual void PrepareStartTransaction();
     314             :     // Rollback TO SAVEPOINT if osSavepointName is not empty, otherwise ROLLBACK
     315             :     virtual void FinishRollbackTransaction(const std::string &osSavepointName);
     316             :     //! @endcond
     317             : 
     318             :     virtual const char *GetFIDColumn() const;
     319             :     virtual const char *GetGeometryColumn() const;
     320             : 
     321             :     virtual OGRErr SetIgnoredFields(CSLConstList papszFields);
     322             : 
     323             :     virtual OGRGeometryTypeCounter *
     324             :     GetGeometryTypes(int iGeomField, int nFlagsGGT, int &nEntryCountOut,
     325             :                      GDALProgressFunc pfnProgress, void *pProgressData);
     326             : 
     327             :     OGRErr Intersection(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     328             :                         CSLConstList papszOptions = nullptr,
     329             :                         GDALProgressFunc pfnProgress = nullptr,
     330             :                         void *pProgressArg = nullptr);
     331             :     OGRErr Union(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     332             :                  CSLConstList papszOptions = nullptr,
     333             :                  GDALProgressFunc pfnProgress = nullptr,
     334             :                  void *pProgressArg = nullptr);
     335             :     OGRErr SymDifference(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     336             :                          CSLConstList papszOptions,
     337             :                          GDALProgressFunc pfnProgress, void *pProgressArg);
     338             :     OGRErr Identity(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     339             :                     CSLConstList papszOptions = nullptr,
     340             :                     GDALProgressFunc pfnProgress = nullptr,
     341             :                     void *pProgressArg = nullptr);
     342             :     OGRErr Update(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     343             :                   CSLConstList papszOptions = nullptr,
     344             :                   GDALProgressFunc pfnProgress = nullptr,
     345             :                   void *pProgressArg = nullptr);
     346             :     OGRErr Clip(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     347             :                 CSLConstList papszOptions = nullptr,
     348             :                 GDALProgressFunc pfnProgress = nullptr,
     349             :                 void *pProgressArg = nullptr);
     350             :     OGRErr Erase(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     351             :                  CSLConstList papszOptions = nullptr,
     352             :                  GDALProgressFunc pfnProgress = nullptr,
     353             :                  void *pProgressArg = nullptr);
     354             : 
     355             :     int Reference();
     356             :     int Dereference();
     357             :     int GetRefCount() const;
     358             :     //! @cond Doxygen_Suppress
     359             :     GIntBig GetFeaturesRead();
     360             :     //! @endcond
     361             : 
     362             :     /* non virtual : convenience wrapper for ReorderFields() */
     363             :     OGRErr ReorderField(int iOldFieldPos, int iNewFieldPos);
     364             : 
     365             :     //! @cond Doxygen_Suppress
     366             :     int AttributeFilterEvaluationNeedsGeometry();
     367             : 
     368             :     /* consider these private */
     369             :     OGRErr InitializeIndexSupport(const char *);
     370             : 
     371        6029 :     OGRLayerAttrIndex *GetIndex()
     372             :     {
     373        6029 :         return m_poAttrIndex;
     374             :     }
     375             : 
     376          18 :     int GetGeomFieldFilter() const
     377             :     {
     378          18 :         return m_iGeomFieldFilter;
     379             :     }
     380             : 
     381          86 :     const char *GetAttrQueryString() const
     382             :     {
     383          86 :         return m_pszAttrQueryString;
     384             :     }
     385             : 
     386             :     //! @endcond
     387             : 
     388             :     /** Convert a OGRLayer* to a OGRLayerH.
     389             :      */
     390       31093 :     static inline OGRLayerH ToHandle(OGRLayer *poLayer)
     391             :     {
     392       31093 :         return reinterpret_cast<OGRLayerH>(poLayer);
     393             :     }
     394             : 
     395             :     /** Convert a OGRLayerH to a OGRLayer*.
     396             :      */
     397      734112 :     static inline OGRLayer *FromHandle(OGRLayerH hLayer)
     398             :     {
     399      734112 :         return reinterpret_cast<OGRLayer *>(hLayer);
     400             :     }
     401             : 
     402             :     //! @cond Doxygen_Suppress
     403             :     bool FilterWKBGeometry(const GByte *pabyWKB, size_t nWKBSize,
     404             :                            bool bEnvelopeAlreadySet,
     405             :                            OGREnvelope &sEnvelope) const;
     406             : 
     407             :     static bool FilterWKBGeometry(const GByte *pabyWKB, size_t nWKBSize,
     408             :                                   bool bEnvelopeAlreadySet,
     409             :                                   OGREnvelope &sEnvelope,
     410             :                                   const OGRGeometry *poFilterGeom,
     411             :                                   bool bFilterIsEnvelope,
     412             :                                   const OGREnvelope &sFilterEnvelope,
     413             :                                   OGRPreparedGeometry *&poPreparedFilterGeom);
     414             :     //! @endcond
     415             : 
     416             :     /** Field name used by GetArrowSchema() for a FID column when
     417             :      * GetFIDColumn() is not set.
     418             :      */
     419             :     static constexpr const char *DEFAULT_ARROW_FID_NAME = "OGC_FID";
     420             : 
     421             :     /** Field name used by GetArrowSchema() for the name of the (single)
     422             :      * geometry column (returned by GetGeometryColumn()) is not set.
     423             :      */
     424             :     static constexpr const char *DEFAULT_ARROW_GEOMETRY_NAME = "wkb_geometry";
     425             : 
     426             :   protected:
     427             :     //! @cond Doxygen_Suppress
     428             : 
     429             :     enum class FieldChangeType : char
     430             :     {
     431             :         ADD_FIELD,
     432             :         ALTER_FIELD,
     433             :         DELETE_FIELD
     434             :     };
     435             : 
     436             :     // Store changes to the fields that happened inside a transaction
     437             :     template <typename T> struct FieldDefnChange
     438             :     {
     439             : 
     440        1368 :         FieldDefnChange(std::unique_ptr<T> &&poFieldDefnIn, int iFieldIn,
     441             :                         FieldChangeType eChangeTypeIn,
     442             :                         const std::string &osSavepointNameIn = "")
     443        1368 :             : poFieldDefn(std::move(poFieldDefnIn)), iField(iFieldIn),
     444        1368 :               eChangeType(eChangeTypeIn), osSavepointName(osSavepointNameIn)
     445             :         {
     446        1368 :         }
     447             : 
     448             :         std::unique_ptr<T> poFieldDefn;
     449             :         int iField;
     450             :         FieldChangeType eChangeType;
     451             :         std::string osSavepointName;
     452             :     };
     453             : 
     454             :     std::vector<FieldDefnChange<OGRFieldDefn>> m_apoFieldDefnChanges{};
     455             :     std::vector<FieldDefnChange<OGRGeomFieldDefn>> m_apoGeomFieldDefnChanges{};
     456             : 
     457             :     OGRStyleTable *m_poStyleTable;
     458             :     OGRFeatureQuery *m_poAttrQuery;
     459             :     char *m_pszAttrQueryString;
     460             :     OGRLayerAttrIndex *m_poAttrIndex;
     461             : 
     462             :     int m_nRefCount;
     463             : 
     464             :     GIntBig m_nFeaturesRead;
     465             :     //! @endcond
     466             : };
     467             : 
     468             : /** Return begin of feature iterator.
     469             :  *
     470             :  * Using this iterator for standard range-based loops is safe, but
     471             :  * due to implementation limitations, you shouldn't try to access
     472             :  * (dereference) more than one iterator step at a time, since the
     473             :  * std::unique_ptr&lt;OGRFeature&gt; reference is reused.
     474             :  *
     475             :  * Only one iterator per layer can be active at a time.
     476             :  * @see OGRLayer::begin()
     477             :  */
     478        2897 : inline OGRLayer::FeatureIterator begin(OGRLayer *poLayer)
     479             : {
     480        2897 :     return poLayer->begin();
     481             : }
     482             : 
     483             : /** Return end of feature iterator.
     484             :  * @see OGRLayer::end()
     485             :  */
     486        2897 : inline OGRLayer::FeatureIterator end(OGRLayer *poLayer)
     487             : {
     488        2897 :     return poLayer->end();
     489             : }
     490             : 
     491             : /** Unique pointer type for OGRLayer.
     492             :  * @since GDAL 3.2
     493             :  */
     494             : using OGRLayerUniquePtr = std::unique_ptr<OGRLayer>;
     495             : 
     496             : /************************************************************************/
     497             : /*                     OGRGetNextFeatureThroughRaw                      */
     498             : /************************************************************************/
     499             : 
     500             : /** Template class offering a GetNextFeature() implementation relying on
     501             :  * GetNextRawFeature().
     502             :  * OGRGetNextFeatureThroughRaw::GetNextFeature() calls GetNextRawFeature()
     503             :  * and takes care of applying the spatial and attribute filters, making
     504             :  * their taking into account in GetNextRawFeature() unnecessary.
     505             :  *
     506             :  * @since GDAL 3.2
     507             :  */
     508             : template <class BaseLayer> class OGRGetNextFeatureThroughRaw
     509             : {
     510             :   protected:
     511             :     ~OGRGetNextFeatureThroughRaw() = default;
     512             : 
     513             :   public:
     514             :     /** Implement OGRLayer::GetNextFeature(), relying on
     515             :      * BaseLayer::GetNextRawFeature() */
     516       65515 :     OGRFeature *GetNextFeature()
     517             :     {
     518       65515 :         const auto poThis = static_cast<BaseLayer *>(this);
     519       16379 :         while (true)
     520             :         {
     521       81894 :             OGRFeature *poFeature = poThis->GetNextRawFeature();
     522       81894 :             if (poFeature == nullptr)
     523        5234 :                 return nullptr;
     524             : 
     525       14482 :             if ((poThis->m_poFilterGeom == nullptr ||
     526      153320 :                  poThis->FilterGeometry(poFeature->GetGeometryRef())) &&
     527       82650 :                 (poThis->m_poAttrQuery == nullptr ||
     528       15305 :                  poThis->m_poAttrQuery->Evaluate(poFeature)))
     529             :             {
     530       60281 :                 return poFeature;
     531             :             }
     532             :             else
     533       16379 :                 delete poFeature;
     534             :         }
     535             :     }
     536             : };
     537             : 
     538             : /** Utility macro to define GetNextFeature() through GetNextRawFeature() */
     539             : #define DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(BaseLayer)                         \
     540             :   private:                                                                     \
     541             :     friend class OGRGetNextFeatureThroughRaw<BaseLayer>;                       \
     542             :                                                                                \
     543             :   public:                                                                      \
     544             :     OGRFeature *GetNextFeature() override                                      \
     545             :     {                                                                          \
     546             :         return OGRGetNextFeatureThroughRaw<BaseLayer>::GetNextFeature();       \
     547             :     }
     548             : 
     549             : /************************************************************************/
     550             : /*                            OGRDataSource                             */
     551             : /************************************************************************/
     552             : 
     553             : /**
     554             :  * LEGACY class. Use GDALDataset in your new code ! This class may be
     555             :  * removed in a later release.
     556             :  *
     557             :  * This class represents a data source.  A data source potentially
     558             :  * consists of many layers (OGRLayer).  A data source normally consists
     559             :  * of one, or a related set of files, though the name doesn't have to be
     560             :  * a real item in the file system.
     561             :  *
     562             :  * When an OGRDataSource is destroyed, all its associated OGRLayers objects
     563             :  * are also destroyed.
     564             :  *
     565             :  * NOTE: It is *NOT* safe to cast the handle of
     566             :  * a C function that returns a OGRDataSourceH to a OGRDataSource*. If a C++
     567             :  * object is needed, the handle should be cast to GDALDataset*.
     568             :  *
     569             :  * @deprecated
     570             :  */
     571             : 
     572           0 : class CPL_DLL OGRDataSource : public GDALDataset
     573             : {
     574             :   public:
     575             :     OGRDataSource();
     576             :     ~OGRDataSource() override;
     577             : 
     578             :     //! @cond Doxygen_Suppress
     579             :     virtual const char *GetName()
     580             :         OGR_DEPRECATED("Use GDALDataset class instead") = 0;
     581             : 
     582             :     static void DestroyDataSource(OGRDataSource *)
     583             :         OGR_DEPRECATED("Use GDALDataset class instead");
     584             :     //! @endcond
     585             : };
     586             : 
     587             : /************************************************************************/
     588             : /*                             OGRSFDriver                              */
     589             : /************************************************************************/
     590             : 
     591             : /**
     592             :  * LEGACY class. Use GDALDriver in your new code ! This class may be
     593             :  * removed in a later release.
     594             :  *
     595             :  * Represents an operational format driver.
     596             :  *
     597             :  * One OGRSFDriver derived class will normally exist for each file format
     598             :  * registered for use, regardless of whether a file has or will be opened.
     599             :  * The list of available drivers is normally managed by the
     600             :  * OGRSFDriverRegistrar.
     601             :  *
     602             :  * NOTE: It is *NOT* safe to cast the handle of
     603             :  * a C function that returns a OGRSFDriverH to a OGRSFDriver*. If a C++ object
     604             :  * is needed, the handle should be cast to GDALDriver*.
     605             :  *
     606             :  * @deprecated
     607             :  */
     608             : 
     609             : class CPL_DLL OGRSFDriver : public GDALDriver
     610             : {
     611             :   public:
     612             :     //! @cond Doxygen_Suppress
     613             :     ~OGRSFDriver() override;
     614             : 
     615             :     virtual const char *GetName()
     616             :         OGR_DEPRECATED("Use GDALDriver class instead") = 0;
     617             : 
     618             :     virtual OGRDataSource *Open(const char *pszName, int bUpdate = FALSE)
     619             :         OGR_DEPRECATED("Use GDALDriver class instead") = 0;
     620             : 
     621             :     virtual int TestCapability(const char *pszCap)
     622             :         OGR_DEPRECATED("Use GDALDriver class instead") = 0;
     623             : 
     624             :     virtual OGRDataSource *CreateDataSource(const char *pszName,
     625             :                                             char ** = nullptr)
     626             :         OGR_DEPRECATED("Use GDALDriver class instead");
     627             :     virtual OGRErr DeleteDataSource(const char *pszName)
     628             :         OGR_DEPRECATED("Use GDALDriver class instead");
     629             :     //! @endcond
     630             : };
     631             : 
     632             : /************************************************************************/
     633             : /*                         OGRSFDriverRegistrar                         */
     634             : /************************************************************************/
     635             : 
     636             : /**
     637             :  * LEGACY class. Use GDALDriverManager in your new code ! This class may be
     638             :  * removed in a later release.
     639             :  *
     640             :  * Singleton manager for OGRSFDriver instances that will be used to try
     641             :  * and open datasources.  Normally the registrar is populated with
     642             :  * standard drivers using the OGRRegisterAll() function and does not need
     643             :  * to be directly accessed.  The driver registrar and all registered drivers
     644             :  * may be cleaned up on shutdown using OGRCleanupAll().
     645             :  *
     646             :  * @deprecated
     647             :  */
     648             : 
     649             : class CPL_DLL OGRSFDriverRegistrar
     650             : {
     651             : 
     652             :     OGRSFDriverRegistrar();
     653             :     ~OGRSFDriverRegistrar();
     654             : 
     655             :     static GDALDataset *OpenWithDriverArg(GDALDriver *poDriver,
     656             :                                           GDALOpenInfo *poOpenInfo);
     657             :     static GDALDataset *CreateVectorOnly(GDALDriver *poDriver,
     658             :                                          const char *pszName,
     659             :                                          CSLConstList papszOptions);
     660             :     static CPLErr DeleteDataSource(GDALDriver *poDriver, const char *pszName);
     661             : 
     662             :   public:
     663             :     //! @cond Doxygen_Suppress
     664             :     static OGRSFDriverRegistrar *GetRegistrar()
     665             :         OGR_DEPRECATED("Use GDALDriverManager class instead");
     666             : 
     667             :     CPPCHECK_STATIC void RegisterDriver(OGRSFDriver *poDriver)
     668             :         OGR_DEPRECATED("Use GDALDriverManager class instead");
     669             : 
     670             :     CPPCHECK_STATIC int GetDriverCount(void)
     671             :         OGR_DEPRECATED("Use GDALDriverManager class instead");
     672             : 
     673             :     CPPCHECK_STATIC GDALDriver *GetDriver(int iDriver)
     674             :         OGR_DEPRECATED("Use GDALDriverManager class instead");
     675             : 
     676             :     CPPCHECK_STATIC GDALDriver *GetDriverByName(const char *)
     677             :         OGR_DEPRECATED("Use GDALDriverManager class instead");
     678             : 
     679             :     CPPCHECK_STATIC int GetOpenDSCount()
     680             :         OGR_DEPRECATED("Use GDALDriverManager class instead");
     681             : 
     682             :     CPPCHECK_STATIC OGRDataSource *GetOpenDS(int)
     683             :         OGR_DEPRECATED("Use GDALDriverManager class instead");
     684             :     //! @endcond
     685             : };
     686             : 
     687             : /* -------------------------------------------------------------------- */
     688             : /*      Various available registration methods.                         */
     689             : /* -------------------------------------------------------------------- */
     690             : CPL_C_START
     691             : 
     692             : //! @cond Doxygen_Suppress
     693             : void OGRRegisterAllInternal();
     694             : 
     695             : void CPL_DLL RegisterOGRFileGDB();
     696             : void DeclareDeferredOGRFileGDBPlugin();
     697             : void CPL_DLL RegisterOGRShape();
     698             : void CPL_DLL RegisterOGRNTF();
     699             : void CPL_DLL RegisterOGRTiger();
     700             : void CPL_DLL RegisterOGRS57();
     701             : void CPL_DLL RegisterOGRTAB();
     702             : void CPL_DLL RegisterOGRMIF();
     703             : void CPL_DLL RegisterOGRODBC();
     704             : void DeclareDeferredOGRODBCPlugin();
     705             : void CPL_DLL RegisterOGRWAsP();
     706             : void CPL_DLL RegisterOGRPG();
     707             : void DeclareDeferredOGRPGPlugin();
     708             : void CPL_DLL RegisterOGRMSSQLSpatial();
     709             : void DeclareDeferredOGRMSSQLSpatialPlugin();
     710             : void CPL_DLL RegisterOGRMySQL();
     711             : void DeclareDeferredOGRMySQLPlugin();
     712             : void CPL_DLL RegisterOGROCI();
     713             : void DeclareDeferredOGROCIPlugin();
     714             : void CPL_DLL RegisterOGRDGN();
     715             : void CPL_DLL RegisterOGRGML();
     716             : void CPL_DLL RegisterOGRLIBKML();
     717             : void DeclareDeferredOGRLIBKMLPlugin();
     718             : void CPL_DLL RegisterOGRKML();
     719             : void CPL_DLL RegisterOGRFlatGeobuf();
     720             : void CPL_DLL RegisterOGRGeoJSON();
     721             : void CPL_DLL RegisterOGRGeoJSONSeq();
     722             : void CPL_DLL RegisterOGRESRIJSON();
     723             : void CPL_DLL RegisterOGRTopoJSON();
     724             : void CPL_DLL RegisterOGRAVCBin();
     725             : void CPL_DLL RegisterOGRAVCE00();
     726             : void CPL_DLL RegisterOGRVRT();
     727             : void CPL_DLL RegisterOGRSQLite();
     728             : void CPL_DLL RegisterOGRCSV();
     729             : void CPL_DLL RegisterOGRILI1();
     730             : void CPL_DLL RegisterOGRILI2();
     731             : void CPL_DLL RegisterOGRPGeo();
     732             : void CPL_DLL RegisterOGRDXF();
     733             : void CPL_DLL RegisterOGRCAD();
     734             : void DeclareDeferredOGRCADPlugin();
     735             : void CPL_DLL RegisterOGRDWG();
     736             : void CPL_DLL RegisterOGRDGNV8();
     737             : void DeclareDeferredOGRDWGPlugin();
     738             : void DeclareDeferredOGRDGNV8Plugin();
     739             : void CPL_DLL RegisterOGRIDB();
     740             : void DeclareDeferredOGRIDBPlugin();
     741             : void CPL_DLL RegisterOGRGMT();
     742             : void CPL_DLL RegisterOGRGPX();
     743             : void CPL_DLL RegisterOGRNAS();
     744             : void CPL_DLL RegisterOGRGeoRSS();
     745             : void CPL_DLL RegisterOGRVFK();
     746             : void DeclareDeferredOGRVFKPlugin();
     747             : void CPL_DLL RegisterOGRPGDump();
     748             : void CPL_DLL RegisterOGROSM();
     749             : void CPL_DLL RegisterOGRGPSBabel();
     750             : void CPL_DLL RegisterOGRPDS();
     751             : void CPL_DLL RegisterOGRWFS();
     752             : void CPL_DLL RegisterOGROAPIF();
     753             : void CPL_DLL RegisterOGRSOSI();
     754             : void DeclareDeferredOGRSOSIPlugin();
     755             : void CPL_DLL RegisterOGREDIGEO();
     756             : void CPL_DLL RegisterOGRIdrisi();
     757             : void CPL_DLL RegisterOGRXLS();
     758             : void DeclareDeferredOGRXLSPlugin();
     759             : void CPL_DLL RegisterOGRODS();
     760             : void CPL_DLL RegisterOGRXLSX();
     761             : void CPL_DLL RegisterOGRElastic();
     762             : void DeclareDeferredOGRElasticPlugin();
     763             : void CPL_DLL RegisterOGRGeoPackage();
     764             : void CPL_DLL RegisterOGRCarto();
     765             : void DeclareDeferredOGRCartoPlugin();
     766             : void CPL_DLL RegisterOGRAmigoCloud();
     767             : void CPL_DLL RegisterOGRSXF();
     768             : void CPL_DLL RegisterOGROpenFileGDB();
     769             : void DeclareDeferredOGROpenFileGDBPlugin();
     770             : void CPL_DLL RegisterOGRSelafin();
     771             : void CPL_DLL RegisterOGRJML();
     772             : void CPL_DLL RegisterOGRPLSCENES();
     773             : void DeclareDeferredOGRPLSCENESPlugin();
     774             : void CPL_DLL RegisterOGRCSW();
     775             : void CPL_DLL RegisterOGRMongoDBv3();
     776             : void DeclareDeferredOGRMongoDBv3Plugin();
     777             : void CPL_DLL RegisterOGRVDV();
     778             : void CPL_DLL RegisterOGRGMLAS();
     779             : void DeclareDeferredOGRGMLASPlugin();
     780             : void CPL_DLL RegisterOGRMVT();
     781             : void CPL_DLL RegisterOGRNGW();
     782             : void CPL_DLL RegisterOGRMapML();
     783             : void CPL_DLL RegisterOGRLVBAG();
     784             : void CPL_DLL RegisterOGRHANA();
     785             : void DeclareDeferredOGRHANAPlugin();
     786             : void CPL_DLL RegisterOGRParquet();
     787             : void DeclareDeferredOGRParquetPlugin();
     788             : void CPL_DLL RegisterOGRArrow();
     789             : void DeclareDeferredOGRArrowPlugin();
     790             : void CPL_DLL RegisterOGRGTFS();
     791             : void CPL_DLL RegisterOGRPMTiles();
     792             : void CPL_DLL RegisterOGRJSONFG();
     793             : void CPL_DLL RegisterOGRMiraMon();
     794             : void CPL_DLL RegisterOGRXODR();
     795             : void DeclareDeferredOGRXODRPlugin();
     796             : void CPL_DLL RegisterOGRADBC();
     797             : void DeclareDeferredOGRADBCPlugin();
     798             : void CPL_DLL RegisterOGRAIVector();
     799             : // @endcond
     800             : 
     801             : CPL_C_END
     802             : 
     803             : #endif /* ndef OGRSF_FRMTS_H_INCLUDED */

Generated by: LCOV version 1.14