[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/QuantStack/git2cpp/main/src/wrapper/wrapper_base.hpp [Back]  [Original]

#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;
};

Web Proxy Viewer  |  New URL  |  Original Page