/usr/include/crystalspace-2.0/csutil/refarr.h is in libcrystalspace-dev 2.0+dfsg-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | /*
Crystal Space Smart Pointers
Copyright (C) 2002 by Jorrit Tyberghein and Matthias Braun
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __CS_REFARR_H__
#define __CS_REFARR_H__
/**\file
* Smart Pointer array
*/
//-----------------------------------------------------------------------------
// Note *1*: The explicit "this->" is needed by modern compilers (such as gcc
// 3.4.x) which distinguish between dependent and non-dependent names in
// templates. See: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html
//-----------------------------------------------------------------------------
#include "csutil/array.h"
#include "csutil/ref.h"
#ifdef CS_REF_TRACKER
#include <typeinfo>
#include "csutil/reftrackeraccess.h"
#define CSREFARR_TRACK(x, cmd, refCount, obj, tag) \
{ \
const int rc = obj ? refCount : -1; \
if (obj) cmd; \
if (obj) \
{ \
csRefTrackerAccess::SetDescription (obj, \
typeid(T).name()); \
csRefTrackerAccess::Match ## x (obj, rc, tag);\
} \
}
#define CSREFARR_TRACK_INCREF(obj,tag) \
CSREFARR_TRACK(IncRef, obj->IncRef(), obj->GetRefCount(), obj, tag);
#define CSREFARR_TRACK_DECREF(obj,tag) \
CSREFARR_TRACK(DecRef, obj->DecRef(), obj->GetRefCount(), obj, tag);
#else
#define CSREFARR_TRACK_INCREF(obj,tag) \
if (obj) obj->IncRef();
#define CSREFARR_TRACK_DECREF(obj,tag) \
if (obj) obj->DecRef();
#endif
template <class T>
class csRefArrayElementHandler : public csArrayElementHandler<T>
{
public:
static void Construct (T* address, T const& src)
{
*address = src;
CSREFARR_TRACK_INCREF (src, address);
}
static void Destroy (T* address)
{
CSREFARR_TRACK_DECREF ((*address), address);
}
static void InitRegion (T* address, size_t count)
{
memset (address, 0, count*sizeof (T));
}
};
/**
* An array of smart pointers.
* \warning Get(), GetExtend() and operator[] are unsafe for element
* manipulations, as they will return references to pointers and not
* proper csRef<> objects - assigning a pointer will circumvent reference
* counting and cause unexpected problems. Use Put() to manipulate elements
* of the array.
*/
template <class T,
class Allocator = CS::Container::ArrayAllocDefault,
class CapacityHandler = CS::Container::ArrayCapacityDefault>
class csRefArray :
public csArray<T*, csRefArrayElementHandler<T*>, Allocator, CapacityHandler>
{
public:
/**
* Initialize object to hold initially 'ilimit' elements, and increase
* storage by 'ithreshold' each time the upper bound is exceeded.
*/
csRefArray (int ilimit = 0,
const CapacityHandler& ch = CapacityHandler())
: csArray<T*, csRefArrayElementHandler<T*>, Allocator, CapacityHandler> (
ilimit, ch)
{
}
/// Pop an element from tail end of array.
csRef<T> Pop ()
{
CS_ASSERT (this->GetSize () > 0);
csRef<T> ret = this->Get (this->GetSize () - 1); // see *1*
this->SetSize (this->GetSize () - 1);
return ret;
}
};
#undef CSREFARR_TRACK_INCREF
#undef CSREFARR_TRACK_DECREF
#endif // __CS_REFARR_H__
|