mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-03 06:35:08 -04:00
Added rsshared ptr helper object (only use in test for memory management)
Added first nxs_test modified pserviceserver to allow better dependency injection git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@7279 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
a929f80596
commit
ef8f48ae73
17 changed files with 340 additions and 86 deletions
85
libretroshare/src/util/rssharedptr.h
Normal file
85
libretroshare/src/util/rssharedptr.h
Normal file
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* rssharedptr.h
|
||||
*
|
||||
* Created on: 16 Apr 2014
|
||||
* Author: crispy
|
||||
*/
|
||||
|
||||
#ifndef RSSHAREDPTR_H_
|
||||
#define RSSHAREDPTR_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/*!
|
||||
* Not thread safe!!
|
||||
*/
|
||||
template<class T>
|
||||
class RsSharedPtr
|
||||
{
|
||||
public:
|
||||
|
||||
RsSharedPtr() : mShared(NULL), mCount(NULL) {}
|
||||
|
||||
RsSharedPtr(T* shared)
|
||||
: mShared(shared), mCount(new int(0))
|
||||
{
|
||||
mCount++;
|
||||
}
|
||||
|
||||
RsSharedPtr(const RsSharedPtr<T>& rsp)
|
||||
{
|
||||
mShared = rsp.mShared;
|
||||
mCount = rsp.mCount;
|
||||
mCount++;
|
||||
}
|
||||
|
||||
void operator=(const RsSharedPtr<T>& rsp)
|
||||
{
|
||||
DecrementAndDeleteIfLast();
|
||||
mShared = rsp.mShared;
|
||||
RepointAndIncrement(rsp.mCount);
|
||||
}
|
||||
|
||||
T* release() { mCount--; T* temp = mShared; mShared = NULL; return temp; }
|
||||
T* get() { return mShared; }
|
||||
|
||||
T& operator*(){ return *mShared; }
|
||||
T* operator->(){ return mShared; }
|
||||
|
||||
~RsSharedPtr()
|
||||
{
|
||||
DecrementAndDeleteIfLast();
|
||||
}
|
||||
private:
|
||||
|
||||
void DecrementAndDeleteIfLast()
|
||||
{
|
||||
mCount--;
|
||||
if(mCount == 0 && mShared != NULL)
|
||||
{
|
||||
delete mShared;
|
||||
delete mCount;
|
||||
}
|
||||
|
||||
mShared = NULL;
|
||||
mCount = NULL;
|
||||
}
|
||||
|
||||
void RepointAndIncrement(int* count)
|
||||
{
|
||||
mCount = count;
|
||||
mCount++;
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
int* mCount;
|
||||
T* mShared;
|
||||
|
||||
};
|
||||
|
||||
template<class T>
|
||||
RsSharedPtr<T> rs_make_shared(T* ptr){ return RsSharedPtr<T>(ptr); }
|
||||
|
||||
#endif /* RSSHAREDPTR_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue