]> www.ginac.de Git - ginac.git/blobdiff - ginac/basic.h
implemented the case in pseries::derivative() where s!=var
[ginac.git] / ginac / basic.h
index 56369b824913805704d6be3700d72bf946a23a18..d7fef59385856882a370e4f8383e67700a784e63 100644 (file)
@@ -3,7 +3,7 @@
  *  Interface to GiNaC's ABC. */
 
 /*
- *  GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2002 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
@@ -23,9 +23,7 @@
 #ifndef __GINAC_BASIC_H__
 #define __GINAC_BASIC_H__
 
-#include <iostream>
 #include <vector>
-
 // CINT needs <algorithm> to work properly with <vector>
 #include <algorithm>
 
@@ -33,7 +31,6 @@
 #include "tinfos.h"
 #include "assertion.h"
 #include "registrar.h"
-/*#include "debugmsg.h"*/
 
 namespace GiNaC {
 
@@ -64,16 +61,12 @@ class basic
        
        friend class ex;
        
-       // default ctor, dtor, copy ctor assignment operator and helpers
+       // default ctor, dtor, copy ctor, assignment operator and helpers
 public:
-       basic() : tinfo_key(TINFO_basic), flags(0), refcount(0)
-       {
-               /* debugmsg("basic default ctor", LOGLEVEL_CONSTRUCT); */
-       }
+       basic() : tinfo_key(TINFO_basic), flags(0), refcount(0) {}
        /** basic dtor, virtual because class ex will delete objects via ptr. */
        virtual ~basic()
        {
-               /* debugmsg("basic dtor", LOGLEVEL_DESTRUCT); */
                destroy(false);
                GINAC_ASSERT((!(flags & status_flags::dynallocated))||(refcount==0));
        }
@@ -92,12 +85,7 @@ protected:
        
        // other ctors
        /** ctor with specified tinfo_key */
-       basic(unsigned ti) : tinfo_key(ti), flags(0), refcount(0)
-       {
-               /* debugmsg("basic ctor with tinfo_key", LOGLEVEL_CONSTRUCT); */
-       }
-       // functions overriding virtual functions from bases classes
-       // none
+       basic(unsigned ti) : tinfo_key(ti), flags(0), refcount(0) {}
        
        // new virtual functions which can be overridden by derived classes
 public: // only const functions please (may break reference counting)
@@ -177,26 +165,11 @@ private:
 
 extern int max_recursion_level;
 
-// Obsolete convenience macros.  To be phased out soon!
-// Use the inlined template functions below instead of these macros.
-
-#define is_of_type(OBJ,TYPE) \
-       (dynamic_cast<const TYPE *>(&OBJ)!=0)
-
-#define is_exactly_of_type(OBJ,TYPE) \
-       ((OBJ).tinfo()==GiNaC::TINFO_##TYPE)
-
-#define is_ex_of_type(OBJ,TYPE) \
-       (dynamic_cast<const TYPE *>((OBJ).bp)!=0)
-
-#define is_ex_exactly_of_type(OBJ,TYPE) \
-       ((*(OBJ).bp).tinfo()==GiNaC::TINFO_##TYPE)
-
 // convenience type checker template functions
 
 /** Check if obj is a T, including base classes. */
 template <class T>
-inline bool is_a(const basic & obj)
+inline bool is_a(const basic &obj)
 {
        return dynamic_cast<const T *>(&obj)!=0;
 }
@@ -205,28 +178,29 @@ inline bool is_a(const basic & obj)
  *  inefficient default.  It should in all time-critical cases be overridden
  *  by template specializations that don't create a temporary. */
 template <class T>
-inline bool is_exactly_a(const class basic & obj)
+inline bool is_exactly_a(const class basic &obj)
 {
        const T foo; return foo.tinfo()==obj.tinfo();
 }
 
 /** Check if ex is a handle to a T, including base classes. */
 template <class T>
-inline bool is_a(const ex & obj)
+inline bool is_a(const ex &obj)
 {
        return is_a<T>(*obj.bp);
 }
 
 /** Check if ex is a handle to a T, not including base classes. */
 template <class T>
-inline bool is_exactly_a(const ex & obj)
+inline bool is_exactly_a(const ex &obj)
 {
        return is_exactly_a<T>(*obj.bp);
 }
 
 /** Return a reference to the basic-derived class T object embedded in an
  *  expression.  This is fast but unsafe: the result is undefined if the
- *  expression does not contain a T object at its top level.
+ *  expression does not contain a T object at its top level.  Hence, you
+ *  should generally check the type of e first.
  *
  *  @param e expression
  *  @return reference to pseries object
@@ -234,6 +208,7 @@ inline bool is_exactly_a(const ex & obj)
 template <class T>
 inline const T &ex_to(const ex &e)
 {
+       GINAC_ASSERT(is_a<T>(e));
        return static_cast<const T &>(*e.bp);
 }