147 lines
2.9 KiB
Plaintext
147 lines
2.9 KiB
Plaintext
|
|
#pragma once
|
|
|
|
#if !defined(BAD_APPLE_OS_ARRAY_INCLUDED)
|
|
#define BAD_APPLE_OS_ARRAY_INCLUDED
|
|
|
|
#include <cstddef>
|
|
#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;
|
|
|
|
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]);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif // !defined(BAD_APPLE_OS_ARRAY_INCLUDED)
|