bool automatic_typecheck=true;
#define TYPECHECK(VAR,TYPE) \\
-if (!is_ex_exactly_of_type(VAR,TYPE)) { \\
+if (!is_exactly_a<TYPE>(VAR)) { \\
automatic_typecheck=false; \\
} else
};
// utility functions/macros
+/** Return the object of type function handled by an ex.
+ * This is unsafe: you need to check the type first. */
inline const function &ex_to_function(const ex &e)
{
return static_cast<const function &>(*e.bp);
}
+/** Specialization of is_exactly_a<function>(obj) for objects of type function. */
+template<> inline bool is_exactly_a<function>(const basic & obj)
+{
+ return obj.tinfo()==TINFO_function;
+}
+
#define is_ex_the_function(OBJ, FUNCNAME) \\
(is_ex_exactly_of_type(OBJ, function) && static_cast<GiNaC::function *>(OBJ.bp)->get_serial() == function_index_##FUNCNAME)