]> www.ginac.de Git - ginac.git/blobdiff - ginac/ex.h
Improved the comments explaining what the class ex does.
[ginac.git] / ginac / ex.h
index c23336ba5fdb56b56df9400068622dc614cbec9c..574e6800774b4b0304f556ffe5ea03426951f890 100644 (file)
@@ -52,6 +52,12 @@ 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;
@@ -59,10 +65,11 @@ class const_preorder_iterator;
 class const_postorder_iterator;
 
 
-/** Lightweight wrapper for GiNaC's symbolic objects.  Basically all it does is
- *  to hold a pointer to the other objects, manage the reference counting and
- *  provide methods for manipulation of these objects.  (Some people call such
- *  a thing a proxy class.) */
+/** Lightweight wrapper for GiNaC's symbolic objects.  It holds a pointer to
+ *  the other object in order to do garbage collection by the method of
+ *  reference counting.  I.e., it is a smart pointer.  Also, the constructor
+ *  ex::ex(const basic & other) calls the methods that do automatic
+ *  evaluation.  E.g., x-x turns automatically into 0. */
 class ex {
        friend class archive_node;
        friend inline bool are_ex_trivially_equal(const ex &, const ex &);
@@ -134,8 +141,10 @@ public:
        ex lhs() const;
        ex rhs() const;
 
-       // complex conjugation
+       // function for complex expressions
        ex conjugate() const { return bp->conjugate(); }
+       ex real_part() const { return bp->real_part(); }
+       ex imag_part() const { return bp->imag_part(); }
 
        // pattern matching
        bool has(const ex & pattern, unsigned options = 0) const { return bp->has(pattern, options); }
@@ -203,6 +212,7 @@ public:
        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_matrix() const;
        
        // symmetry
        ex symmetrize() const;
@@ -675,6 +685,10 @@ struct ex_swap : public std::binary_function<ex, ex, void> {
        void operator() (ex &lh, ex &rh) const { lh.swap(rh); }
 };
 
+// Make it possible to print exvectors and exmaps
+std::ostream & operator<<(std::ostream & os, const exvector & e);
+std::ostream & operator<<(std::ostream & os, const exmap & e);
+
 // wrapper functions around member functions
 inline size_t nops(const ex & thisex)
 { return thisex.nops(); }
@@ -685,6 +699,12 @@ inline ex expand(const ex & thisex, unsigned options = 0)
 inline ex conjugate(const ex & thisex)
 { return thisex.conjugate(); }
 
+inline ex real_part(const ex & thisex)
+{ return thisex.real_part(); }
+
+inline ex imag_part(const ex & thisex)
+{ return thisex.imag_part(); }
+
 inline bool has(const ex & thisex, const ex & pattern, unsigned options = 0)
 { return thisex.has(pattern, options); }
 
@@ -847,6 +867,52 @@ public:
        ex operator()(const ex & e) { return ptr(e, arg1, arg2, arg3); }
 };
 
+template<class C>
+class pointer_to_member_to_map_function : public map_function {
+protected:
+       ex (C::*ptr)(const ex &);
+       C &c;
+public:
+       explicit pointer_to_member_to_map_function(ex (C::*member)(const ex &), C &obj) : ptr(member), c(obj) {}
+       ex operator()(const ex & e) { return (c.*ptr)(e); }
+};
+
+template<class C, class T1>
+class pointer_to_member_to_map_function_1arg : public map_function {
+protected:
+       ex (C::*ptr)(const ex &, T1);
+       C &c;
+       T1 arg1;
+public:
+       explicit pointer_to_member_to_map_function_1arg(ex (C::*member)(const ex &, T1), C &obj, T1 a1) : ptr(member), c(obj), arg1(a1) {}
+       ex operator()(const ex & e) { return (c.*ptr)(e, arg1); }
+};
+
+template<class C, class T1, class T2>
+class pointer_to_member_to_map_function_2args : public map_function {
+protected:
+       ex (C::*ptr)(const ex &, T1, T2);
+       C &c;
+       T1 arg1;
+       T2 arg2;
+public:
+       explicit pointer_to_member_to_map_function_2args(ex (C::*member)(const ex&, T1, T2), C &obj, T1 a1, T2 a2) : ptr(member), c(obj), arg1(a1), arg2(a2) {}
+       ex operator()(const ex & e) { return (c.*ptr)(e, arg1, arg2); }
+};
+
+template<class C, class T1, class T2, class T3>
+class pointer_to_member_to_map_function_3args : public map_function {
+protected:
+       ex (C::*ptr)(const ex &, T1, T2, T3);
+       C &c;
+       T1 arg1;
+       T2 arg2;
+       T3 arg3;
+public:
+       explicit pointer_to_member_to_map_function_3args(ex (C::*member)(const ex &, T1, T2, T3), C &obj, T1 a1, T2 a2, T3 a3) : ptr(member), c(obj), arg1(a1), arg2(a2), arg3(a3) {}
+       ex operator()(const ex & e) { return (c.*ptr)(e, arg1, arg2, arg3); }
+};
+
 inline ex ex::map(ex f(const ex &)) const
 {
        pointer_to_map_function fcn(f);