aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--docs/source/development/reference/functions.rst8
-rw-r--r--scripts/reference_exported_symbols.txt1
-rw-r--r--src/4D_api.cpp2
-rw-r--r--src/ctx.cpp13
-rw-r--r--src/proj.h1
-rw-r--r--src/proj_symbol_rename.h7
-rw-r--r--test/unit/test_c_api.cpp24
8 files changed, 55 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index 5f9508c3..1d9aa793 100644
--- a/.gitignore
+++ b/.gitignore
@@ -134,6 +134,7 @@ m4/lt~obsolete.m4
/test/unit/proj_errno_string_test
/test/unit/test_defmodel
/test/unit/test_network
+/test/unit/test_tinshift
/tmp_alias/
# jniwrap
diff --git a/docs/source/development/reference/functions.rst b/docs/source/development/reference/functions.rst
index 770fb8ec..cc29743c 100644
--- a/docs/source/development/reference/functions.rst
+++ b/docs/source/development/reference/functions.rst
@@ -13,6 +13,14 @@ Threading contexts
:returns: a new context
+.. c:function:: PJ_CONTEXT* proj_context_clone(PJ_CONTEXT *ctx)
+
+ .. versionadded:: 7.2
+
+ Create a new threading-context based on an existing context.
+
+ :returns: a new context
+
.. c:function:: void proj_context_destroy(PJ_CONTEXT *ctx)
Deallocate a threading-context.
diff --git a/scripts/reference_exported_symbols.txt b/scripts/reference_exported_symbols.txt
index 72db3fd3..8db49a95 100644
--- a/scripts/reference_exported_symbols.txt
+++ b/scripts/reference_exported_symbols.txt
@@ -833,6 +833,7 @@ proj_cleanup
proj_clone
proj_concatoperation_get_step
proj_concatoperation_get_step_count
+proj_context_clone
proj_context_create
proj_context_delete_cpp_context(projCppContext*)
proj_context_destroy
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index 3c6ab802..0c26840d 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -1448,7 +1448,7 @@ int proj_errno_reset (const PJ *P) {
}
-/* Create a new context */
+/* Create a new context based on the default context */
PJ_CONTEXT *proj_context_create (void) {
return pj_ctx_alloc ();
}
diff --git a/src/ctx.cpp b/src/ctx.cpp
index 5575d3aa..6dbe0de5 100644
--- a/src/ctx.cpp
+++ b/src/ctx.cpp
@@ -226,6 +226,19 @@ projCtx pj_ctx_alloc()
}
/************************************************************************/
+/* proj_context_clone() */
+/* Create a new context based on a custom context */
+/************************************************************************/
+
+PJ_CONTEXT *proj_context_clone (PJ_CONTEXT *ctx)
+{
+ if (nullptr==ctx)
+ return pj_ctx_alloc ();
+
+ return new (std::nothrow) projCtx_t(*ctx);
+}
+
+/************************************************************************/
/* pj_ctx_free() */
/************************************************************************/
diff --git a/src/proj.h b/src/proj.h
index b758663a..c98fcc1f 100644
--- a/src/proj.h
+++ b/src/proj.h
@@ -361,6 +361,7 @@ typedef struct projCtx_t PJ_CONTEXT;
#endif
PJ_CONTEXT PROJ_DLL *proj_context_create (void);
PJ_CONTEXT PROJ_DLL *proj_context_destroy (PJ_CONTEXT *ctx);
+PJ_CONTEXT PROJ_DLL *proj_context_clone (PJ_CONTEXT *ctx);
/** Callback to resolve a filename to a full path */
typedef const char* (*proj_file_finder) (PJ_CONTEXT *ctx, const char*, void* user_data);
diff --git a/src/proj_symbol_rename.h b/src/proj_symbol_rename.h
index cb6fcd23..7fbe4242 100644
--- a/src/proj_symbol_rename.h
+++ b/src/proj_symbol_rename.h
@@ -97,6 +97,7 @@
#define proj_clone internal_proj_clone
#define proj_concatoperation_get_step internal_proj_concatoperation_get_step
#define proj_concatoperation_get_step_count internal_proj_concatoperation_get_step_count
+#define proj_context_clone internal_proj_context_clone
#define proj_context_create internal_proj_context_create
#define proj_context_destroy internal_proj_context_destroy
#define proj_context_errno internal_proj_context_errno
@@ -235,6 +236,8 @@
#define proj_crs_get_coordinate_system internal_proj_crs_get_coordinate_system
#define proj_crs_get_coordoperation internal_proj_crs_get_coordoperation
#define proj_crs_get_datum internal_proj_crs_get_datum
+#define proj_crs_get_datum_ensemble internal_proj_crs_get_datum_ensemble
+#define proj_crs_get_datum_forced internal_proj_crs_get_datum_forced
#define proj_crs_get_geodetic_crs internal_proj_crs_get_geodetic_crs
#define proj_crs_get_horizontal_datum internal_proj_crs_get_horizontal_datum
#define proj_crs_get_sub_crs internal_proj_crs_get_sub_crs
@@ -243,11 +246,15 @@
#define proj_cs_get_axis_count internal_proj_cs_get_axis_count
#define proj_cs_get_axis_info internal_proj_cs_get_axis_info
#define proj_cs_get_type internal_proj_cs_get_type
+#define proj_datum_ensemble_get_accuracy internal_proj_datum_ensemble_get_accuracy
+#define proj_datum_ensemble_get_member internal_proj_datum_ensemble_get_member
+#define proj_datum_ensemble_get_member_count internal_proj_datum_ensemble_get_member_count
#define proj_degree_input internal_proj_degree_input
#define proj_degree_output internal_proj_degree_output
#define proj_destroy internal_proj_destroy
#define proj_dmstor internal_proj_dmstor
#define proj_download_file internal_proj_download_file
+#define proj_dynamic_datum_get_frame_reference_epoch internal_proj_dynamic_datum_get_frame_reference_epoch
#define proj_ellipsoid_get_parameters internal_proj_ellipsoid_get_parameters
#define proj_errno internal_proj_errno
#define proj_errno_reset internal_proj_errno_reset
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index f6371cc3..a176a542 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -4083,7 +4083,7 @@ TEST_F(Fixture_proj_context_set_autoclose_database,
// ---------------------------------------------------------------------------
-TEST_F(CApi, proj_context_clone) {
+TEST_F(CApi, proj_context_copy_from_default) {
auto c_path = proj_context_get_database_path(m_ctxt);
ASSERT_TRUE(c_path != nullptr);
std::string path(c_path);
@@ -4133,6 +4133,28 @@ TEST_F(CApi, proj_context_clone) {
ASSERT_EQ(new_db_path, tmp_filename);
}
+
+// ---------------------------------------------------------------------------
+
+TEST_F(CApi, proj_context_clone) {
+ int new_init_rules = proj_context_get_use_proj4_init_rules(NULL, 0) > 0 ? 0 : 1;
+ PJ_CONTEXT *new_ctx = proj_context_create();
+ EXPECT_NE(new_ctx, nullptr);
+ PjContextKeeper keeper_ctxt(new_ctx);
+ proj_context_use_proj4_init_rules(new_ctx, new_init_rules);
+ PJ_CONTEXT *clone_ctx = proj_context_clone(new_ctx);
+ EXPECT_NE(clone_ctx, nullptr);
+ PjContextKeeper keeper_clone_ctxt(clone_ctx);
+ ASSERT_EQ(
+ proj_context_get_use_proj4_init_rules(new_ctx, 0),
+ proj_context_get_use_proj4_init_rules(clone_ctx, 0)
+ );
+ EXPECT_NE(
+ proj_context_get_use_proj4_init_rules(NULL, 0),
+ proj_context_get_use_proj4_init_rules(clone_ctx, 0)
+ );
+}
+
// ---------------------------------------------------------------------------
TEST_F(CApi, proj_create_crs_to_crs_from_pj) {