diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | docs/source/development/reference/functions.rst | 8 | ||||
| -rw-r--r-- | scripts/reference_exported_symbols.txt | 1 | ||||
| -rw-r--r-- | src/4D_api.cpp | 2 | ||||
| -rw-r--r-- | src/ctx.cpp | 13 | ||||
| -rw-r--r-- | src/proj.h | 1 | ||||
| -rw-r--r-- | src/proj_symbol_rename.h | 7 | ||||
| -rw-r--r-- | test/unit/test_c_api.cpp | 24 |
8 files changed, 55 insertions, 2 deletions
@@ -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() */ /************************************************************************/ @@ -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) { |
