From 445a029a2f926dca0d6c9c46cc61f8d01c87f17f Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Fri, 22 May 2026 12:51:33 +0300 Subject: [PATCH] mcc_bsplines.h: use of FC_GLOBAL macro to correct call FITPACK subroutines mangled names fitpack/CMakeLists.txt: add non-empty SYMBOL_NAMESPACE to fix generated 'insert' macro (interference with STL containers 'insert' methods) macro issue various fixes --- fitpack/CMakeLists.txt | 4 +- include/mcc/mcc_bsplines.h | 289 +++++++++++++++++++------------------ include/mcc/mcc_keyvalue.h | 17 +-- include/mcc/mcc_pzone.h | 4 +- 4 files changed, 155 insertions(+), 159 deletions(-) diff --git a/fitpack/CMakeLists.txt b/fitpack/CMakeLists.txt index c41ff0b..85884cb 100644 --- a/fitpack/CMakeLists.txt +++ b/fitpack/CMakeLists.txt @@ -21,8 +21,8 @@ include(FortranCInterface) FortranCInterface_HEADER( FortranCInterface.h MACRO_NAMESPACE "FC_" - # SYMBOL_NAMESPACE "fp_" - SYMBOL_NAMESPACE "" + SYMBOL_NAMESPACE "FC_" + #SYMBOL_NAMESPACE "" # SYMBOLS ${func_str} SYMBOLS ${func_name} ) diff --git a/include/mcc/mcc_bsplines.h b/include/mcc/mcc_bsplines.h index 5781628..6dfb14e 100644 --- a/include/mcc/mcc_bsplines.h +++ b/include/mcc/mcc_bsplines.h @@ -8,139 +8,147 @@ extern "C" { +void FC_GLOBAL(insert, INSERT)(int*, double*, int*, double*, int*, double*, double*, int*, double*, int*, int*); + /* fitting on XY-grid */ -void surfit(int* iopt, - int* m, - double* x, - double* y, - double* z, - double* w, - double* xb, - double* xe, - double* yb, - double* ye, - int* kx, - int* ky, - double* s, - int* nxest, - int* nyest, - int* nmax, - double* eps, - int* nx, - double* tx, - int* ny, - double* ty, - double* c, - double* fp, - double* wrk1, - int* lwrk1, - double* wrk2, - int* lwrk2, - int* iwrk, - int* kwrk, - int* ier); +void FC_GLOBAL(surfit, SURFIT)(int* iopt, + // void surfit(int* iopt, + int* m, + double* x, + double* y, + double* z, + double* w, + double* xb, + double* xe, + double* yb, + double* ye, + int* kx, + int* ky, + double* s, + int* nxest, + int* nyest, + int* nmax, + double* eps, + int* nx, + double* tx, + int* ny, + double* ty, + double* c, + double* fp, + double* wrk1, + int* lwrk1, + double* wrk2, + int* lwrk2, + int* iwrk, + int* kwrk, + int* ier); /* XY-grid */ -void bispev(double* tx, - int* nx, - double* ty, - int* ny, - double* c, - int* kx, - int* ky, - double* x, - int* mx, - double* y, - int* my, - double* z, - double* wrk, - int* lwrk, - int* iwrk, - int* kwrk, - int* ier); +void FC_GLOBAL(bispev, BISPEV)(double* tx, + // void bispev(double* tx, + int* nx, + double* ty, + int* ny, + double* c, + int* kx, + int* ky, + double* x, + int* mx, + double* y, + int* my, + double* z, + double* wrk, + int* lwrk, + int* iwrk, + int* kwrk, + int* ier); /* XY-grid */ -void parder(double* tx, - int* nx, - double* ty, - int* ny, - double* c, - int* kx, - int* ky, - int* nux, - int* nuy, - double* x, - int* mx, - double* y, - int* my, - double* z, - double* wrk, - int* lwrk, - int* iwrk, - int* kwrk, - int* ier); +void FC_GLOBAL(parder, PARDER)(double* tx, + // void parder(double* tx, + int* nx, + double* ty, + int* ny, + double* c, + int* kx, + int* ky, + int* nux, + int* nuy, + double* x, + int* mx, + double* y, + int* my, + double* z, + double* wrk, + int* lwrk, + int* iwrk, + int* kwrk, + int* ier); /* fitting on sphere */ -void sphere(int* iopt, - int* m, - double* teta, - double* phi, - double* r, - double* w, - double* s, - int* ntest, - int* npest, - double* eps, - int* nt, - double* tt, - int* np, - double* tp, - double* c, - double* fp, - double* wrk1, - int* lwrk1, - double* wrk2, - int* lwrk2, - int* iwrk, - int* kwrk, - int* ier); +void FC_GLOBAL(sphere, SPHERE)(int* iopt, + // void sphere(int* iopt, + int* m, + double* teta, + double* phi, + double* r, + double* w, + double* s, + int* ntest, + int* npest, + double* eps, + int* nt, + double* tt, + int* np, + double* tp, + double* c, + double* fp, + double* wrk1, + int* lwrk1, + double* wrk2, + int* lwrk2, + int* iwrk, + int* kwrk, + int* ier); /* calculation for set of points (not grid) */ -void bispeu(double* tx, - int* nx, - double* ty, - int* ny, - double* c, - int* kx, - int* ky, - double* x, - double* y, - double* z, - int* m, - double* wrk, - int* lwrk, - int* ier); +void FC_GLOBAL(bispeu, BISPEU)(double* tx, + // void bispeu(double* tx, + int* nx, + double* ty, + int* ny, + double* c, + int* kx, + int* ky, + double* x, + double* y, + double* z, + int* m, + double* wrk, + int* lwrk, + int* ier); /* calculation for set of points (not grid) */ -void pardeu(double* tx, - int* nx, - double* ty, - int* ny, - double* c, - int* kx, - int* ky, - int* nux, - int* nuy, - double* x, - double* y, - double* z, - int* m, - double* wrk, - int* lwrk, - int* iwrk, - int* kwrk, - int* ier); +void FC_GLOBAL(pardeu, PARDEU)(double* tx, + // void pardeu(double* tx, + int* nx, + double* ty, + int* ny, + double* c, + int* kx, + int* ky, + int* nux, + int* nuy, + double* x, + double* y, + double* z, + int* m, + double* wrk, + int* lwrk, + int* iwrk, + int* kwrk, + int* ier); } @@ -257,23 +265,15 @@ int fitpack_sphere_smooth(const TethaT& tetha, if constexpr (std::ranges::contiguous_range) { auto weight_ptr = const_cast(std::ranges::data(weight)); - sphere(&iopt, &m, tetha_ptr, phi_ptr, func_ptr, weight_ptr, &s_par, &nt, &np, &eps, &ntest, tetha_knots_ptr, - &npest, phi_knots_ptr, std::ranges::data(coeffs), &resi2_sum, wrk1.data(), &lwrk1, wrk2.data(), &lwrk2, - iwrk.data(), &kwrk, &res); - // sphere(&iopt, &m, std::ranges::data(tetha), std::ranges::data(phi), std::ranges::data(func), - // std::ranges::data(weight), &s_par, &ntest, &npest, &eps, &ntest, std::ranges::data(tetha_knots), - // &npest, std::ranges::data(phi_knots), std::ranges::data(coeffs), &resi2_sum, wrk1.data(), &lwrk1, - // wrk2.data(), &lwrk2, iwrk.data(), &kwrk, &res); + FC_GLOBAL(sphere, SPHERE)(&iopt, &m, tetha_ptr, phi_ptr, func_ptr, weight_ptr, &s_par, &nt, &np, &eps, &ntest, + tetha_knots_ptr, &npest, phi_knots_ptr, std::ranges::data(coeffs), &resi2_sum, + wrk1.data(), &lwrk1, wrk2.data(), &lwrk2, iwrk.data(), &kwrk, &res); } else { std::vector weight_vec(m, weight); - sphere(&iopt, &m, tetha_ptr, phi_ptr, func_ptr, weight_vec.data(), &s_par, &nt, &np, &eps, &ntest, - tetha_knots_ptr, &npest, phi_knots_ptr, std::ranges::data(coeffs), &resi2_sum, wrk1.data(), &lwrk1, - wrk2.data(), &lwrk2, iwrk.data(), &kwrk, &res); - // res = sphere(&iopt, &m, std::ranges::data(tetha), std::ranges::data(phi), std::ranges::data(func), - // weight_vec.data(), &s_par, &ntest, &npest, &eps, &ntest, std::ranges::data(tetha_knots), &npest, - // std::ranges::data(phi_knots), std::ranges::data(coeffs), &resi2_sum, wrk1.get(), &lwrk1, - // wrk2.get(), &lwrk2, iwrk.get(), &kwrk, &res); + FC_GLOBAL(sphere, SPHERE)(&iopt, &m, tetha_ptr, phi_ptr, func_ptr, weight_vec.data(), &s_par, &nt, &np, &eps, + &ntest, tetha_knots_ptr, &npest, phi_knots_ptr, std::ranges::data(coeffs), &resi2_sum, + wrk1.data(), &lwrk1, wrk2.data(), &lwrk2, iwrk.data(), &kwrk, &res); } @@ -367,8 +367,8 @@ int fitpack_eval_spl2d_grid(const TXT& tx, auto x_ptr = const_cast(std::ranges::data(x)); auto y_ptr = const_cast(std::ranges::data(y)); - bispev(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, x_ptr, &mx, y_ptr, &my, std::ranges::data(func), - wrk.data(), &lwrk, iwrk.data(), &kwrk, &ier); + FC_GLOBAL(bispev, BISPEV)(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, x_ptr, &mx, y_ptr, &my, + std::ranges::data(func), wrk.data(), &lwrk, iwrk.data(), &kwrk, &ier); return ier; } @@ -431,8 +431,10 @@ int fitpack_eval_spl2d(const TXT& tx, int lwrk = kx + ky + 2; std::vector wrk(lwrk); - bispeu(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, x_ptr, y_ptr, std::ranges::data(func), &m, wrk.data(), - &lwrk, &ier); + FC_GLOBAL(bispeu, BISPEU)(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, x_ptr, y_ptr, std::ranges::data(func), + &m, wrk.data(), &lwrk, &ier); + // bispeu(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, x_ptr, y_ptr, std::ranges::data(func), &m, wrk.data(), + // &lwrk, &ier); return ier; } @@ -536,8 +538,8 @@ int fitpack_parder_spl2d_grid(const TXT& tx, int ier = 0; - parder(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, &dx, &dy, x_ptr, &mx, y_ptr, &my, std::ranges::data(pder), - wrk.data(), &lwrk, iwrk.data(), &kwrk, &ier); + FC_GLOBAL(parder, PARDER)(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, &dx, &dy, x_ptr, &mx, y_ptr, &my, + std::ranges::data(pder), wrk.data(), &lwrk, iwrk.data(), &kwrk, &ier); return ier; } @@ -604,8 +606,8 @@ int fitpack_parder_spl2d(const TXT& tx, int kwrk = 2 * m; std::vector iwrk(kwrk); - pardeu(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, &dx, &dy, x_ptr, y_ptr, std::ranges::data(pder), &m, - wrk.data(), &lwrk, iwrk.data(), &kwrk, &ier); + FC_GLOBAL(pardeu, PARDEU)(tx_ptr, &ntx, ty_ptr, &nty, coeffs_ptr, &kx, &ky, &dx, &dy, x_ptr, y_ptr, + std::ranges::data(pder), &m, wrk.data(), &lwrk, iwrk.data(), &kwrk, &ier); return ier; } @@ -645,5 +647,4 @@ int fitpack_parder_spl2d(const TXT& tx, return fitpack_parder_spl2d(tx, ty, coeffs, xv, yv, pv, dx, dy, kx, ky); } - } // namespace mcc::bsplines diff --git a/include/mcc/mcc_keyvalue.h b/include/mcc/mcc_keyvalue.h index d6be799..5d92e72 100644 --- a/include/mcc/mcc_keyvalue.h +++ b/include/mcc/mcc_keyvalue.h @@ -107,19 +107,14 @@ template concept mcc_keyvalue_desc_c = requires(T t) { [](std::tuple) {}(t); }; -namespace constants -{ - static constexpr char MCC_KV_COMMENT_SEQ_ARR[] = "#"; static constexpr char MCC_KV_KEY_VALUE_DELIM_SEQ_ARR[] = "="; static constexpr char MCC_KV_COMPOSITE_VALUE_DELIM_SEQ_ARR[] = ","; -} // namespace constants - template class MccKeyValueHolder { @@ -132,12 +127,12 @@ public: static constexpr std::string_view DEFAULT_RECORD_DELIMITER{"\n"}; - static constexpr std::string_view COMMENT_SEQ{COMM_SEQ == nullptr ? constants::MCC_KV_COMMENT_SEQ_ARR - : COMM_SEQ[0] == '\0' ? constants::MCC_KV_COMMENT_SEQ_ARR + static constexpr std::string_view COMMENT_SEQ{COMM_SEQ == nullptr ? MCC_KV_COMMENT_SEQ_ARR + : COMM_SEQ[0] == '\0' ? MCC_KV_COMMENT_SEQ_ARR : COMM_SEQ}; - static constexpr std::string_view KEY_VALUE_DELIM{KV_DELIM == nullptr ? constants::MCC_KV_KEY_VALUE_DELIM_SEQ_ARR - : KV_DELIM[0] == '\0' ? constants::MCC_KV_KEY_VALUE_DELIM_SEQ_ARR + static constexpr std::string_view KEY_VALUE_DELIM{KV_DELIM == nullptr ? MCC_KV_KEY_VALUE_DELIM_SEQ_ARR + : KV_DELIM[0] == '\0' ? MCC_KV_KEY_VALUE_DELIM_SEQ_ARR : KV_DELIM}; static constexpr size_t NUMBER_OF_RECORDS = std::tuple_size_v; diff --git a/include/mcc/mcc_pzone.h b/include/mcc/mcc_pzone.h index a4fdcfd..e089524 100644 --- a/include/mcc/mcc_pzone.h +++ b/include/mcc/mcc_pzone.h @@ -397,7 +397,7 @@ struct MccDeserializer> : MccDeserializerBase { MccDeserializer ades; auto seq = std::views::split(input, params.seq_delim); - if (std::ranges::distance(seq.begin(), seq.end()) < 2) { + if (std::ranges::distance(seq.begin(), seq.end()) > 1) { for (auto const& seq_el : seq) { s.push_back(utils::trimSpaces(seq_el, utils::TrimType::TRIM_BOTH)); } @@ -661,7 +661,7 @@ struct MccDeserializer> : MccDeserializerBase { auto seq = std::views::split(input, params.seq_delim); // if (std::ranges::size(seq) < 2) { - if (std::ranges::distance(seq.begin(), seq.end()) < 2) { + if (std::ranges::distance(seq.begin(), seq.end()) > 1) { for (auto const& seq_el : seq) { s.push_back(utils::trimSpaces(seq_el, utils::TrimType::TRIM_BOTH)); }