X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Futils.h;h=e93f9b505314177c3ac2792e64f0aa11bc45e18c;hp=0af6707afbb85c4a911d7404c58a0f4426e23dc4;hb=29b420743599f001b8bfc8b63fb6ac81aa3dfba7;hpb=68fdf425abf14d016d5f95ee7b9d06a19a3c5926 diff --git a/ginac/utils.h b/ginac/utils.h index 0af6707a..e93f9b50 100644 --- a/ginac/utils.h +++ b/ginac/utils.h @@ -4,7 +4,7 @@ * of any interest to the user of the library. */ /* - * GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2006 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 @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __GINAC_UTILS_H__ @@ -38,10 +38,12 @@ namespace GiNaC { class dunno {}; // some compilers (e.g. cygwin) define a macro log2, causing confusion -#ifndef log2 -unsigned log2(unsigned n); +#ifdef log2 +#undef log2 #endif +unsigned log2(unsigned n); + /** Compare two pointers (just to establish some sort of canonical order). * @return -1, 0, or 1 */ template @@ -62,8 +64,18 @@ inline unsigned rotate_left(unsigned n) return (n & 0x80000000U) ? (n << 1 | 0x00000001U) : (n << 1); } +#if SIZEOF_VOID_P == SIZEOF_INT +typedef unsigned int p_int; +#elif SIZEOF_VOID_P == SIZEOF_LONG +typedef unsigned long p_int; +#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG +typedef unsigned long long p_int; +#else +typedef unsigned long p_int; +#endif + /** Truncated multiplication with golden ratio, for computing hash values. */ -inline unsigned golden_ratio_hash(unsigned n) +inline unsigned golden_ratio_hash(p_int n) { // This function works much better when fast arithmetic with at // least 64 significant bits is available. @@ -286,159 +298,110 @@ again: class ex; extern const numeric *_num_120_p; -extern const numeric &_num_120; extern const ex _ex_120; extern const numeric *_num_60_p; -extern const numeric &_num_60; extern const ex _ex_60; extern const numeric *_num_48_p; -extern const numeric &_num_48; extern const ex _ex_48; extern const numeric *_num_30_p; -extern const numeric &_num_30; extern const ex _ex_30; extern const numeric *_num_25_p; -extern const numeric &_num_25; extern const ex _ex_25; extern const numeric *_num_24_p; -extern const numeric &_num_24; extern const ex _ex_24; extern const numeric *_num_20_p; -extern const numeric &_num_20; extern const ex _ex_20; extern const numeric *_num_18_p; -extern const numeric &_num_18; extern const ex _ex_18; extern const numeric *_num_15_p; -extern const numeric &_num_15; extern const ex _ex_15; extern const numeric *_num_12_p; -extern const numeric &_num_12; extern const ex _ex_12; extern const numeric *_num_11_p; -extern const numeric &_num_11; extern const ex _ex_11; extern const numeric *_num_10_p; -extern const numeric &_num_10; extern const ex _ex_10; extern const numeric *_num_9_p; -extern const numeric &_num_9; extern const ex _ex_9; extern const numeric *_num_8_p; -extern const numeric &_num_8; extern const ex _ex_8; extern const numeric *_num_7_p; -extern const numeric &_num_7; extern const ex _ex_7; extern const numeric *_num_6_p; -extern const numeric &_num_6; extern const ex _ex_6; extern const numeric *_num_5_p; -extern const numeric &_num_5; extern const ex _ex_5; extern const numeric *_num_4_p; -extern const numeric &_num_4; extern const ex _ex_4; extern const numeric *_num_3_p; -extern const numeric &_num_3; extern const ex _ex_3; extern const numeric *_num_2_p; -extern const numeric &_num_2; extern const ex _ex_2; extern const numeric *_num_1_p; -extern const numeric &_num_1; extern const ex _ex_1; extern const numeric *_num_1_2_p; -extern const numeric &_num_1_2; extern const ex _ex_1_2; extern const numeric *_num_1_3_p; -extern const numeric &_num_1_3; extern const ex _ex_1_3; extern const numeric *_num_1_4_p; -extern const numeric &_num_1_4; extern const ex _ex_1_4; extern const numeric *_num0_p; extern const basic *_num0_bp; -extern const numeric &_num0; extern const ex _ex0; extern const numeric *_num1_4_p; -extern const numeric &_num1_4; extern const ex _ex1_4; extern const numeric *_num1_3_p; -extern const numeric &_num1_3; extern const ex _ex1_3; extern const numeric *_num1_2_p; -extern const numeric &_num1_2; extern const ex _ex1_2; extern const numeric *_num1_p; -extern const numeric &_num1; extern const ex _ex1; extern const numeric *_num2_p; -extern const numeric &_num2; extern const ex _ex2; extern const numeric *_num3_p; -extern const numeric &_num3; extern const ex _ex3; extern const numeric *_num4_p; -extern const numeric &_num4; extern const ex _ex4; extern const numeric *_num5_p; -extern const numeric &_num5; extern const ex _ex5; extern const numeric *_num6_p; -extern const numeric &_num6; extern const ex _ex6; extern const numeric *_num7_p; -extern const numeric &_num7; extern const ex _ex7; extern const numeric *_num8_p; -extern const numeric &_num8; extern const ex _ex8; extern const numeric *_num9_p; -extern const numeric &_num9; extern const ex _ex9; extern const numeric *_num10_p; -extern const numeric &_num10; extern const ex _ex10; extern const numeric *_num11_p; -extern const numeric &_num11; extern const ex _ex11; extern const numeric *_num12_p; -extern const numeric &_num12; extern const ex _ex12; extern const numeric *_num15_p; -extern const numeric &_num15; extern const ex _ex15; extern const numeric *_num18_p; -extern const numeric &_num18; extern const ex _ex18; extern const numeric *_num20_p; -extern const numeric &_num20; extern const ex _ex20; extern const numeric *_num24_p; -extern const numeric &_num24; extern const ex _ex24; extern const numeric *_num25_p; -extern const numeric &_num25; extern const ex _ex25; extern const numeric *_num30_p; -extern const numeric &_num30; extern const ex _ex30; extern const numeric *_num48_p; -extern const numeric &_num48; extern const ex _ex48; extern const numeric *_num60_p; -extern const numeric &_num60; extern const ex _ex60; extern const numeric *_num120_p; -extern const numeric &_num120; extern const ex _ex120; // Helper macros for class implementations (mostly useful for trivial classes) #define DEFAULT_CTOR(classname) \ -classname::classname() : inherited(TINFO_##classname) {} +classname::classname() : inherited(&classname::tinfo_static) { setflag(status_flags::evaluated | status_flags::expanded); } #define DEFAULT_UNARCHIVE(classname) \ ex classname::unarchive(const archive_node &n, lst &sym_lst) \ @@ -462,23 +425,16 @@ int classname::compare_same_type(const basic & other) const \ } #define DEFAULT_PRINT(classname, text) \ -void classname::print(const print_context & c, unsigned level) const \ +void classname::do_print(const print_context & c, unsigned level) const \ { \ - if (is_a(c)) \ - inherited::print(c, level); \ - else \ - c.s << text; \ + c.s << text; \ } #define DEFAULT_PRINT_LATEX(classname, text, latex) \ -void classname::print(const print_context & c, unsigned level) const \ +DEFAULT_PRINT(classname, text) \ +void classname::do_print_latex(const print_latex & c, unsigned level) const \ { \ - if (is_a(c)) \ - inherited::print(c, level); \ - else if (is_a(c)) \ - c.s << latex; \ - else \ - c.s << text; \ + c.s << latex; \ } } // namespace GiNaC