151 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| #pragma once
 | |
| 
 | |
| #if !defined(BAD_APPLE_OS_ARRAY_INCLUDED)
 | |
| #define BAD_APPLE_OS_ARRAY_INCLUDED
 | |
| 
 | |
| #include <cstddef>
 | |
| #include <initializer_list>
 | |
| #include <stdexcept>
 | |
| #include <utility>
 | |
| 
 | |
| namespace std
 | |
| {
 | |
| template<typename T, std::size_t N>
 | |
| class array
 | |
| {
 | |
| public:
 | |
|     using value_type = T;
 | |
|     using size_type = std::size_t;
 | |
|     using difference_type = std::ptrdiff_t;
 | |
|     using reference = value_type&;
 | |
|     using const_reference = const value_type&;
 | |
|     using pointer = value_type*;
 | |
|     using const_pointer = const value_type*;
 | |
|     using iterator = pointer;
 | |
|     using const_iterator = const_pointer;
 | |
| 
 | |
|     T _elements[N] = {};
 | |
| 
 | |
|     constexpr reference operator[](size_type pos) noexcept
 | |
|     {
 | |
|         return _elements[pos];
 | |
|     }
 | |
| 
 | |
|     constexpr const_reference operator[](size_type pos) const noexcept
 | |
|     {
 | |
|         return _elements[pos];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr reference at(size_type pos)
 | |
|     {
 | |
|         if (pos >= N) {
 | |
|             __ba_throw out_of_range();
 | |
|         }
 | |
|         return _elements[pos];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr const_reference at(size_type pos) const
 | |
|     {
 | |
|         if (pos >= N) {
 | |
|             __ba_throw out_of_range();
 | |
|         }
 | |
|         return _elements[pos];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr reference front() noexcept
 | |
|     {
 | |
|         return _elements[0];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr const_reference front() const noexcept
 | |
|     {
 | |
|         return _elements[0];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr reference back() noexcept
 | |
|     {
 | |
|         return _elements[N - 1];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr const_reference back() const noexcept
 | |
|     {
 | |
|         return _elements[N - 1];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr pointer data() noexcept
 | |
|     {
 | |
|         return _elements;
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr const_pointer data() const noexcept
 | |
|     {
 | |
|         return _elements;
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr iterator begin() noexcept
 | |
|     {
 | |
|         return _elements;
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr const_iterator begin() const noexcept
 | |
|     {
 | |
|         return _elements;
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr const_iterator cbegin() const noexcept
 | |
|     {
 | |
|         return _elements;
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr iterator end() noexcept
 | |
|     {
 | |
|         return &_elements[N];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr const_iterator end() const noexcept
 | |
|     {
 | |
|         return &_elements[N];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr const_iterator cend() const noexcept
 | |
|     {
 | |
|         return &_elements[N];
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr bool empty() const noexcept
 | |
|     {
 | |
|         return N == 0;
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr size_type size() const noexcept
 | |
|     {
 | |
|         return N;
 | |
|     }
 | |
| 
 | |
|     [[nodiscard]] constexpr size_type max_size() const noexcept
 | |
|     {
 | |
|         return N;
 | |
|     }
 | |
| 
 | |
|     constexpr void fill(const T& value)
 | |
|     {
 | |
|         for (T& ele : *this) {
 | |
|             ele = value;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     constexpr void swap(array& other)
 | |
|     {
 | |
|         for (size_type idx = 0; idx < N; ++idx) {
 | |
|             std::swap((*this)[idx], other[idx]);
 | |
|         }
 | |
|     }
 | |
| };
 | |
| 
 | |
| template<typename T, typename... U>
 | |
| array(T, U...) -> array<T, 1 + sizeof...(U)>;
 | |
| }
 | |
| 
 | |
| #endif // !defined(BAD_APPLE_OS_ARRAY_INCLUDED)
 |