Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members | Related Pages | Examples

vos/corelibs/vos/refcount.cc

Go to the documentation of this file.
00001 /*
00002     This file is part of the Virtual Object System of
00003     the Interreality project (http://interreality.org).
00004 
00005     Copyright (C) 2001, 2002 Peter Amstutz
00006 
00007     This library is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU Lesser General Public
00009     License as published by the Free Software Foundation; either
00010     version 2 of the License, or (at your option) any later version.
00011 
00012     This library is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     Lesser General Public License for more details.
00016 
00017     You should have received a copy of the GNU Lesser General Public
00018     License along with this library; if not, write to the Free Software
00019     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
00020 
00021     Peter Amstutz <tetron@interreality.org>
00022 */
00023 #include <stdexcept>
00024 
00025 #include "refcount.hh"
00026 #include "log.hh"
00027 
00028 using namespace VOS;
00029 
00030 void RefCounted::acquire() { ++count; }
00031 void RefCounted::release() { if(--count == 0) destroy(); }
00032 int RefCounted::getCount() { return count; }
00033 
00034 void RefCounted::destroy() {
00035     delete this;
00036 }
00037 
00038 void RefCounted::addExciseListener(ObjectExciseListener* oel) {
00039     if(! exciseListeners) exciseListeners = new set<ObjectExciseListener*>;
00040     if(RefCounted* rc = dynamic_cast<RefCounted*>(oel)) rc->acquire(); // released by: removeExciseListener
00041     exciseListeners->insert(oel);
00042 }
00043 
00044 void RefCounted::removeExciseListener(ObjectExciseListener* oel, bool releaseIfRefcounted) {
00045     if(oel) {
00046         if(exciseListeners) {
00047             exciseListeners->erase(oel);
00048             if(releaseIfRefcounted)
00049                 if(RefCounted* rc = dynamic_cast<RefCounted*>(oel)) {
00050                     rc->release(); // acquired by: addExciseListener
00051                 }
00052         }
00053     }
00054 }
00055 
00056 void RefCounted::excise() {
00057     if(exciseListeners) {
00058         // copying the set avoids concurrent modifications of the set
00059         // which tend to crash things
00060         set<ObjectExciseListener*> setcopy = *exciseListeners;
00061         for(set<ObjectExciseListener*>::iterator it = setcopy.begin();
00062             it != setcopy.end();
00063             it++) {
00064             try {
00065                 if(*it) (*it)->notifyObjectExcise(this);
00066             } catch(exception& x) {
00067                 LOG("refcount", 0, "call to notifyObjectExcise emitted exception: " << x.what());
00068             } catch(...) { }
00069         }
00070         delete exciseListeners;
00071         exciseListeners = 0;
00072     }
00073 }

Generated on Tue Aug 12 03:55:41 2003 for Interreality Project - VOS by doxygen 1.3.2