Object.h.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:4k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  *  OpenKore C++ Standard Library
  3.  *  Copyright (C) 2006  VCL
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Lesser General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Lesser General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Lesser General Public
  16.  *  License along with this library; if not, write to the Free Software
  17.  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18.  *  MA  02110-1301  USA
  19.  */
  20. #ifndef _OSL_OBJECT_H_
  21. #define _OSL_OBJECT_H_
  22. namespace OSL {
  23. /**
  24.  * An object class, which is the parent class of nearly all classes
  25.  * in the OpenKore Standard Library.
  26.  *
  27.  * This object class provides thread-safe reference counting abilities.
  28.  * Reference counting is very useful if two classes reference the same
  29.  * Object, but the Object should only be destroyed if both referer classes
  30.  * are destroyed. (But see also Pointer for an alternative approach, using
  31.  * smart pointers.)
  32.  *
  33.  * Reference counting example:
  34.  * @code
  35.  * class Foo {
  36.  * private:
  37.  *     Object *o;
  38.  * public:
  39.  *     Foo(Object *o) {
  40.  *         this->o = o;
  41.  *         // Increase the reference count since
  42.  *         // we're holding a reference to o.
  43.  *         o->ref();
  44.  *     }
  45.  *
  46.  *     ~Foo() {
  47.  *         o->unref();
  48.  *     }
  49.  * };
  50.  *
  51.  * void some_function() {
  52.  *     Object *o = new Object();
  53.  *     // o's reference count is now 1.
  54.  *
  55.  *     Foo *foo = new Foo(o);  // o's reference count is now 2.
  56.  *     Foo *bar = new Foo(o);  // o's reference count is now 3.
  57.  *
  58.  *     // We only want to pass o to the two Foo instances,
  59.  *     // we don't do anything else with o. So we lower o's
  60.  *     // reference count. It won't be deleted now because
  61.  *     // both Foo instances have increased o's reference
  62.  *     // count.
  63.  *     o->unref();
  64.  *     // o's reference count is now 2.
  65.  *
  66.  *     delete foo;   // o's reference count is now 1.
  67.  *     delete bar;   // o's reference count is now 0.
  68.  *     // now o is deleted.
  69.  * }
  70.  * @endcode
  71.  *
  72.  * @class Object OSL/Object.h
  73.  * @ingroup Base
  74.  * @see Pointer
  75.  */
  76. class Object {
  77. private:
  78. int refcount;
  79. bool m_isStackObject;
  80. public:
  81. /**
  82.  * Construct a new Object. This object will have a reference count of 1.
  83.  */
  84. Object() throw();
  85. virtual ~Object();
  86. /**
  87.  * Increase the reference count by 1. You should call unref()
  88.  * when you no longer need to reference to this object anymore.
  89.  *
  90.  * This method is thread-safe.
  91.  */
  92. void ref() throw();
  93. /**
  94.  * Decrease the reference count by 1. When the reference count
  95.  * drops to 0, the object is deleted (unless markAsStackObject()
  96.  * was called). You should only call this method if you have
  97.  * previously called ref() on this object.
  98.  *
  99.  * This method is thread-safe.
  100.  */
  101. void unref() throw();
  102. /**
  103.  * Indicate that this Object is allocated on the stack.
  104.  * This function will ensure that unref() will never attempt to free
  105.  * this object.
  106.  *
  107.  * @post isStackObject()
  108.  */
  109. void markAsStackObject() throw();
  110. /**
  111.  * Returns whether this Object is marked as a class that's allocated
  112.  * on the stack.
  113.  *
  114.  * This function cannot automatically detect whether the object is
  115.  * allocated on the stack. So this function returns true if and only
  116.  * if markAsStackObject() has been called. By default, this function
  117.  * returns false.
  118.  */
  119. bool isStackObject() throw();
  120. };
  121. }
  122. #endif /* _OSL_OBJECT_H_ */