Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/src/libraries/core/object/Destroyable.cc @ 10460

Last change on this file since 10460 was 10419, checked in by landauf, 9 years ago

added destroyLater() to Destroyable. This will destroy the object (like destroy()) but not until the current tick has ended.

  • Property svn:eol-style set to native
File size: 2.8 KB
RevLine 
[1505]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
[2171]30    @file
[9570]31    @brief Implementation of Destroyable.
[1505]32*/
33
[9570]34#include "Destroyable.h"
[10419]35#include "DestroyLaterManager.h"
[3196]36
[6105]37#include <cassert>
[1505]38
39namespace orxonox
40{
[7401]41    /**
42        @brief Constructor: Sets the default values.
43    */
[9570]44    Destroyable::Destroyable()
[1505]45    {
[5929]46        this->referenceCount_ = 0;
47        this->requestedDestruction_ = false;
[1505]48    }
49
[7401]50    /**
[9565]51        @brief Destructor: Notifies all DestructionListener (for example @ref WeakPtr "weak pointers") that this object is being deleted.
[7401]52    */
[9570]53    Destroyable::~Destroyable()
[1505]54    {
[5929]55        assert(this->referenceCount_ <= 0);
56
[7849]57        // notify all destruction listeners
58        for (std::set<DestructionListener*>::iterator it = this->destructionListeners_.begin(); it != this->destructionListeners_.end(); )
[5929]59            (*(it++))->objectDeleted();
[1505]60    }
61
[7401]62    /**
63        @brief Deletes the object if no @ref orxonox::SmartPtr "smart pointers" point to this object. Otherwise schedules the object to be deleted as soon as possible.
[9944]64        Always call destroy() instead of using 'delete' directly, otherwise smart pointers won't work.
[7401]65    */
[9570]66    void Destroyable::destroy()
[5929]67    {
[6105]68        assert(this); // Just in case someone tries to delete a NULL pointer
[5929]69        this->requestedDestruction_ = true;
70        if (this->referenceCount_ == 0)
[6417]71        {
72            this->preDestroy();
73            if (this->referenceCount_ == 0)
74                delete this;
75        }
[5929]76    }
[10419]77
78    /**
79     * Works like @ref destroy() but doesn't destroy the object until the current tick has ended.
80     */
81    void Destroyable::destroyLater()
82    {
83        // register in DestroyLaterManager - this ensures that a smartPtr points to this object and keeps it alive for a while
84        DestroyLaterManager::getInstance().retain(this);
85
86        // request destruction -> object will be deleted after all smartPtrs (including the one in DestroyLaterManager) were destroyed.
87        this->destroy();
88    }
[1505]89}
Note: See TracBrowser for help on using the repository browser.