|
|
@ -5,6 +5,7 @@ |
|
|
|
#include <functional> |
|
|
|
#include <functional> |
|
|
|
#include <memory> |
|
|
|
#include <memory> |
|
|
|
#include <mutex> |
|
|
|
#include <mutex> |
|
|
|
|
|
|
|
#include <utility> |
|
|
|
#include <boost/asio.hpp> |
|
|
|
#include <boost/asio.hpp> |
|
|
|
|
|
|
|
|
|
|
|
#ifdef ANDROID |
|
|
|
#ifdef ANDROID |
|
|
@ -14,7 +15,7 @@ namespace std |
|
|
|
template <typename T> |
|
|
|
template <typename T> |
|
|
|
std::string to_string(T value) |
|
|
|
std::string to_string(T value) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return boost::lexical_cast<std::string>(value); |
|
|
|
return boost::lexical_cast<std::string>(value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
inline int stoi(const std::string& str) |
|
|
|
inline int stoi(const std::string& str) |
|
|
@ -29,12 +30,12 @@ namespace i2p |
|
|
|
namespace util |
|
|
|
namespace util |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
template<class T> |
|
|
|
template<class T> |
|
|
|
class MemoryPool |
|
|
|
class MemoryPool |
|
|
|
{ |
|
|
|
{ |
|
|
|
public: |
|
|
|
public: |
|
|
|
|
|
|
|
|
|
|
|
MemoryPool (): m_Head (nullptr) {}; |
|
|
|
MemoryPool (): m_Head (nullptr) {} |
|
|
|
~MemoryPool () |
|
|
|
~MemoryPool () |
|
|
|
{ |
|
|
|
{ |
|
|
|
while (m_Head) |
|
|
|
while (m_Head) |
|
|
@ -48,12 +49,12 @@ namespace util |
|
|
|
template<typename... TArgs> |
|
|
|
template<typename... TArgs> |
|
|
|
T * Acquire (TArgs&&... args) |
|
|
|
T * Acquire (TArgs&&... args) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!m_Head) return new T(args...); |
|
|
|
if (!m_Head) return new T(std::forward<TArgs>(args)...); |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
auto tmp = m_Head; |
|
|
|
auto tmp = m_Head; |
|
|
|
m_Head = static_cast<T*>(*(void * *)m_Head); // next
|
|
|
|
m_Head = static_cast<T*>(*(void * *)m_Head); // next
|
|
|
|
return new (tmp)T(args...); |
|
|
|
return new (tmp)T(std::forward<TArgs>(args)...); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -68,14 +69,15 @@ namespace util |
|
|
|
template<typename... TArgs> |
|
|
|
template<typename... TArgs> |
|
|
|
std::unique_ptr<T, std::function<void(T*)> > AcquireUnique (TArgs&&... args) |
|
|
|
std::unique_ptr<T, std::function<void(T*)> > AcquireUnique (TArgs&&... args) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return std::unique_ptr<T, std::function<void(T*)> >(Acquire (args...), |
|
|
|
return std::unique_ptr<T, std::function<void(T*)> >(Acquire (std::forward<TArgs>(args)...), |
|
|
|
std::bind (&MemoryPool<T>::Release, this, std::placeholders::_1)); |
|
|
|
std::bind (&MemoryPool<T>::Release, this, std::placeholders::_1)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template<typename... TArgs> |
|
|
|
template<typename... TArgs> |
|
|
|
std::shared_ptr<T> AcquireShared (TArgs&&... args) |
|
|
|
std::shared_ptr<T> AcquireShared (TArgs&&... args) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return std::shared_ptr<T>(Acquire (args...), std::bind (&MemoryPool<T>::Release, this, std::placeholders::_1)); |
|
|
|
return std::shared_ptr<T>(Acquire (std::forward<TArgs>(args)...), |
|
|
|
|
|
|
|
std::bind (&MemoryPool<T>::Release, this, std::placeholders::_1)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
protected: |
|
|
@ -88,13 +90,13 @@ namespace util |
|
|
|
{ |
|
|
|
{ |
|
|
|
public: |
|
|
|
public: |
|
|
|
|
|
|
|
|
|
|
|
MemoryPoolMt () {}; |
|
|
|
MemoryPoolMt () {} |
|
|
|
template<typename... TArgs> |
|
|
|
template<typename... TArgs> |
|
|
|
T * AcquireMt (TArgs&&... args) |
|
|
|
T * AcquireMt (TArgs&&... args) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!this->m_Head) return new T(args...); |
|
|
|
if (!this->m_Head) return new T(std::forward<TArgs>(args)...); |
|
|
|
std::lock_guard<std::mutex> l(m_Mutex); |
|
|
|
std::lock_guard<std::mutex> l(m_Mutex); |
|
|
|
return this->Acquire (args...); |
|
|
|
return this->Acquire (std::forward<TArgs>(args)...); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ReleaseMt (T * t) |
|
|
|
void ReleaseMt (T * t) |
|
|
|