aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/c_api.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/iso19111/c_api.cpp')
-rw-r--r--src/iso19111/c_api.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp
index bc1d0bd8..7a77ccfb 100644
--- a/src/iso19111/c_api.cpp
+++ b/src/iso19111/c_api.cpp
@@ -6976,3 +6976,62 @@ PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ *obj) {
return nullptr;
}
}
+
+// ---------------------------------------------------------------------------
+
+/** \brief Returns the number of steps of a concatenated operation.
+ *
+ * The input object must be a concatenated operation.
+ *
+ * @param ctx PROJ context, or NULL for default context
+ * @param concatoperation Concatenated operation (must not be NULL)
+ * @return the number of steps, or 0 in case of error.
+ */
+int proj_concatoperation_get_step_count(PJ_CONTEXT *ctx,
+ const PJ *concatoperation) {
+ SANITIZE_CTX(ctx);
+ assert(concatoperation);
+ auto l_co = dynamic_cast<const ConcatenatedOperation *>(
+ concatoperation->iso_obj.get());
+ if (!l_co) {
+ proj_log_error(ctx, __FUNCTION__,
+ "Object is not a ConcatenatedOperation");
+ return false;
+ }
+ return static_cast<int>(l_co->operations().size());
+}
+// ---------------------------------------------------------------------------
+
+/** \brief Returns a step of a concatenated operation.
+ *
+ * The input object must be a concatenated operation.
+ *
+ * The returned object must be unreferenced with proj_destroy() after
+ * use.
+ * It should be used by at most one thread at a time.
+ *
+ * @param ctx PROJ context, or NULL for default context
+ * @param concatoperation Concatenated operation (must not be NULL)
+ * @param i_step Index of the step to extract. Between 0 and
+ * proj_concatoperation_get_step_count()-1
+ * @return Object that must be unreferenced with proj_destroy(), or NULL
+ * in case of error.
+ */
+PJ *proj_concatoperation_get_step(PJ_CONTEXT *ctx, const PJ *concatoperation,
+ int i_step) {
+ SANITIZE_CTX(ctx);
+ assert(concatoperation);
+ auto l_co = dynamic_cast<const ConcatenatedOperation *>(
+ concatoperation->iso_obj.get());
+ if (!l_co) {
+ proj_log_error(ctx, __FUNCTION__,
+ "Object is not a ConcatenatedOperation");
+ return nullptr;
+ }
+ const auto &steps = l_co->operations();
+ if (i_step < 0 || static_cast<size_t>(i_step) >= steps.size()) {
+ proj_log_error(ctx, __FUNCTION__, "Invalid step index");
+ return nullptr;
+ }
+ return pj_obj_create(ctx, steps[i_step]);
+}