added CMAKE-check for existence of _j0 or j0, should fix issue https://github.com/jkriege2/JKQtPlotter/issues/124

This commit is contained in:
jkriege2 2024-03-12 22:00:33 +01:00
parent ffb33a507e
commit 7f4972a0e1
4 changed files with 141 additions and 98 deletions

View File

@ -10,3 +10,16 @@ math(EXPR JKQtPlotter_BIT_DEPTH ${CMAKE_SIZEOF_VOID_P}*8)
find_package( CImg QUIET )
find_package( OpenCV QUIET )
include(CheckFunctionExists)
set(CMAKE_REQUIRED_INCLUDES "cmath")
CHECK_FUNCTION_EXISTS(j0 JKQtPlotter_HAS_j0)
CHECK_FUNCTION_EXISTS(_j0 JKQtPlotter_HAS__j0)
CHECK_FUNCTION_EXISTS(y0 JKQtPlotter_HAS_y0)
CHECK_FUNCTION_EXISTS(_y0 JKQtPlotter_HAS__y0)
CHECK_FUNCTION_EXISTS(jn JKQtPlotter_HAS_jn)
CHECK_FUNCTION_EXISTS(_jn JKQtPlotter_HAS__jn)
CHECK_FUNCTION_EXISTS(yn JKQtPlotter_HAS_yn)
CHECK_FUNCTION_EXISTS(_yn JKQtPlotter_HAS__yn)

View File

