From a741b7430b3d0dfe083f29087611c7b26810b0f9 Mon Sep 17 00:00:00 2001 From: wolf Date: Wed, 10 May 2000 14:39:39 +0000 Subject: [PATCH] Since no-one else stepped up: remove QUIET_DESTRUCTOR, let Subscriptor hold a pointer to a type_info object rather than a string, since that would be much more expensive in terms of memory. git-svn-id: https://svn.dealii.org/trunk@2835 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/base/include/base/subscriptor.h | 59 +++++++++---------------- deal.II/base/source/subscriptor.cc | 37 +++++++++++----- 2 files changed, 45 insertions(+), 51 deletions(-) diff --git a/deal.II/base/include/base/subscriptor.h b/deal.II/base/include/base/subscriptor.h index 9728a01d3d..2a799718bc 100644 --- a/deal.II/base/include/base/subscriptor.h +++ b/deal.II/base/include/base/subscriptor.h @@ -14,14 +14,10 @@ #define __deal2__subscriptor_h -#ifndef __exceptions_H #include -#endif - -#ifndef QUIET_SUBSCRIPTOR #include -#include -#endif + + /** * Handling of subscriptions. @@ -43,19 +39,6 @@ class Subscriptor */ Subscriptor(); -#ifndef QUIET_SUBSCRIPTOR - /** - * Destructor, asserting that the counter - * is zero. - */ - virtual ~Subscriptor(); -#else - /** - * Destructor, asserting that the counter - * is zero. - */ - ~Subscriptor(); -#endif /** * Copy-constructor. * @@ -64,6 +47,12 @@ class Subscriptor * original object. */ Subscriptor(const Subscriptor&); + + /** + * Destructor, asserting that the counter + * is zero. + */ + virtual ~Subscriptor(); /** * Assignment operator. @@ -97,25 +86,15 @@ class Subscriptor */ unsigned int n_subscriptions () const; -#ifndef QUIET_SUBSCRIPTOR /** * Exception: * Object may not be deleted, since * it is used. */ DeclException2(ExcInUse, - int, string&, - << "Object of class " << arg2 << " is still used by " << arg1 << " other objects."); -#else - /** - * Exception: - * Object may not be deleted, since - * it is used. - */ - DeclException1(ExcInUse, - int, - << "This object is still used by " << arg1 << " other objects."); -#endif + int, char *, + << "Object of class " << arg2 + << " is still used by " << arg1 << " other objects."); /** * Exception: object should be used @@ -141,17 +120,19 @@ class Subscriptor * objects also. */ mutable unsigned int counter; -#ifndef QUIET_SUBSCRIPTOR + /** - * Storage for the class name. - * Since the name of the derived - * class is neither available in - * the destructor, nor in the + * Pointer to the typeinfo object + * of this object, from which we + * can later deduce the class + * name. Since this information + * on the derived class is + * neither available in the + * destructor, nor in the * constructor, we obtain it in * between and store it here. */ - mutable string classname; -#endif + mutable const type_info * object_info; }; diff --git a/deal.II/base/source/subscriptor.cc b/deal.II/base/source/subscriptor.cc index 46533df951..7ea95800f9 100644 --- a/deal.II/base/source/subscriptor.cc +++ b/deal.II/base/source/subscriptor.cc @@ -13,42 +13,55 @@ #include +#include + Subscriptor::Subscriptor () : - counter (0) + counter (0), + object_info (0) {}; Subscriptor::Subscriptor (const Subscriptor &) : - counter (0) + counter (0), + object_info (0) {}; Subscriptor::~Subscriptor () { -#ifndef QUIET_SUBSCRIPTOR - Assert (counter == 0, ExcInUse(counter, classname )); -#else - Assert (counter == 0, ExcInUse(counter)); -#endif + // check whether there are still + // subscriptions to this object. if + // so, output the actual name of + // the class to which this object + // belongs, i.e. the most derived + // class. note that the name may be + // mangled, so it need not be the + // clear-text class name. however, + // you can obtain the latter by + // running the c++filt program over + // the output. + Assert (counter == 0, ExcInUse(counter, object_info->name())); } -Subscriptor & Subscriptor::operator = (const Subscriptor &) + +Subscriptor & Subscriptor::operator = (const Subscriptor &s) { + object_info = s.object_info; return *this; }; + void Subscriptor::subscribe () const { #ifdef DEBUG -#ifndef QUIET_SUBSCRIPTOR - if(classname.size() == 0) - classname = string(typeid(*this).name()); -#endif + if (object_info == 0) + object_info = &typeid(*this); #endif + ++counter; }; -- 2.39.5