Skip to content

Commit 03169e5

Browse files
authored
Merge pull request #13998 from rouault/deprecate_OGRFeatureDefn_Dereference
OGRFeatureDefn::Dereference(): deprecate its use within GDAL
2 parents 65c86c7 + 1237bf6 commit 03169e5

File tree

7 files changed

+49
-33
lines changed

7 files changed

+49
-33
lines changed

ogr/ogr_feature.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,9 @@ class CPL_DLL OGRFeatureDefn
819819
}
820820

821821
int Dereference()
822+
#if defined(GDAL_COMPILATION) && !defined(DOXYGEN_XML)
823+
CPL_WARN_DEPRECATED("Use Release() instead")
824+
#endif
822825
{
823826
return CPLAtomicDec(&nRefCount);
824827
}

ogr/ogrfeaturedefn.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,15 @@ void OGR_FD_Destroy(OGRFeatureDefnH hDefn)
122122
void OGRFeatureDefn::Release()
123123

124124
{
125+
#ifdef __GNUC__
126+
#pragma GCC diagnostic push
127+
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
128+
#endif
125129
if (Dereference() <= 0)
126130
delete this;
131+
#ifdef __GNUC__
132+
#pragma GCC diagnostic pop
133+
#endif
127134
}
128135

129136
/************************************************************************/
@@ -1179,6 +1186,9 @@ int OGR_FD_Reference(OGRFeatureDefnH hDefn)
11791186
*
11801187
* \brief Decrements the reference count by one.
11811188
*
1189+
* \warning This method does not destroy the object when the reference count
1190+
* is zero. You generally want to use Release() instead.
1191+
*
11821192
* This method is the same as the C function OGR_FD_Dereference().
11831193
*
11841194
* @return the updated reference count.
@@ -1191,6 +1201,9 @@ int OGR_FD_Reference(OGRFeatureDefnH hDefn)
11911201
/**
11921202
* \brief Decrements the reference count by one.
11931203
*
1204+
* \warning This method does not destroy the object when the reference count
1205+
* is zero. You generally want to use OGR_FD_Release() instead.
1206+
11941207
* This function is the same as the C++ method OGRFeatureDefn::Dereference().
11951208
*
11961209
* @param hDefn handle to the feature definition on witch OGRFeature are
@@ -1201,7 +1214,14 @@ int OGR_FD_Reference(OGRFeatureDefnH hDefn)
12011214
int OGR_FD_Dereference(OGRFeatureDefnH hDefn)
12021215

12031216
{
1217+
#ifdef __GNUC__
1218+
#pragma GCC diagnostic push
1219+
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
1220+
#endif
12041221
return OGRFeatureDefn::FromHandle(hDefn)->Dereference();
1222+
#ifdef __GNUC__
1223+
#pragma GCC diagnostic pop
1224+
#endif
12051225
}
12061226

12071227
/************************************************************************/

ogr/ogrsf_frmts/generic/ogrlayerarrow.cpp

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8263,29 +8263,23 @@ bool OGRLayer::WriteArrowBatch(const struct ArrowSchema *schema,
82638263
}
82648264
}
82658265

8266-
OGRFeatureDefn oLayerDefnTmp(poLayerDefn->GetName());
8267-
8268-
struct LayerDefnTmpRefReleaser
8266+
struct FeatureDefnReleaser
82698267
{
8270-
OGRFeatureDefn &m_oDefn;
8271-
8272-
explicit LayerDefnTmpRefReleaser(OGRFeatureDefn &oDefn) : m_oDefn(oDefn)
8273-
{
8274-
m_oDefn.Reference();
8275-
}
8276-
8277-
~LayerDefnTmpRefReleaser()
8268+
void operator()(OGRFeatureDefn *poFDefn)
82788269
{
8279-
m_oDefn.Dereference();
8270+
if (poFDefn)
8271+
poFDefn->Release();
82808272
}
82818273
};
82828274

8283-
LayerDefnTmpRefReleaser oLayerDefnTmpRefReleaser(oLayerDefnTmp);
8275+
std::unique_ptr<OGRFeatureDefn, FeatureDefnReleaser> poLayerDefnTmp(
8276+
std::make_unique<OGRFeatureDefn>(poLayerDefn->GetName()).release());
8277+
poLayerDefnTmp->Reference();
82848278

82858279
std::vector<int> anIdentityFieldMap;
82868280
if (bFallbackTypesUsed)
82878281
{
8288-
oLayerDefnTmp.SetGeomType(wkbNone);
8282+
poLayerDefnTmp->SetGeomType(wkbNone);
82898283
for (int i = 0; i < poLayerDefn->GetFieldCount(); ++i)
82908284
{
82918285
anIdentityFieldMap.push_back(i);
@@ -8299,11 +8293,11 @@ bool OGRLayer::WriteArrowBatch(const struct ArrowSchema *schema,
82998293
if (oIter != oMapOGRFieldIndexToFieldInfoIndex.end())
83008294
asFieldInfo[oIter->second].eSetFeatureFieldType =
83018295
asFieldInfo[oIter->second].eNominalFieldType;
8302-
oLayerDefnTmp.AddFieldDefn(&oFieldDefn);
8296+
poLayerDefnTmp->AddFieldDefn(&oFieldDefn);
83038297
}
83048298
for (int i = 0; i < poLayerDefn->GetGeomFieldCount(); ++i)
83058299
{
8306-
oLayerDefnTmp.AddGeomFieldDefn(poLayerDefn->GetGeomFieldDefn(i));
8300+
poLayerDefnTmp->AddGeomFieldDefn(poLayerDefn->GetGeomFieldDefn(i));
83078301
}
83088302
}
83098303
else
@@ -8342,7 +8336,8 @@ bool OGRLayer::WriteArrowBatch(const struct ArrowSchema *schema,
83428336
}
83438337
};
83448338