@ -38,6 +38,31 @@ function(jkqtplotter_setDefaultLibOptions TARGETNAME libBaseName PRECOMPHEADERFI
target_compile_definitions(${TARGETNAME} PUBLIC NOMINMAX)
endif()
if(JKQtPlotter_HAS_j0)
target_compile_definitions(${TARGETNAME} PUBLIC JKQtPlotter_HAS_j0)
endif()
if(JKQtPlotter_HAS__j0)
target_compile_definitions(${TARGETNAME} PUBLIC JKQtPlotter_HAS__j0)
endif()
if(JKQtPlotter_HAS_y0)
target_compile_definitions(${TARGETNAME} PUBLIC JKQtPlotter_HAS_y0)
endif()
if(JKQtPlotter_HAS__y0)
target_compile_definitions(${TARGETNAME} PUBLIC JKQtPlotter_HAS__y0)
endif()
if(JKQtPlotter_HAS_jn)
target_compile_definitions(${TARGETNAME} PUBLIC JKQtPlotter_HAS_jn)
endif()
if(JKQtPlotter_HAS__jn)
target_compile_definitions(${TARGETNAME} PUBLIC JKQtPlotter_HAS__jn)
endif()
if(JKQtPlotter_HAS_yn)
target_compile_definitions(${TARGETNAME} PUBLIC JKQtPlotter_HAS_yn)
endif()
if(JKQtPlotter_HAS__yn)
target_compile_definitions(${TARGETNAME} PUBLIC JKQtPlotter_HAS__yn)
endif()
# enable TIMING INFO output (if activated by option JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT)
if(JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT)
target_compile_definitions(${TARGETNAME} PRIVATE JKQTBP_AUTOTIMER)

View File

@ -391,14 +391,16 @@ inline T jkqtp_inversePropSaveDefault(const T& v) {
return jkqtp_inversePropSave<T>(v, std::numeric_limits<T>::epsilon()*100.0);
}
#if defined(JKQtPlotter_HAS_j0) || defined(JKQtPlotter_HAS__j0) || defined(DOXYGEN)
/*! \brief j0() function (without compiler issues)
\ingroup jkqtptools_math_basic
*/
inline double jkqtp_j0(double x) {
#if Q_CC_MSVC
#ifdef JKQtPlotter_HAS__j0
return _j0(x);
#else
#elif defined(JKQtPlotter_HAS_j0)
return j0(x);
#endif
}
@ -408,21 +410,38 @@ inline double jkqtp_j0(double x) {
*/
inline double jkqtp_j1(double x) {
#if Q_CC_MSVC
#ifdef JKQtPlotter_HAS__j0
return _j1(x);
#else
#elif defined(JKQtPlotter_HAS_j0)
return j1(x);
#endif
}
#endif
#if defined(JKQtPlotter_HAS_jn) || defined(JKQtPlotter_HAS__jn) || defined(DOXYGEN)
/*! \brief jn() function (without compiler issues)
\ingroup jkqtptools_math_basic
*/
inline double jkqtp_jn(int n, double x) {
#ifdef JKQtPlotter_HAS__jn
return _jn(n,x);
#elif defined(JKQtPlotter_HAS_jn)
return jn(n,x);
#endif
}
#endif
#if defined(JKQtPlotter_HAS_y0) || defined(JKQtPlotter_HAS__y0) || defined(DOXYGEN)
/*! \brief y0() function (without compiler issues)
\ingroup jkqtptools_math_basic
*/
inline double jkqtp_y0(double x) {
#if Q_CC_MSVC
#ifdef JKQtPlotter_HAS__y0
return _y0(x);
#else
#elif defined(JKQtPlotter_HAS_y0)
return y0(x);
#endif
}
@ -432,36 +451,27 @@ inline double jkqtp_y0(double x) {
*/
inline double jkqtp_y1(double x) {
#if Q_CC_MSVC
#ifdef JKQtPlotter_HAS__y0
return _y1(x);
#else
#elif defined(JKQtPlotter_HAS_y0)
return y1(x);
#endif
}
/*! \brief jn() function (without compiler issues)
\ingroup jkqtptools_math_basic
*/
inline double jkqtp_jn(int n, double x) {
#if Q_CC_MSVC
return _jn(n,x);
#else
return jn(n,x);
#endif
}
#if defined(JKQtPlotter_HAS_yn) || defined(JKQtPlotter_HAS__yn) || defined(DOXYGEN)
/*! \brief yn() function (without compiler issues)
\ingroup jkqtptools_math_basic
*/
inline double jkqtp_yn(int n, double x) {
#if Q_CC_MSVC
#ifdef JKQtPlotter_HAS__yn
return _yn(n,x);
#else
#elif defined(JKQtPlotter_HAS_yn)
return yn(n,x);
#endif
}
#endif
/** \brief calculate the distance between two QPointF points
* \ingroup jkqtptools_math_basic

View File

@ -25,6 +25,7 @@
#endif
#include <cmath>
#include "jkqtmath/jkqtpmathparser.h" // class's header file
#include "jkqtcommon/jkqtpmathtools.h"
#include <iostream>
#include <float.h>
#include <ctime>
@ -324,16 +325,13 @@ namespace { // anonymous namespace to limit availability to this module (CPP-fil
return r;
}
#if defined(JKQtPlotter_HAS_j0) || defined(JKQtPlotter_HAS__j0)
JKQTPMathParser::jkmpResult fJ0(JKQTPMathParser::jkmpResult* params, unsigned char n, JKQTPMathParser* p){
JKQTPMathParser::jkmpResult r;
r.type=JKQTPMathParser::jkmpDouble;
if (n!=1) p->jkmpError("j0 accepts 1 argument");
if (params[0].type!=JKQTPMathParser::jkmpDouble) p->jkmpError("j0 needs double argument");
#if Q_CC_MSVC
r.num = _j0(params[0].num);
#else
r.num = j0(params[0].num);
#endif
r.num = jkqtp_j0(params[0].num);
return r;
}
@ -342,24 +340,32 @@ namespace { // anonymous namespace to limit availability to this module (CPP-fil
r.type=JKQTPMathParser::jkmpDouble;
if (n!=1) p->jkmpError("j1 accepts 1 argument");
if (params[0].type!=JKQTPMathParser::jkmpDouble) p->jkmpError("j1 needs double argument");
#if Q_CC_MSVC
r.num=_j1(params[0].num);
#else
r.num=j1(params[0].num);
r.num = jkqtp_j1(params[0].num);
return r;
}
#endif
#if defined(JKQtPlotter_HAS_jn) || defined(JKQtPlotter_HAS__jn)
JKQTPMathParser::jkmpResult fJn(JKQTPMathParser::jkmpResult* params, unsigned char n, JKQTPMathParser* p){
JKQTPMathParser::jkmpResult r;
r.type=JKQTPMathParser::jkmpDouble;
if (n!=2) p->jkmpError("jn accepts 2 argument");
if ((params[0].type!=JKQTPMathParser::jkmpDouble)||(params[1].type!=JKQTPMathParser::jkmpDouble)) p->jkmpError("jn needs double argument");
r.num=jkqtp_jn(static_cast<int>(params[0].num), params[1].num);
return r;
}
#endif
#if defined(JKQtPlotter_HAS_y0) || defined(JKQtPlotter_HAS__y0)
JKQTPMathParser::jkmpResult fY0(JKQTPMathParser::jkmpResult* params, unsigned char n, JKQTPMathParser* p){
JKQTPMathParser::jkmpResult r;
r.type=JKQTPMathParser::jkmpDouble;
if (n!=1) p->jkmpError("y0 accepts 1 argument");
if (params[0].type!=JKQTPMathParser::jkmpDouble) p->jkmpError("y0 needs double argument");
#if Q_CC_MSVC
r.num=_y0(params[0].num);
#else
r.num=y0(params[0].num);
#endif
r.num = jkqtp_y0(params[0].num);
return r;
}
@ -368,39 +374,20 @@ namespace { // anonymous namespace to limit availability to this module (CPP-fil
r.type=JKQTPMathParser::jkmpDouble;
if (n!=1) p->jkmpError("y1 accepts 1 argument");
if (params[0].type!=JKQTPMathParser::jkmpDouble) p->jkmpError("y1 needs double argument");
#if Q_CC_MSVC
r.num=_y1(params[0].num);
#else
r.num=y1(params[0].num);
#endif
r.num = jkqtp_y1(params[0].num);
return r;
}
#endif
#if defined(JKQtPlotter_HAS_yn) || defined(JKQtPlotter_HAS__yn)
JKQTPMathParser::jkmpResult fYn(JKQTPMathParser::jkmpResult* params, unsigned char n, JKQTPMathParser* p){
JKQTPMathParser::jkmpResult r;
r.type=JKQTPMathParser::jkmpDouble;
if (n!=2) p->jkmpError("yn accepts 2 argument");
if ((params[0].type!=JKQTPMathParser::jkmpDouble)||(params[1].type!=JKQTPMathParser::jkmpDouble)) p->jkmpError("yn needs double argument");
#if Q_CC_MSVC
r.num=_yn(static_cast<int>(params[0].num), params[1].num);
#else
r.num=yn(static_cast<int>(params[0].num), params[1].num);
#endif
r.num=jkqtp_yn(static_cast<int>(params[0].num), params[1].num);
return r;
}
JKQTPMathParser::jkmpResult fJn(JKQTPMathParser::jkmpResult* params, unsigned char n, JKQTPMathParser* p){
JKQTPMathParser::jkmpResult r;
r.type=JKQTPMathParser::jkmpDouble;
if (n!=2) p->jkmpError("jn accepts 2 argument");
if ((params[0].type!=JKQTPMathParser::jkmpDouble)||(params[1].type!=JKQTPMathParser::jkmpDouble)) p->jkmpError("jn needs double argument");
#if Q_CC_MSVC
r.num=_jn(static_cast<int>(params[0].num), params[1].num);
#else
r.num=jn(static_cast<int>(params[0].num), params[1].num);
#endif
return r;
}
JKQTPMathParser::jkmpResult fSRand(JKQTPMathParser::jkmpResult* params, unsigned char n, JKQTPMathParser* p){
JKQTPMathParser::jkmpResult r;
@ -700,12 +687,20 @@ void JKQTPMathParser::addStandardFunctions(){
addFunction("erfc", fErfc);
addFunction("lgamma", flGamma);
addFunction("tgamma", ftGamma);
#if defined(JKQtPlotter_HAS_j0) || defined(JKQtPlotter_HAS__j0)
addFunction("j0", fJ0);
addFunction("j1", fJ1);
#endif
#if defined(JKQtPlotter_HAS_jn) || defined(JKQtPlotter_HAS__jn)
addFunction("jn", fJn);
#endif
#if defined(JKQtPlotter_HAS_y0) || defined(JKQtPlotter_HAS__y0)
addFunction("y0", fY0);
addFunction("y1", fY1);
#endif
#if defined(JKQtPlotter_HAS_yn) || defined(JKQtPlotter_HAS__yn)
addFunction("yn", fYn);
#endif
addFunction("rand", fRand);
addFunction("srand", fSRand);
addFunction("ceil", fCeil);