X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fex.h;h=f5008a0f6edd2d2121d61f6efd0f12d4570bfaa4;hb=52c44ffaee28a70b6df3280c3354ee4241473b14;hp=574e6800774b4b0304f556ffe5ea03426951f890;hpb=f8cd4812fd1a238d85c183ac7c01a2ee9e7fd00b;p=ginac.git diff --git a/ginac/ex.h b/ginac/ex.h index 574e6800..f5008a0f 100644 --- a/ginac/ex.h +++ b/ginac/ex.h @@ -3,7 +3,7 @@ * Interface to GiNaC's light-weight expression handles. */ /* - * GiNaC Copyright (C) 1999-2006 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2011 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 @@ -20,19 +20,23 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __GINAC_EX_H__ -#define __GINAC_EX_H__ +#ifndef GINAC_EX_H +#define GINAC_EX_H +#include "basic.h" +#include "ptr.h" + +#include #include #include -#include #include -#include "basic.h" -#include "ptr.h" - namespace GiNaC { - +#ifdef _MSC_VER + // MSVC produces a different symbol for _ex0 when it is declared inside + // ex::is_zero() than when it is declared at top level as follows + extern const ex _ex0; +#endif /** Helper class to initialize the library. There must be one static object * of this class in every object file that makes use of our flyweights in @@ -43,6 +47,7 @@ namespace GiNaC { * * @see utils.cpp */ class library_init { + static void init_unarchivers(); public: library_init(); ~library_init(); @@ -52,13 +57,6 @@ private: /** For construction of flyweights, etc. */ static library_init library_initializer; -/** Rotate bits of unsigned value by one bit to the left. - * This can be necesary if the user wants to define its own hashes. */ -inline unsigned rotate_left(unsigned n) -{ - return (n & 0x80000000U) ? (n << 1 | 0x00000001U) : (n << 1); -} - class scalar_products; class const_iterator; class const_preorder_iterator; @@ -148,9 +146,9 @@ public: // pattern matching bool has(const ex & pattern, unsigned options = 0) const { return bp->has(pattern, options); } - bool find(const ex & pattern, lst & found) const; + bool find(const ex & pattern, exset& found) const; bool match(const ex & pattern) const; - bool match(const ex & pattern, lst & repl_lst) const { return bp->match(pattern, repl_lst); } + bool match(const ex & pattern, exmap & repls) const { return bp->match(pattern, repls); } // substitutions ex subs(const exmap & m, unsigned options = 0) const; @@ -211,7 +209,12 @@ public: // comparison int compare(const ex & other) const; bool is_equal(const ex & other) const; - bool is_zero() const { extern const ex _ex0; return is_equal(_ex0); } + bool is_zero() const { +#ifndef _MSC_VER + extern const ex _ex0; +#endif + return is_equal(_ex0); + } bool is_zero_matrix() const; // symmetry @@ -224,7 +227,7 @@ public: // noncommutativity unsigned return_type() const { return bp->return_type(); } - tinfo_t return_type_tinfo() const { return bp->return_type_tinfo(); } + return_type_t return_type_tinfo() const { return bp->return_type_tinfo(); } unsigned gethash() const { return bp->gethash(); } @@ -687,6 +690,7 @@ struct ex_swap : public std::binary_function { // Make it possible to print exvectors and exmaps std::ostream & operator<<(std::ostream & os, const exvector & e); +std::ostream & operator<<(std::ostream & os, const exset & e); std::ostream & operator<<(std::ostream & os, const exmap & e); // wrapper functions around member functions @@ -708,7 +712,7 @@ inline ex imag_part(const ex & thisex) inline bool has(const ex & thisex, const ex & pattern, unsigned options = 0) { return thisex.has(pattern, options); } -inline bool find(const ex & thisex, const ex & pattern, lst & found) +inline bool find(const ex & thisex, const ex & pattern, exset& found) { return thisex.find(pattern, found); } inline bool is_polynomial(const ex & thisex, const ex & vars) @@ -768,7 +772,7 @@ inline ex diff(const ex & thisex, const symbol & s, unsigned nth = 1) inline ex series(const ex & thisex, const ex & r, int order, unsigned options = 0) { return thisex.series(r, order, options); } -inline bool match(const ex & thisex, const ex & pattern, lst & repl_lst) +inline bool match(const ex & thisex, const ex & pattern, exmap& repl_lst) { return thisex.match(pattern, repl_lst); } inline ex simplify_indexed(const ex & thisex, unsigned options = 0) @@ -981,4 +985,4 @@ inline void iter_swap(list::iterator i1, list::iterator i2 } // namespace std -#endif // ndef __GINAC_EX_H__ +#endif // ndef GINAC_EX_H