#pragma once
#include
#include
template
class wrapper_base
{
public:
using resource_type = T;
wrapper_base(const wrapper_base&) = delete;
wrapper_base& operator=(const wrapper_base&) = delete;
wrapper_base(wrapper_base&& rhs) noexcept
: p_resource(rhs.p_resource)
{
rhs.p_resource = nullptr;
}
wrapper_base& operator=(wrapper_base&& rhs) noexcept
{
std::swap(p_resource, rhs.p_resource);
return *this;
}
operator resource_type*() const noexcept
{
return p_resource;
}
protected:
// Allocation and deletion of p_resource must be handled by inheriting class.
explicit wrapper_base(resource_type* resource = nullptr)
: p_resource(resource)
{
}
~wrapper_base() = default;
resource_type* p_resource = nullptr;
};
template
class list_wrapper : public wrapper_base
{
public:
using base_type = wrapper_base;
explicit list_wrapper(std::vector list)
: m_list(std::move(list))
{
this->p_resource = new base_type::resource_type[m_list.size()];
for (size_t i = 0; i < m_list.size(); ++i)
{
this->p_resource[i] = m_list[i];
}
}
~list_wrapper()
{
delete[] this->p_resource;
this->p_resource = nullptr;
}
list_wrapper(list_wrapper&&) noexcept = default;
list_wrapper& operator=(list_wrapper&&) noexcept = default;
size_t size() const
{
return m_list.size();
}
const T& operator[](size_t pos) const
{
return m_list[pos];
}
const T& front() const
{
return m_list.front();
}
private:
std::vector m_list;
};