* Please do not modify it directly, edit the perl script instead!
* function.pl options: \$maxargs=${maxargs}
*
- * GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
public:
void print(const print_context & c, unsigned level = 0) const;
unsigned precedence(void) const {return 70;}
- int degree(const ex & s) const;
- int ldegree(const ex & s) const;
- ex coeff(const ex & s, int n = 1) const;
ex expand(unsigned options=0) const;
ex eval(int level=0) const;
ex evalf(int level=0) const;
}
#define is_ex_the_function(OBJ, FUNCNAME) \\
- (is_exactly_a<GiNaC::function>(OBJ) && ex_to<GiNaC::function>(OBJ).get_serial() == function_index_##FUNCNAME)
+ (GiNaC::is_exactly_a<GiNaC::function>(OBJ) && GiNaC::ex_to<GiNaC::function>(OBJ).get_serial() == function_index_##FUNCNAME)
} // namespace GiNaC
* Please do not modify it directly, edit the perl script instead!
* function.pl options: \$maxargs=${maxargs}
*
- * GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
return *this;
}
-
function_options & function_options::set_return_type(unsigned rt, unsigned rtt)
{
use_return_type = true;
return (options == 0) ? setflag(status_flags::expanded) : *this;
}
-int function::degree(const ex & s) const
-{
- return is_equal(ex_to<basic>(s)) ? 1 : 0;
-}
-
-int function::ldegree(const ex & s) const
-{
- return is_equal(ex_to<basic>(s)) ? 1 : 0;
-}
-
-ex function::coeff(const ex & s, int n) const
-{
- if (is_equal(ex_to<basic>(s)))
- return n==1 ? _ex1 : _ex0;
- else
- return n==0 ? ex(*this) : _ex0;
-}
-
ex function::eval(int level) const
{
GINAC_ASSERT(serial<registered_functions().size());
unsigned function::return_type(void) const
{
- if (seq.empty())
- return return_types::commutative;
- else
- return seq.begin()->return_type();
+ const function_options &opt = registered_functions()[serial];
+
+ if (opt.use_return_type) {
+ // Return type was explicitly specified
+ return opt.return_type;
+ } else {
+ // Default behavior is to use the return type of the first
+ // argument. Thus, exp() of a matrix behaves like a matrix, etc.
+ if (seq.empty())
+ return return_types::commutative;
+ else
+ return seq.begin()->return_type();
+ }
}
unsigned function::return_type_tinfo(void) const
{
- if (seq.empty())
- return tinfo_key;
- else
- return seq.begin()->return_type_tinfo();
+ const function_options &opt = registered_functions()[serial];
+
+ if (opt.use_return_type) {
+ // Return type was explicitly specified
+ return opt.return_type_tinfo;
+ } else {
+ // Default behavior is to use the return type of the first
+ // argument. Thus, exp() of a matrix behaves like a matrix, etc.
+ if (seq.empty())
+ return tinfo_key;
+ else
+ return seq.begin()->return_type_tinfo();
+ }
}
//////////