project-kyoku/include/core/spritecontainer.h

63 lines
1.6 KiB
C
Raw Normal View History

2021-06-16 19:11:00 +02:00
#pragma once
#include <memory>
#include <stack>
#include <map>
2021-12-29 15:59:18 +01:00
namespace kku
{
2021-06-16 19:11:00 +02:00
template<typename Type, class SpriteFactory, class Sprite,
typename = std::enable_if_t<std::is_enum<Type>::value>>
class SpriteContainer
{
public:
explicit SpriteContainer(std::initializer_list<Type>&& types,
const std::shared_ptr<SpriteFactory>& factory,
2021-06-16 19:11:00 +02:00
std::size_t reserve_size = 20) :
_sprite_factory(factory),
2021-06-16 19:11:00 +02:00
_poll_reserve_size(reserve_size)
{
for (const Type& type : types)
reallocatePoll(type);
}
inline std::shared_ptr<Sprite> getSprite(Type type)
{
SpritePoll& poll = _sprite_dispatcher.at(type);
if (poll.empty())
reallocatePoll(type);
std::shared_ptr<Sprite> sprite = poll.top();
poll.pop();
return sprite;
}
inline void resetSprite(const std::shared_ptr<Sprite> &sprite, Type action) noexcept
{
2022-05-26 04:13:13 +02:00
sprite->reset();
2021-06-16 19:11:00 +02:00
_sprite_dispatcher[action].push(sprite);
}
~SpriteContainer() = default;
2021-06-16 19:11:00 +02:00
private:
inline void reallocatePoll(Type sprite_type)
{
SpritePoll &poll = _sprite_dispatcher[sprite_type];
for (std::size_t i = 0; i < _poll_reserve_size; ++i)
{
2022-02-06 02:33:09 +01:00
poll.push(_sprite_factory->createSprite(sprite_type));
2021-06-16 19:11:00 +02:00
}
}
using SpritePoll = std::stack<std::shared_ptr<Sprite>>;
std::map<Type, SpritePoll> _sprite_dispatcher;
const std::shared_ptr<SpriteFactory> _sprite_factory;
2021-06-16 19:11:00 +02:00
std::size_t _poll_reserve_size;
};
2021-12-29 15:59:18 +01:00
2022-02-06 02:33:09 +01:00
}