X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Ffunction.pl;h=f08990d9fdd47b636a54835632a003943a1282c1;hp=6ebdada4080be3dba8bf6db65d0e68f469b1d6f9;hb=871695b656ffdc8336a8c00247dc14255bea7b8b;hpb=6b3768e8c544739ae53321539cb4d1e3112ded1b diff --git a/ginac/function.pl b/ginac/function.pl index 6ebdada4..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','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_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 +END_OF_DECLARE_FUNCTION_MACRO_NO_NAMESPACE $typedef_eval_funcp=generate( 'typedef ex (* eval_funcp_${N})(${SEQ1});'."\n", @@ -72,7 +82,7 @@ function::function(unsigned ser, ${SEQ1}) : exprseq(${SEQ2}), serial(ser) { debugmsg(\"function constructor from unsigned,${N}*ex\",LOGLEVEL_CONSTRUCT); - tinfo_key = TINFO_FUNCTION; + tinfo_key = TINFO_function; } END_OF_CONSTRUCTORS_IMPLEMENTATION @@ -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 @@ -119,29 +134,68 @@ END_OF_REGISTER_NEW_IMPLEMENTATION $interface=< #include -#include "config.h" -class function; +#ifdef __CINT__ +// CINT needs to work properly with +#include +#endif // def __CINT__ -#include "exprseq.h" +#include + +#ifndef NO_GINAC_NAMESPACE + +// the following lines have been generated for max. ${maxargs} parameters +$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 +$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=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; @@ -151,17 +205,34 @@ 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; + typedef ex (* eval_funcp)(); typedef ex (* evalf_funcp)(); typedef ex (* diff_funcp)(); @@ -188,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 @@ -253,31 +325,69 @@ 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; -#endif // ndef _FUNCTION_H_ +#ifndef NO_GINAC_NAMESPACE +} // namespace GiNaC +#endif // ndef NO_GINAC_NAMESPACE + +#endif // ndef __GINAC_FUNCTION_H__ END_OF_INTERFACE $implementation=< #include -#include "ginac.h" +#include "function.h" +#include "ex.h" +#include "utils.h" +#include "debugmsg.h" + +#ifndef NO_GINAC_NAMESPACE +namespace GiNaC { +#endif // ndef NO_GINAC_NAMESPACE ////////// // default constructor, destructor, copy constructor assignment operator and helpers @@ -288,7 +398,7 @@ $implementation=<(const_cast(other)); if (serial!=o.serial) { @@ -521,7 +632,7 @@ int function::compare_same_type(basic const & other) const bool function::is_equal_same_type(basic const & other) const { - ASSERT(is_of_type(other, function)); + GINAC_ASSERT(is_of_type(other, function)); function const & o=static_cast(const_cast(other)); if (serial!=o.serial) return false; @@ -558,7 +669,7 @@ unsigned function::return_type_tinfo(void) const ex function::pdiff(unsigned diff_param) const // partial differentiation { - ASSERT(serial