20 #ifndef H_GUARD_SYM_ENTS_H
21 #define H_GUARD_SYM_ENTS_H
27 #include <boost/foreach.hpp>
31 # define DCAST static_cast
33 # define DCAST dynamic_cast
91 #else // SH_COPY_ON_WRITE
113 #if SH_PREVENT_AMBIGUOUS_ENT_ID
114 #error SH_PREVENT_AMBIGUOUS_ENT_ID requires SH_COPY_ON_WRITE to be enabled
117 #endif // SH_COPY_ON_WRITE
121 template <
class T>
static void leave(T *&ptr) {
122 if ( ptr->refCnt.leave())
139 template <enum ERefCntObjKind TKind>
struct RefCntLib;
143 template <
class T>
static void enter(T *&ptr) {
144 if ( ptr->refCnt.enter())
149 if ( ptr->refCnt.requireExclusivity())
156 template <
class T>
static void enter(T *&ptr) {
157 if ( ptr->refCnt.enter())
162 if ( ptr->refCnt.requireExclusivity())
168 #if SH_PREVENT_AMBIGUOUS_ENT_ID
179 template <
class TBaseEnt>
186 template <
typename TId>
inline TId
assignId(TBaseEnt *);
187 template <
typename TId>
inline void assignId(TId
id, TBaseEnt *);
188 template <
typename TId>
inline void releaseEnt(TId
id);
189 template <
typename TId>
inline bool isValidEnt(TId
id)
const;
191 template <
typename TId> TId
lastId()
const {
193 const long last = -1L +
ents_.size();
194 return static_cast<TId
>(last);
197 template <
typename TId>
bool outOfRange(
const TId
id)
const {
198 return (this->lastId<TId>() <
id) || (
id < 0);
201 template <
typename TId>
inline const TBaseEnt*
getEntRO(TId
id);
202 template <
typename TId>
inline TBaseEnt*
getEntRW(TId
id);
204 template <
class TEnt,
typename TId>
205 inline void getEntRO(
const TEnt **, TId
id);
207 template <
class TEnt,
typename TId>
208 inline void getEntRW(TEnt **, TId
id);
221 template <
class TBaseEnt>
222 template <
typename TId>
226 #if SH_PREVENT_AMBIGUOUS_ENT_ID
227 const TId
id =
static_cast<TId
>(entCnt_->entCnt);
228 this->assignId(
id, ptr);
231 this->ents_.push_back(ptr);
232 return this->lastId<TId>();
236 template <
class TBaseEnt>
237 template <
typename TId>
243 if (this->lastId<TId>() < id)
244 ents_.resize(
id + 1, 0);
246 TBaseEnt *&ref = ents_[id];
252 #if SH_PREVENT_AMBIGUOUS_ENT_ID
253 const long cntNow = 1L + id;
254 if (entCnt_->entCnt < cntNow)
255 entCnt_->entCnt = cntNow;
259 template <
class TBaseEnt>
260 template <
typename TId>
266 template <
class TBaseEnt>
267 template <
typename TId>
270 if (this->outOfRange(
id))
276 template <
class TBaseEnt>
278 #if SH_PREVENT_AMBIGUOUS_ENT_ID
284 template <
class TBaseEnt>
288 , entCnt_(ref.entCnt_)
291 #if SH_PREVENT_AMBIGUOUS_ENT_ID
294 BOOST_FOREACH(TBaseEnt *&ent,
ents_)
299 template <
class TBaseEnt>
302 #if SH_PREVENT_AMBIGUOUS_ENT_ID
305 BOOST_FOREACH(TBaseEnt *ent, ents_)
310 template <
class TBaseEnt>
311 template <
typename TId>
318 const TBaseEnt *ptr = ents_[id];
323 template <
class TBaseEnt>
324 template <
typename TId>
330 TBaseEnt *&entRW = ents_[id];
335 template <
class TBaseEnt>
336 template <
class TEnt,
typename TId>
339 const TBaseEnt *ptr = this->getEntRO(
id);
340 const TEnt *ent = DCAST<const TEnt *>(ptr);
349 template <
class TBaseEnt>
350 template <
class TEnt,
typename TId>
353 TBaseEnt *ptr = this->getEntRW(
id);
354 TEnt *ent = DCAST<TEnt *>(ptr);