diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/datum.cpp | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp index 7c76061e..758eaec3 100644 --- a/src/iso19111/datum.cpp +++ b/src/iso19111/datum.cpp @@ -1414,7 +1414,8 @@ void GeodeticReferenceFrame::_exportToJSON( // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress -bool GeodeticReferenceFrame::_isEquivalentTo( + +bool GeodeticReferenceFrame::isEquivalentToNoExactTypeCheck( const util::IComparable *other, util::IComparable::Criterion criterion, const io::DatabaseContextPtr &dbContext) const { auto otherGRF = dynamic_cast<const GeodeticReferenceFrame *>(other); @@ -1427,6 +1428,19 @@ bool GeodeticReferenceFrame::_isEquivalentTo( ellipsoid()->_isEquivalentTo(otherGRF->ellipsoid().get(), criterion, dbContext); } + +// --------------------------------------------------------------------------- + +bool GeodeticReferenceFrame::_isEquivalentTo( + const util::IComparable *other, util::IComparable::Criterion criterion, + const io::DatabaseContextPtr &dbContext) const { + if (criterion == Criterion::STRICT && + !util::isOfExactType<GeodeticReferenceFrame>(*other)) { + return false; + } + return isEquivalentToNoExactTypeCheck(other, criterion, dbContext); +} + //! @endcond // --------------------------------------------------------------------------- @@ -1558,11 +1572,20 @@ DynamicGeodeticReferenceFrame::deformationModelName() const { bool DynamicGeodeticReferenceFrame::_isEquivalentTo( const util::IComparable *other, util::IComparable::Criterion criterion, const io::DatabaseContextPtr &dbContext) const { - auto otherDGRF = dynamic_cast<const DynamicGeodeticReferenceFrame *>(other); - if (otherDGRF == nullptr || - !GeodeticReferenceFrame::_isEquivalentTo(other, criterion, dbContext)) { + if (criterion == Criterion::STRICT && + !util::isOfExactType<DynamicGeodeticReferenceFrame>(*other)) { return false; } + if (!GeodeticReferenceFrame::isEquivalentToNoExactTypeCheck( + other, criterion, dbContext)) { + return false; + } + auto otherDGRF = dynamic_cast<const DynamicGeodeticReferenceFrame *>(other); + if (otherDGRF == nullptr) { + // we can go here only if criterion != Criterion::STRICT, and thus + // given the above check we can consider the objects equivalent. + return true; + } return frameReferenceEpoch()._isEquivalentTo( otherDGRF->frameReferenceEpoch(), criterion) && metadata::Identifier::isEquivalentName( @@ -2101,7 +2124,7 @@ void VerticalReferenceFrame::_exportToJSON( // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress -bool VerticalReferenceFrame::_isEquivalentTo( +bool VerticalReferenceFrame::isEquivalentToNoExactTypeCheck( const util::IComparable *other, util::IComparable::Criterion criterion, const io::DatabaseContextPtr &dbContext) const { auto otherVRF = dynamic_cast<const VerticalReferenceFrame *>(other); @@ -2121,6 +2144,19 @@ bool VerticalReferenceFrame::_isEquivalentTo( } return true; } + +// --------------------------------------------------------------------------- + +bool VerticalReferenceFrame::_isEquivalentTo( + const util::IComparable *other, util::IComparable::Criterion criterion, + const io::DatabaseContextPtr &dbContext) const { + if (criterion == Criterion::STRICT && + !util::isOfExactType<VerticalReferenceFrame>(*other)) { + return false; + } + return isEquivalentToNoExactTypeCheck(other, criterion, dbContext); +} + //! @endcond // --------------------------------------------------------------------------- @@ -2195,11 +2231,20 @@ DynamicVerticalReferenceFrame::deformationModelName() const { bool DynamicVerticalReferenceFrame::_isEquivalentTo( const util::IComparable *other, util::IComparable::Criterion criterion, const io::DatabaseContextPtr &dbContext) const { - auto otherDGRF = dynamic_cast<const DynamicVerticalReferenceFrame *>(other); - if (otherDGRF == nullptr || - !VerticalReferenceFrame::_isEquivalentTo(other, criterion, dbContext)) { + if (criterion == Criterion::STRICT && + !util::isOfExactType<DynamicVerticalReferenceFrame>(*other)) { return false; } + if (!VerticalReferenceFrame::isEquivalentToNoExactTypeCheck( + other, criterion, dbContext)) { + return false; + } + auto otherDGRF = dynamic_cast<const DynamicVerticalReferenceFrame *>(other); + if (otherDGRF == nullptr) { + // we can go here only if criterion != Criterion::STRICT, and thus + // given the above check we can consider the objects equivalent. + return true; + } return frameReferenceEpoch()._isEquivalentTo( otherDGRF->frameReferenceEpoch(), criterion) && metadata::Identifier::isEquivalentName( |
