Program Listing for File vector_view.hpp

Return to documentation for file (/home/runner/work/Legion-Engine/Legion-Engine/legion/engine/core/containers/vector_view.hpp)

#pragma once

#include <vector>
#include <core/platform/platform.hpp>

namespace legion::core
{

    template <class T,bool is_const = false>
    class vector_view
    {
    public:
        using vector_type = std::vector<T>;
        using size_type = typename vector_type::size_type;
        using difference_type = typename vector_type::difference_type;

        using iterator = typename vector_type::iterator;
        using const_iterator = typename vector_type::const_iterator;
        using size_type = typename vector_type::size_type;

        explicit vector_view(std::nullptr_t) : m_targetVector(nullptr) {}

        explicit vector_view(typename std::conditional<is_const,const vector_type*,vector_type*>::type tv,size_type size,difference_type offset) :
            m_targetVector(tv),
            m_targetSize(size),
            m_offset(offset)
        {}

        vector_view(const vector_view&) = default;
        vector_view(vector_view&&) noexcept = default;

        vector_view& operator=(vector_view&& other) noexcept
        {
            m_targetVector = std::move(other.m_targetVector);
            m_targetSize = std::move(other.m_targetSize);
            m_offset = std::move(other.m_offset);
            return *this;
        }

        vector_view& operator=(const vector_view& other)
        {
            if (this == &other)
                return *this;
            m_targetVector = other.m_targetVector;
            m_targetSize = other.m_targetSize;
            m_offset = other.m_offset;
            return *this;
        }

        ~vector_view() = default;

        template< typename = std::enable_if_t<is_const>>
        L_NODISCARD iterator begin()
        {
            return m_targetVector->begin() + m_offset;
        }

        L_NODISCARD const_iterator begin() const
        {
            return m_targetVector->cbegin() + m_offset;
        }

        template< typename = std::enable_if_t<is_const>>
        L_NODISCARD iterator end()
        {
            return m_targetVector->begin() + m_offset + m_targetSize;
        }

        L_NODISCARD const_iterator end() const
        {
            return m_targetVector->cbegin() + m_offset + m_targetSize;
        }

        template< typename = std::enable_if_t<is_const>>
        L_NODISCARD auto data()
        {
            return m_targetVector->data() + m_offset;
        }

        L_NODISCARD auto data() const -> const T*
        {
            return m_targetVector->data() + m_offset;
        }

        L_NODISCARD auto size() const noexcept
        {
            return m_targetSize;
        }

        L_NODISCARD auto max_size() const noexcept
        {
            return m_targetSize;
        }

    private:
        std::conditional<is_const,const vector_type,vector_type>* m_targetVector;
        size_type m_targetSize;
        difference_type m_offset;
    };
}