프로젝트 : https://github.com/HoonInPark/ServerHyperion.git
본 포스트에 대한 내용은 feat/framesync
브랜치에 있다.
원래 내가 만든 객체풀은 다음과 같이 구현돼 있었다.
#pragma once
#define SERVERHYPERION_EXPORT
#ifdef SERVERHYPERION_EXPORT
#define SERVERHYPERION_API __declspec(dllexport)
#else
#define SERVERHYPERION_API __declspec(dllimport)
#endif
#include <iostream>
#include <queue>
#include <utility>
using namespace std;
template <typename T>
class ObjPool
{
public:
ObjPool() = default;
template <class... P>
ObjPool(size_t _InInitSize, P&&... params);
shared_ptr<T> Acquire();
void Return(shared_ptr<T>& _pInElem);
private:
queue <shared_ptr< T >> m_Data;
};
template<typename T>
template<class ...P>
inline ObjPool<T>::ObjPool(size_t _InInitSize, P&&... params)
{
for (size_t i = 0; i < _InInitSize; ++i)
{
m_Data.push(make_shared<T>(forward<P>(params)...));
}
}
template<typename T>
inline shared_ptr<T> ObjPool<T>::Acquire()
{
if (m_Data.empty())
return nullptr;
shared_ptr<T> RetPtr = m_Data.front();
m_Data.pop();
return RetPtr;
}
template<typename T>
inline void ObjPool<T>::Return(shared_ptr<T>& _pInElem)
{
m_Data.push(_pInElem);
}
근데 queue <shared_ptr< T >> m_Data
는 순회 불가능.
정 순회하고 싶으면 하나하나 디큐해서 값을 읽고 다시 집어넣어야 한다.
std::queue
는 내부에서 std::deque
를 사용한다.
얘는 순회 가능하다.
노출하는 함수도 std::queue
와 비슷.
#pragma once
#define SERVERHYPERION_EXPORT
#ifdef SERVERHYPERION_EXPORT
#define SERVERHYPERION_API __declspec(dllexport)
#else
#define SERVERHYPERION_API __declspec(dllimport)
#endif
#include <iostream>
#include <deque>
#include <utility>
using namespace std;
template <typename T>
class ObjPool
{
public:
ObjPool() = default;
template <class... P>
ObjPool(size_t _InInitSize, P&&... params);
shared_ptr<T> Acquire();
void Return(shared_ptr<T>& _pInElem);
inline auto begin() const { return m_Data.begin(); }
inline auto end() const { return m_Data.end(); }
private:
deque <shared_ptr< T >> m_Data;
};
template<typename T>
template<class ...P>
inline ObjPool<T>::ObjPool(size_t _InInitSize, P&&... params)
{
for (size_t i = 0; i < _InInitSize; ++i)
{
m_Data.push_back(make_shared<T>(forward<P>(params)...));
}
}
template<typename T>
inline shared_ptr<T> ObjPool<T>::Acquire()
{
if (m_Data.empty())
return nullptr;
shared_ptr<T> RetPtr = m_Data.front();
m_Data.pop_front();
return RetPtr;
}
template<typename T>
inline void ObjPool<T>::Return(shared_ptr<T>& _pInElem)
{
m_Data.push_back(_pInElem);
}
멤버인 m_Data
를 std::deque
로 바꾸고 기존 동작과 동일하도록 함수만 조금 수정,
m_Data
의 begin()
, end()
를 ObjPool
클래스 외부에서 호출할 수 있도록 인터페이스 추가.
이렇게 하면 멤버 ObjPool<stClientInfo> m_ClientInfoPool
에 대해 다음과 같이 for
루프에서 순회 가능.
for (const auto client : m_ClientInfoPool)
{
// ...
}
"무례하긴, 순회야."