100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						||
#include <concepts>
 | 
						||
#include <vector>
 | 
						||
namespace zstd {
 | 
						||
    template<typename T>
 | 
						||
    void malloc_list(T*& ptr, int count) {
 | 
						||
        ptr = (T*)malloc(count * sizeof(T));
 | 
						||
        for (size_t i = 0; i < count; i++)
 | 
						||
        {
 | 
						||
            std::construct_at(ptr + i);
 | 
						||
        }
 | 
						||
    }
 | 
						||
    template<typename T>
 | 
						||
    class harray {
 | 
						||
    protected:
 | 
						||
        T* m_ptr{nullptr};
 | 
						||
        int m_count{0};
 | 
						||
    public:
 | 
						||
        constexpr harray() {}
 | 
						||
        harray(const std::vector<T>& vec)noexcept {
 | 
						||
            m_count = vec.size();
 | 
						||
            if (m_count > 0) {
 | 
						||
                malloc_list(m_ptr, m_count);
 | 
						||
                std::move(vec.begin(), vec.end(), m_ptr);
 | 
						||
            }
 | 
						||
        }
 | 
						||
        ~harray() {
 | 
						||
            for (int i = 0; i < m_count; i++) {
 | 
						||
                std::destroy_at(m_ptr + i);
 | 
						||
            }
 | 
						||
            m_ptr = nullptr;
 | 
						||
            m_count = 0;
 | 
						||
        }
 | 
						||
        constexpr void reset() noexcept {
 | 
						||
            m_ptr = nullptr;
 | 
						||
            m_count = 0;
 | 
						||
        }
 | 
						||
        constexpr T* data() noexcept {
 | 
						||
            return m_ptr;
 | 
						||
        }
 | 
						||
        constexpr T* front() noexcept {
 | 
						||
            return m_ptr;
 | 
						||
        }
 | 
						||
        constexpr T* back() noexcept {
 | 
						||
            return m_ptr + m_count;
 | 
						||
        }
 | 
						||
        constexpr T* at(int i) noexcept {
 | 
						||
            if (i < m_count) {
 | 
						||
                return m_ptr + i;
 | 
						||
            }
 | 
						||
            return nullptr;
 | 
						||
        }
 | 
						||
        constexpr bool IsValid() const noexcept {
 | 
						||
            return m_count > 0;
 | 
						||
        }
 | 
						||
        constexpr bool empty() const noexcept {
 | 
						||
            return m_count == 0;
 | 
						||
        }
 | 
						||
        constexpr int size() const noexcept {
 | 
						||
            return m_count;
 | 
						||
        }
 | 
						||
        constexpr auto begin() noexcept {
 | 
						||
            return iterator{ m_ptr };
 | 
						||
        }
 | 
						||
        constexpr auto end() noexcept {
 | 
						||
            return iterator{ m_ptr + m_count };
 | 
						||
        }
 | 
						||
        // Iterator class
 | 
						||
        class iterator {
 | 
						||
        private:
 | 
						||
            const T* ptr;
 | 
						||
 | 
						||
        public:
 | 
						||
            constexpr iterator(const T* p) : ptr(p) {}
 | 
						||
 | 
						||
            // Overload ++ to move to next element
 | 
						||
            constexpr iterator& operator++() noexcept {
 | 
						||
                ++ptr;
 | 
						||
                return *this;
 | 
						||
            }
 | 
						||
            //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>--it,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>it--
 | 
						||
            constexpr iterator& operator--(int) noexcept {
 | 
						||
                --ptr;
 | 
						||
                return *this;
 | 
						||
            }
 | 
						||
            constexpr const T* operator->() const noexcept {
 | 
						||
                return ptr;
 | 
						||
            }
 | 
						||
            // Overload * to dereference iterator
 | 
						||
            constexpr const T& operator*() const noexcept {
 | 
						||
                return *ptr;
 | 
						||
            }
 | 
						||
 | 
						||
            // Overload != to compare iterators
 | 
						||
            constexpr bool operator!=(const iterator& other) const noexcept {
 | 
						||
                return ptr != other.ptr;
 | 
						||
            }
 | 
						||
        };
 | 
						||
    };
 | 
						||
} |