X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Ffunction.pl;h=f08990d9fdd47b636a54835632a003943a1282c1;hp=06bf2d674c3c92d6aa4b615ad92b2b7ecf49f0cd;hb=871695b656ffdc8336a8c00247dc14255bea7b8b;hpb=24fe247f9ed16114a765a01c593fec5c4a2f591c diff --git a/ginac/function.pl b/ginac/function.pl index 06bf2d67..f08990d9 100755 --- a/ginac/function.pl +++ b/ginac/function.pl @@ -31,15 +31,25 @@ sub generate { return $res; } -$declare_function_macro=generate( - <<'END_OF_DECLARE_FUNCTION_MACRO','GiNaC::ex const & p${N}','p${N}'); +$declare_function_macro_namespace=generate( + <<'END_OF_DECLARE_FUNCTION_MACRO_NAMESPACE','GiNaC::ex const & p${N}','p${N}'); #define DECLARE_FUNCTION_${N}P(NAME) \\ -extern unsigned function_index_##NAME; \\ +extern const unsigned function_index_##NAME; \\ inline GiNaC::function NAME(${SEQ1}) { \\ return GiNaC::function(function_index_##NAME, ${SEQ2}); \\ } -END_OF_DECLARE_FUNCTION_MACRO +END_OF_DECLARE_FUNCTION_MACRO_NAMESPACE + +$declare_function_macro_no_namespace=generate( + <<'END_OF_DECLARE_FUNCTION_MACRO_NO_NAMESPACE','ex const & p${N}','p${N}'); +#define DECLARE_FUNCTION_${N}P(NAME) \\ +extern const unsigned function_index_##NAME; \\ +inline function NAME(${SEQ1}) { \\ + return function(function_index_##NAME, ${SEQ2}); \\ +} + +END_OF_DECLARE_FUNCTION_MACRO_NO_NAMESPACE $typedef_eval_funcp=generate( 'typedef ex (* eval_funcp_${N})(${SEQ1});'."\n", @@ -100,7 +110,12 @@ END_OF_DIFF_SWITCH_STATEMENT $series_switch_statement=generate( <<'END_OF_SERIES_SWITCH_STATEMENT','seq[${N}-1]',''); case ${N}: - return ((series_funcp_${N})(registered_functions()[serial].s))(${SEQ1},s,point,order); + try { + res = ((series_funcp_${N})(registered_functions()[serial].s))(${SEQ1},s,point,order); + } catch (do_taylor) { + res = basic::series(s, point, order); + } + return res; break; END_OF_SERIES_SWITCH_STATEMENT @@ -126,7 +141,7 @@ $interface=< #include + +#ifdef __CINT__ +// CINT needs to work properly with +#include +#endif // def __CINT__ + #include +#ifndef NO_GINAC_NAMESPACE + // the following lines have been generated for max. ${maxargs} parameters -$declare_function_macro +$declare_function_macro_namespace // end of generated lines +#else // ndef NO_GINAC_NAMESPACE + +// the following lines have been generated for max. ${maxargs} parameters +$declare_function_macro_no_namespace +// end of generated lines + +#endif // ndef NO_GINAC_NAMESPACE + +#ifndef NO_GINAC_NAMESPACE + +#define REGISTER_FUNCTION(NAME,E,EF,D,S) \\ +const unsigned function_index_##NAME=GiNaC::function::register_new(#NAME,E,EF,D,S); + +#else // ndef NO_GINAC_NAMESPACE + #define REGISTER_FUNCTION(NAME,E,EF,D,S) \\ -unsigned function_index_##NAME=GiNaC::function::register_new(#NAME,E,EF,D,S); +const unsigned function_index_##NAME=function::register_new(#NAME,E,EF,D,S); + +#endif // ndef NO_GINAC_NAMESPACE #define BEGIN_TYPECHECK \\ bool automatic_typecheck=true; @@ -165,18 +205,31 @@ if (!is_ex_exactly_of_type(VAR,TYPE)) { \\ automatic_typecheck=false; \\ } else +#ifndef NO_GINAC_NAMESPACE + #define TYPECHECK_INTEGER(VAR) \\ if (!(VAR).info(GiNaC::info_flags::integer)) { \\ automatic_typecheck=false; \\ } else +#else // ndef NO_GINAC_NAMESPACE + +#define TYPECHECK_INTEGER(VAR) \\ +if (!(VAR).info(info_flags::integer)) { \\ + automatic_typecheck=false; \\ +} else + +#endif // ndef NO_GINAC_NAMESPACE + #define END_TYPECHECK(RV) \\ {} \\ if (!automatic_typecheck) { \\ return RV.hold(); \\ } +#ifndef NO_GINAC_NAMESPACE namespace GiNaC { +#endif // ndef NO_GINAC_NAMESPACE class function; @@ -206,6 +259,7 @@ struct registered_function_info { and user defined functions */ class function : public exprseq { + // CINT has a linking problem friend void ginsh_get_ginac_functions(void); // member functions @@ -271,15 +325,26 @@ protected: // utility macros +#ifndef NO_GINAC_NAMESPACE + #define is_ex_the_function(OBJ, FUNCNAME) \\ (is_ex_exactly_of_type(OBJ, function) && static_cast(OBJ.bp)->getserial() == function_index_##FUNCNAME) +#else // ndef NO_GINAC_NAMESPACE + +#define is_ex_the_function(OBJ, FUNCNAME) \\ + (is_ex_exactly_of_type(OBJ, function) && static_cast(OBJ.bp)->getserial() == function_index_##FUNCNAME) + +#endif // ndef NO_GINAC_NAMESPACE + // global constants extern const function some_function; extern type_info const & typeid_function; +#ifndef NO_GINAC_NAMESPACE } // namespace GiNaC +#endif // ndef NO_GINAC_NAMESPACE #endif // ndef __GINAC_FUNCTION_H__ @@ -295,7 +360,7 @@ $implementation=<