使用带有std :: unique_ptr的boost :: flyweight类型透明

时间:2016-10-15 14:49:07

标签: c++ c++11 boost

我正在尝试使用Allegro 5作为图形引擎编写一些代码来管理屏幕上的大量精灵。

由于许多精灵将使用相同的底层位图,我想使用boost :: flyweight库来模拟位图类型,因此与类似对象类型相关联的位图将不会重复加载到内存中

ALLEGRO_BITMAP直接C类型包含在结构allegro_bitmap_t中,具有适当的用户定义转换,因此可以在必要时直接用作底层C类型。我正在尝试设置flyweight类型,以便可以透明地从unique_ptr取消引用与“常规”类型相同,而无需调用unique_ptr的“get”方法,解除引用,然后使用“get”方法<:: p>。反复提升:: flyweight类型。

namespace GraphicsTypes {

using allegro_bitmap_t = struct B
{
public:
    B(int bitmap_w, int bitmap_h) : current_id(id())
    {
        _bitmap_ptr = al_create_bitmap(bitmap_w, bitmap_h);
        if (_bitmap_ptr == nullptr) throw std::bad_alloc();
    }

    B(const char* filename) : current_id(id())
    {
        _bitmap_ptr = al_load_bitmap(filename);
        if (_bitmap_ptr == nullptr) throw std::bad_alloc();
    }

    ~B() = default;

    operator ALLEGRO_BITMAP*() const
    {
        return _bitmap_ptr;
    }

    const ALLEGRO_BITMAP& operator* () const
    {
        return *_bitmap_ptr;
    }

    const int current_id;

private:
    static int id()
    {
       static int _id = 0;
       return _id++;
    }

    ALLEGRO_BITMAP* _bitmap_ptr;
}; 

inline std::size_t hash_value(const B& b)
{
    return boost::hash<int>()(b.current_id);
}

inline bool operator==(const B& l,const B& r)
{
    return l.current_id == r.current_id;
}

inline bool operator!=(const B& l,const B& r)
{
    return !(l.current_id == r.current_id);
}

}

有没有办法构建一个“包装器”类型,比如allegro_flyweight_bitmap_t,所以取消引用底层位图可以自动运行?

0 个答案:

没有答案