InstancePool


//https://github.com/jose-villegas/VCTRenderer

#include <iostream>
#include<memory>
#include<map>
#include<vector>
#include<string>
using namespace std;



/// <summary>
/// Stores all instaces of the inheriting class
/// </summary>
template<typename T>
class InstancePool
{
public:
	/// <summary>
	/// Sets this instance priority. Updating its
	/// position in the <see cref="instances"/> collection.
	/// </summary>
	/// <param name="priority">The priority.</param>
	void Priority(const long long priority);
	/// <summary>
	/// Gets the instance with the given identifier
	/// </summary>
	/// <param name="id">The identifier.</param>
	/// <returns></returns>
	T &GetInstance(const long long id);

	InstancePool<T> &operator=(const InstancePool<T> &rhs);
	InstancePool();
	virtual ~InstancePool();
protected:
	/// <summary>
	/// The instance pool
	/// </summary>
	static std::vector<T *> instances;
	/// <summary>
	/// The location of each instance in the
	/// <see cref="instances"/>  collection
	/// </summary>
	static std::map<long long, long long> location;
private:
	unsigned long long instanceId;
	unsigned long long priorityIndex;
};

template<typename T>
std::map<long long, long long> InstancePool<T>::location;

template<typename T>
std::vector<T *> InstancePool<T>::instances;

template <typename T>
InstancePool<T>::InstancePool()
{
	instanceId = static_cast<unsigned int>(instances.size());
	priorityIndex = instanceId;
	instances.push_back(static_cast<T *>(this));
	location[instanceId] = priorityIndex;
}

template <typename T>
InstancePool<T>::~InstancePool()
{
	// delete self from collections
	auto index = location[instanceId];
	location.erase(instanceId);
	instances.erase(instances.begin() + index);

	// update locations
	for (size_t i = 0; i < instances.size(); ++i)
	{
		location[instances[i]->instanceId] = i;
	}
}

template <typename T>
void InstancePool<T>::Priority(const long long priority)
{
	// keep reference
	auto &instance = instances[priorityIndex];
	// remove from position
	instances.erase(instances.begin() + priorityIndex);
	// move to new place
	instances.insert(priority, instance);
	// update location
	location[instanceId] = priority;
}

template <typename T>
T &InstancePool<T>::GetInstance(const long long id)
{
	return instances[location[id]];
}

template <typename T>
InstancePool<T> &InstancePool<T>::operator=(const InstancePool<T> &rhs)
{
	return instanceId == rhs.instanceId;
}


/*

class student :public InstancePool<student> {
public:
	string name;
	string id;
	student(string n, string i) :name(n), id(i) {}

	void print() {
		auto ss = instances;
		for (auto s : ss)
		{
			cout << " " << s->name << " " << s->id << endl;
		}
	}
};

int main()
{
	unique_ptr<student> s1(new student("Alice1",  "123"));
	unique_ptr<student> s2(new student("Alice2",  "123"));
	unique_ptr<student> s3(new student("Alice3",  "123"));

	s1->print();

	while (1);
}
*/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值