31 #ifndef PTLIB_SAFE_COLLECTION_H
32 #define PTLIB_SAFE_COLLECTION_H
275 mutable PMutex safetyMutex;
276 unsigned safeReferenceCount;
277 bool safelyBeingRemoved;
602 virtual void Assign(PINDEX idx);
735 virtual void Assign(PINDEX idx);
771 template <
class T,
class BaseClass = PSafePtrBase>
class PSafePtr :
public BaseClass
786 ) : BaseClass(obj, mode) { }
799 ) : BaseClass(safeCollection, mode, idx) { }
812 ) : BaseClass(safeCollection, mode, obj) { }
821 ) : BaseClass(ptr) { }
830 BaseClass::Assign(ptr);
840 BaseClass::Assign(safeCollection);
876 BaseClass::Assign(idx);
898 operator T*()
const {
return dynamic_cast<T *
>(BaseClass::currentObject); }
914 T * previous =
dynamic_cast<T *
>(BaseClass::currentObject);
926 return dynamic_cast<T *
>(BaseClass::currentObject);
935 T * previous =
dynamic_cast<T *
>(BaseClass::currentObject);
936 BaseClass::Previous();
946 BaseClass::Previous();
947 return dynamic_cast<T *
>(BaseClass::currentObject);
956 template <
class Base,
class Derived>
960 if (dynamic_cast<Derived *>(oldPtr.GetObject()) != NULL)
961 newPtr.Assign(oldPtr);
1003 if (&other !=
this) {
1081 ptr.SetSafetyMode(mode);
1157 if (&other !=
this) {
1173 virtual void SetAt(
const Key & key, Base * obj)
1176 if (
SafeAddObject(obj, dynamic_cast<Coll &>(*collection).GetAt(key)))
1177 dynamic_cast<Coll &
>(*collection).SetAt(key, obj);
1193 return SafeRemove(dynamic_cast<Coll &>(*collection).GetAt(key));
1202 return dynamic_cast<Coll &
>(*collection).Contains(key);
1229 ptr.SetSafetyMode(mode);
1240 if (dynamic_cast<Coll &>(*collection).GetAt(to) != NULL)
1242 dynamic_cast<Coll &
>(*collection).SetAt(to, dynamic_cast<Coll &>(*collection).GetAt(from));
1252 dynamic_cast<Coll &
>(*collection).AbstractGetKeys(keys);
1264 template <
class K,
class D>
1394 #endif // PTLIB_SAFE_COLLECTION_H