Program Listing for File sequence.h#

Return to documentation for file (support\sequence.h)

#ifndef SDV_SEQUENCE_H
#define SDV_SEQUENCE_H

#include <vector>
#include <algorithm>
#include <limits>
#include "iterator.h"
#include "pointer.h"

namespace sdv
{
    template <class T, size_t nFixedSize = 0>
    class sequence
    {
    public:
        using value_type = T;

        using iterator = internal::index_iterator<sequence<T, nFixedSize>, false, false>;

        using reverse_iterator = internal::index_iterator<sequence<T, nFixedSize>, false, true>;

        using const_iterator = internal::index_iterator<sequence<T, nFixedSize>, true, false>;

        using const_reverse_iterator = internal::index_iterator<sequence<T, nFixedSize>, true, true>;

        using reference = T&;

        using const_reference = const T&;

        sequence() noexcept;

        ~sequence();

        sequence(size_t nCount, const T& rtValue);

        explicit sequence(size_t nCount);

        template <class TIterator>
        sequence(TIterator itFirst, TIterator itLast);

        sequence(const sequence& rseq);

        template <size_t nFixedSize2>
        sequence(const sequence<T, nFixedSize2>& rseq);

        sequence(sequence&& rseq) noexcept;

        template <size_t nFixedSize2>
        sequence(sequence<T, nFixedSize2>&& rseq) noexcept;

        sequence(std::vector<T>& rvec);

        sequence(std::initializer_list<T> ilist);

        sequence& operator=(const sequence& rseq);

        template <size_t nFixedSize2>
        sequence& operator=(const sequence<T, nFixedSize2>& rseq);

        sequence& operator=(sequence&& rseq) noexcept;

        template <size_t nFixedSize2>
        sequence& operator=(sequence<T, nFixedSize2>&& rseq) noexcept;

        sequence& operator=(const std::vector<T>& rvec);

        sequence& operator=(std::initializer_list<T> ilist);

        void assign(size_t nCount, const T& rtValue);

        template <class TIterator>
        void assign(TIterator itFirst, TIterator itLast);

        void assign(std::initializer_list<T> ilist);

        reference at(size_t nPos);

        const_reference at(size_t nPos) const;

        reference operator[](size_t nPos);

        const_reference operator[](size_t nPos) const;

        T& front();

        const T& front() const;

        T& back();

        const T& back() const;

        operator std::vector<T>() const;

        const T* data() const noexcept;

        pointer<T, nFixedSize>& buffer() noexcept;

        iterator begin() noexcept;

        const_iterator begin() const noexcept;

        const_iterator cbegin() const noexcept;

        reverse_iterator rbegin() noexcept;

        const_reverse_iterator rbegin() const noexcept;

        const_reverse_iterator crbegin() const noexcept;

        iterator end() noexcept;

        const_iterator end() const noexcept;

        const_iterator cend() const noexcept;

        reverse_iterator rend() noexcept;

        const_reverse_iterator rend() const noexcept;

        const_reverse_iterator crend() const noexcept;

        bool empty() const;

        size_t size() const;

        size_t length() const;

        void reserve(size_t nNewCap = 0);

        size_t capacity() const noexcept;

        void shrink_to_fit();

        void clear();

        iterator insert(const_iterator itPos, const T& rtValue);

        iterator insert(const_iterator itPos, T&& rtValue);

        iterator insert(const_iterator itPos, size_t nCount, const T& rtValue);

        template <class TIterator>
        iterator insert(const_iterator itPos, TIterator itFirst, TIterator itLast);

        iterator insert(const_iterator itPos, std::initializer_list<T> ilist);

        iterator erase(iterator itPos);

        iterator erase(const_iterator itPos);

        iterator erase(iterator itFirst, iterator itLast);

        iterator erase(const_iterator itFirst, const_iterator itLast);

        void push_back(const T& rtValue);

        void push_back(T&& rtValue);

        void pop_back();

        void resize(size_t nCount);

        void resize(size_t nCount, const value_type& rtValue);

        template <size_t nFixedSize2>
        void swap(sequence<T, nFixedSize2>& rseq) noexcept;

    private:
        pointer<T, nFixedSize>      m_ptrData;
    };

    template <class T, size_t nFixedSizeLeft, size_t nFixedSizeRight>
    void swap(sequence<T, nFixedSizeLeft>& rseqLeft, sequence<T, nFixedSizeRight>& rseqRight) noexcept;

    template <class T, size_t nFixedSizeLeft, size_t nFixedSizeRight>
    bool operator==(const sequence<T, nFixedSizeLeft>& rseqLeft, const sequence<T, nFixedSizeRight>& rseqRight);

    template <class T, size_t nFixedSizeLeft, size_t nFixedSizeRight>
    bool operator!=(const sequence<T, nFixedSizeLeft>& rseqLeft, const sequence<T, nFixedSizeRight>& rseqRight);

    template <class T, size_t nFixedSizeLeft, size_t nFixedSizeRight>
    bool operator<(const sequence<T, nFixedSizeLeft>& rseqLeft, const sequence<T, nFixedSizeRight>& rseqRight);

    template <class T, size_t nFixedSizeLeft, size_t nFixedSizeRight>
    bool operator<=(const sequence<T, nFixedSizeLeft>& rseqLeft, const sequence<T, nFixedSizeRight>& rseqRight);

    template <class T, size_t nFixedSizeLeft, size_t nFixedSizeRight>
    bool operator>(const sequence<T, nFixedSizeLeft>& rseqLeft, const sequence<T, nFixedSizeRight>& rseqRight);

    template <class T, size_t nFixedSizeLeft, size_t nFixedSizeRight>
    bool operator>=(const sequence<T, nFixedSizeLeft>& rseqLeft, const sequence<T, nFixedSizeRight>& rseqRight);
} // namespace sdv

#include "sequence.inl"

#endif // !defined SDV_SEQUENCE_H