aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-12-01 21:50:51 +0100
committerEven Rouault <even.rouault@spatialys.com>2021-12-01 21:50:51 +0100
commit6a43bee93b4bfff07777c727b8fd46d3e6403094 (patch)
tree43059ed1cf1153e80a1d1ea7a0cfff879f9617b4 /src/iso19111
parent7dc8a59217c41c8cfefe7f9d97cb7dae4a8b8fbd (diff)
downloadPROJ-6a43bee93b4bfff07777c727b8fd46d3e6403094.tar.gz
PROJ-6a43bee93b4bfff07777c727b8fd46d3e6403094.zip
Cache result of proj_get_type() to help for performance of proj_factors() (fixes #2965)
Diffstat (limited to 'src/iso19111')
-rw-r--r--src/iso19111/c_api.cpp170
1 files changed, 89 insertions, 81 deletions
diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp
index 666e675d..e9d8edc2 100644
--- a/src/iso19111/c_api.cpp
+++ b/src/iso19111/c_api.cpp
@@ -1150,98 +1150,106 @@ PJ_TYPE proj_get_type(const PJ *obj) {
if (!obj || !obj->iso_obj) {
return PJ_TYPE_UNKNOWN;
}
- auto ptr = obj->iso_obj.get();
- if (dynamic_cast<Ellipsoid *>(ptr)) {
- return PJ_TYPE_ELLIPSOID;
- }
+ if (obj->type != PJ_TYPE_UNKNOWN)
+ return obj->type;
- if (dynamic_cast<PrimeMeridian *>(ptr)) {
- return PJ_TYPE_PRIME_MERIDIAN;
- }
+ const auto getType = [&obj]() {
+ auto ptr = obj->iso_obj.get();
+ if (dynamic_cast<Ellipsoid *>(ptr)) {
+ return PJ_TYPE_ELLIPSOID;
+ }
- if (dynamic_cast<DynamicGeodeticReferenceFrame *>(ptr)) {
- return PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME;
- }
- if (dynamic_cast<GeodeticReferenceFrame *>(ptr)) {
- return PJ_TYPE_GEODETIC_REFERENCE_FRAME;
- }
- if (dynamic_cast<DynamicVerticalReferenceFrame *>(ptr)) {
- return PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME;
- }
- if (dynamic_cast<VerticalReferenceFrame *>(ptr)) {
- return PJ_TYPE_VERTICAL_REFERENCE_FRAME;
- }
- if (dynamic_cast<DatumEnsemble *>(ptr)) {
- return PJ_TYPE_DATUM_ENSEMBLE;
- }
- if (dynamic_cast<TemporalDatum *>(ptr)) {
- return PJ_TYPE_TEMPORAL_DATUM;
- }
- if (dynamic_cast<EngineeringDatum *>(ptr)) {
- return PJ_TYPE_ENGINEERING_DATUM;
- }
- if (dynamic_cast<ParametricDatum *>(ptr)) {
- return PJ_TYPE_PARAMETRIC_DATUM;
- }
+ if (dynamic_cast<PrimeMeridian *>(ptr)) {
+ return PJ_TYPE_PRIME_MERIDIAN;
+ }
- {
- auto crs = dynamic_cast<GeographicCRS *>(ptr);
- if (crs) {
- if (crs->coordinateSystem()->axisList().size() == 2) {
- return PJ_TYPE_GEOGRAPHIC_2D_CRS;
- } else {
- return PJ_TYPE_GEOGRAPHIC_3D_CRS;
+ if (dynamic_cast<DynamicGeodeticReferenceFrame *>(ptr)) {
+ return PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME;
+ }
+ if (dynamic_cast<GeodeticReferenceFrame *>(ptr)) {
+ return PJ_TYPE_GEODETIC_REFERENCE_FRAME;
+ }
+ if (dynamic_cast<DynamicVerticalReferenceFrame *>(ptr)) {
+ return PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME;
+ }
+ if (dynamic_cast<VerticalReferenceFrame *>(ptr)) {
+ return PJ_TYPE_VERTICAL_REFERENCE_FRAME;
+ }
+ if (dynamic_cast<DatumEnsemble *>(ptr)) {
+ return PJ_TYPE_DATUM_ENSEMBLE;
+ }
+ if (dynamic_cast<TemporalDatum *>(ptr)) {
+ return PJ_TYPE_TEMPORAL_DATUM;
+ }
+ if (dynamic_cast<EngineeringDatum *>(ptr)) {
+ return PJ_TYPE_ENGINEERING_DATUM;
+ }
+ if (dynamic_cast<ParametricDatum *>(ptr)) {
+ return PJ_TYPE_PARAMETRIC_DATUM;
+ }
+
+ {
+ auto crs = dynamic_cast<GeographicCRS *>(ptr);
+ if (crs) {
+ if (crs->coordinateSystem()->axisList().size() == 2) {
+ return PJ_TYPE_GEOGRAPHIC_2D_CRS;
+ } else {
+ return PJ_TYPE_GEOGRAPHIC_3D_CRS;
+ }
}
}
- }
- {
- auto crs = dynamic_cast<GeodeticCRS *>(ptr);
- if (crs) {
- if (crs->isGeocentric()) {
- return PJ_TYPE_GEOCENTRIC_CRS;
- } else {
- return PJ_TYPE_GEODETIC_CRS;
+ {
+ auto crs = dynamic_cast<GeodeticCRS *>(ptr);
+ if (crs) {
+ if (crs->isGeocentric()) {
+ return PJ_TYPE_GEOCENTRIC_CRS;
+ } else {
+ return PJ_TYPE_GEODETIC_CRS;
+ }
}
}
- }
- if (dynamic_cast<VerticalCRS *>(ptr)) {
- return PJ_TYPE_VERTICAL_CRS;
- }
- if (dynamic_cast<ProjectedCRS *>(ptr)) {
- return PJ_TYPE_PROJECTED_CRS;
- }
- if (dynamic_cast<CompoundCRS *>(ptr)) {
- return PJ_TYPE_COMPOUND_CRS;
- }
- if (dynamic_cast<TemporalCRS *>(ptr)) {
- return PJ_TYPE_TEMPORAL_CRS;
- }
- if (dynamic_cast<EngineeringCRS *>(ptr)) {
- return PJ_TYPE_ENGINEERING_CRS;
- }
- if (dynamic_cast<BoundCRS *>(ptr)) {
- return PJ_TYPE_BOUND_CRS;
- }
- if (dynamic_cast<CRS *>(ptr)) {
- return PJ_TYPE_OTHER_CRS;
- }
+ if (dynamic_cast<VerticalCRS *>(ptr)) {
+ return PJ_TYPE_VERTICAL_CRS;
+ }
+ if (dynamic_cast<ProjectedCRS *>(ptr)) {
+ return PJ_TYPE_PROJECTED_CRS;
+ }
+ if (dynamic_cast<CompoundCRS *>(ptr)) {
+ return PJ_TYPE_COMPOUND_CRS;
+ }
+ if (dynamic_cast<TemporalCRS *>(ptr)) {
+ return PJ_TYPE_TEMPORAL_CRS;
+ }
+ if (dynamic_cast<EngineeringCRS *>(ptr)) {
+ return PJ_TYPE_ENGINEERING_CRS;
+ }
+ if (dynamic_cast<BoundCRS *>(ptr)) {
+ return PJ_TYPE_BOUND_CRS;
+ }
+ if (dynamic_cast<CRS *>(ptr)) {
+ return PJ_TYPE_OTHER_CRS;
+ }
- if (dynamic_cast<Conversion *>(ptr)) {
- return PJ_TYPE_CONVERSION;
- }
- if (dynamic_cast<Transformation *>(ptr)) {
- return PJ_TYPE_TRANSFORMATION;
- }
- if (dynamic_cast<ConcatenatedOperation *>(ptr)) {
- return PJ_TYPE_CONCATENATED_OPERATION;
- }
- if (dynamic_cast<CoordinateOperation *>(ptr)) {
- return PJ_TYPE_OTHER_COORDINATE_OPERATION;
- }
+ if (dynamic_cast<Conversion *>(ptr)) {
+ return PJ_TYPE_CONVERSION;
+ }
+ if (dynamic_cast<Transformation *>(ptr)) {
+ return PJ_TYPE_TRANSFORMATION;
+ }
+ if (dynamic_cast<ConcatenatedOperation *>(ptr)) {
+ return PJ_TYPE_CONCATENATED_OPERATION;
+ }
+ if (dynamic_cast<CoordinateOperation *>(ptr)) {
+ return PJ_TYPE_OTHER_COORDINATE_OPERATION;
+ }
+
+ return PJ_TYPE_UNKNOWN;
+ };
- return PJ_TYPE_UNKNOWN;
+ obj->type = getType();
+ return obj->type;
}
// ---------------------------------------------------------------------------