8345-
OGRFeature oFeature(bFallbackTypesUsed ? &oLayerDefnTmp : poLayerDefn);
8339+
OGRFeature oFeature(bFallbackTypesUsed ? poLayerDefnTmp.get()
8340+
: poLayerDefn);
83468341
FeatureCleaner oCleaner(oFeature, abUseStringOptim);
83478342
OGRFeature oFeatureTarget(poLayerDefn);
83488343
OGRFeature *const poFeatureTarget =
@@ -8409,7 +8404,7 @@ bool OGRLayer::WriteArrowBatch(const struct ArrowSchema *schema,
84098404
}
84108405
bool bLossyConversion = false;
84118406
const auto eSrcType =
8412-
oLayerDefnTmp.GetFieldDefnUnsafe(i)->GetType();
8407+
poLayerDefnTmp->GetFieldDefnUnsafe(i)->GetType();
84138408
const auto eDstType =
84148409
poLayerDefn->GetFieldDefnUnsafe(i)->GetType();
84158410

@@ -8460,7 +8455,7 @@ bool OGRLayer::WriteArrowBatch(const struct ArrowSchema *schema,
84608455
"For feature " CPL_FRMT_GIB
84618456
", value of field %s cannot not preserved",
84628457
oFeatureTarget.GetFID(),
8463-
oLayerDefnTmp.GetFieldDefn(i)->GetNameRef());
8458+
poLayerDefnTmp->GetFieldDefn(i)->GetNameRef());
84648459
if (bTransactionOK)
84658460
RollbackTransaction();
84668461
return false;

ogr/ogrsf_frmts/mitab/mitab_miffile.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,8 +1073,8 @@ int MIFFile::Close()
10731073
* Note: we have to check the reference count before deleting
10741074
* m_poSpatialRef and m_poDefn
10751075
*----------------------------------------------------------------*/
1076-
if (m_poDefn && m_poDefn->Dereference() == 0)
1077-
delete m_poDefn;
1076+
if (m_poDefn)
1077+
m_poDefn->Release();
10781078
m_poDefn = nullptr;
10791079

10801080
if (m_poSpatialRef && m_poSpatialRef->Dereference() == 0)
@@ -1534,8 +1534,8 @@ int MIFFile::SetFeatureDefn(
15341534
* Delete current feature defn if there is already one.
15351535
* AddFieldNative() will take care of creating a new one for us.
15361536
*----------------------------------------------------------------*/
1537-
if (m_poDefn && m_poDefn->Dereference() == 0)
1538-
delete m_poDefn;
1537+
if (m_poDefn)
1538+
m_poDefn->Release();
15391539
m_poDefn = nullptr;
15401540

15411541
/*-----------------------------------------------------------------

ogr/ogrsf_frmts/mitab/mitab_tabfile.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2017,9 +2017,8 @@ int TABFile::SetFeatureDefn(
20172017
* Keep a reference to the OGRFeatureDefn... we'll have to take the
20182018
* reference count into account when we are done with it.
20192019
*----------------------------------------------------------------*/
2020-
if (m_poDefn && m_poDefn->Dereference() == 0)
2021-
delete m_poDefn;
2022-
2020+
if (m_poDefn)
2021+
m_poDefn->Release();
20232022
m_poDefn = poFeatureDefn;
20242023
m_poDefn->Reference();
20252024

ogr/ogrsf_frmts/mitab/mitab_tabview.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,8 +1235,8 @@ void TABRelation::ResetAllMembers()
12351235
/*-----------------------------------------------------------------
12361236
* Note: we have to check the reference count before deleting m_poDefn
12371237
*----------------------------------------------------------------*/
1238-
if (m_poDefn && m_poDefn->Dereference() == 0)
1239-
delete m_poDefn;
1238+
if (m_poDefn)
1239+
m_poDefn->Release();
12401240
m_poDefn = nullptr;
12411241
}
12421242

@@ -1983,9 +1983,8 @@ int TABRelation::SetFeatureDefn(
19831983
* Keep a reference to the OGRFeatureDefn... we'll have to take the
19841984
* reference count into account when we are done with it.
19851985
*----------------------------------------------------------------*/
1986-
if (m_poDefn && m_poDefn->Dereference() == 0)
1987-
delete m_poDefn;
1988-
1986+
if (m_poDefn)
1987+
m_poDefn->Release();
19891988
m_poDefn = poFeatureDefn;
19901989
m_poDefn->Reference();
19911990

ogr/ogrsf_frmts/oci/ogrocistatement.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ void OGROCIStatement::Clean()
7474
CPLFree(panFieldMap);
7575
panFieldMap = nullptr;
7676

77-
if (poDefn != nullptr && poDefn->Dereference() <= 0)
77+
if (poDefn != nullptr)
7878
{
79-
delete poDefn;
79+
poDefn->Release();
8080
poDefn = nullptr;
8181
}
8282

0 commit comments

Comments
 (0)