rstl: Make iterators default-constructible (MSVC STL fix)

This commit is contained in:
Luke Street 2021-06-12 00:45:14 -04:00
parent 5d65131966
commit 5356cd688a
2 changed files with 11 additions and 8 deletions

View File

@ -63,6 +63,7 @@ if(DEFINED ENV{GITHUB_ENV})
file(APPEND "$ENV{GITHUB_ENV}" "METAFORCE_VERSION=${METAFORCE_WC_DESCRIBE}\n") file(APPEND "$ENV{GITHUB_ENV}" "METAFORCE_VERSION=${METAFORCE_WC_DESCRIBE}\n")
endif() endif()
message(STATUS "Metaforce version set to ${METAFORCE_WC_DESCRIBE}") message(STATUS "Metaforce version set to ${METAFORCE_WC_DESCRIBE}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
project(metaforce LANGUAGES C CXX ASM VERSION ${METAFORCE_VERSION_STRING}) project(metaforce LANGUAGES C CXX ASM VERSION ${METAFORCE_VERSION_STRING})
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" ATHENA_ARCH) string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" ATHENA_ARCH)

View File

@ -30,6 +30,7 @@ public:
const T* m_val; const T* m_val;
public: public:
const_iterator() : m_val(nullptr) {}
explicit const_iterator(const T* val) : m_val(val) {} explicit const_iterator(const T* val) : m_val(val) {}
using value_type = T; using value_type = T;
using difference_type = std::ptrdiff_t; using difference_type = std::ptrdiff_t;
@ -85,6 +86,7 @@ public:
friend class _reserved_vector_base; friend class _reserved_vector_base;
public: public:
iterator() : const_iterator() {}
explicit iterator(T* val) : const_iterator(val) {} explicit iterator(T* val) : const_iterator(val) {}
T& operator*() const { return *const_cast<T*>(const_iterator::m_val); } T& operator*() const { return *const_cast<T*>(const_iterator::m_val); }
T* operator->() const { return const_cast<T*>(const_iterator::m_val); } T* operator->() const { return const_cast<T*>(const_iterator::m_val); }
@ -124,8 +126,8 @@ public:
T& operator[](std::ptrdiff_t i) const { return const_cast<T*>(const_iterator::m_val)[i]; } T& operator[](std::ptrdiff_t i) const { return const_cast<T*>(const_iterator::m_val)[i]; }
}; };
using reverse_iterator = decltype(std::make_reverse_iterator(iterator{nullptr})); using reverse_iterator = decltype(std::make_reverse_iterator(iterator{}));
using const_reverse_iterator = decltype(std::make_reverse_iterator(const_iterator{nullptr})); using const_reverse_iterator = decltype(std::make_reverse_iterator(const_iterator{}));
protected: protected:
static iterator _const_cast_iterator(const const_iterator& it) { return iterator(const_cast<T*>(it.m_val)); } static iterator _const_cast_iterator(const const_iterator& it) { return iterator(const_cast<T*>(it.m_val)); }
@ -511,12 +513,12 @@ public:
[[nodiscard]] const_iterator cbegin() const noexcept { return begin(); } [[nodiscard]] const_iterator cbegin() const noexcept { return begin(); }
[[nodiscard]] const_iterator cend() const noexcept { return end(); } [[nodiscard]] const_iterator cend() const noexcept { return end(); }
[[nodiscard]] auto rbegin() const noexcept { return std::make_reverse_iterator(end()); } [[nodiscard]] const_reverse_iterator rbegin() const noexcept { return std::make_reverse_iterator(end()); }
[[nodiscard]] auto rend() const noexcept { return std::make_reverse_iterator(begin()); } [[nodiscard]] const_reverse_iterator rend() const noexcept { return std::make_reverse_iterator(begin()); }
[[nodiscard]] auto rbegin() noexcept { return std::make_reverse_iterator(end()); } [[nodiscard]] reverse_iterator rbegin() noexcept { return std::make_reverse_iterator(end()); }
[[nodiscard]] auto rend() noexcept { return std::make_reverse_iterator(begin()); } [[nodiscard]] reverse_iterator rend() noexcept { return std::make_reverse_iterator(begin()); }
[[nodiscard]] auto crbegin() const noexcept { return rbegin(); } [[nodiscard]] const_reverse_iterator crbegin() const noexcept { return rbegin(); }
[[nodiscard]] auto crend() const noexcept { return rend(); } [[nodiscard]] const_reverse_iterator crend() const noexcept { return rend(); }
[[nodiscard]] T& operator[](size_t idx) { return _value(idx); } [[nodiscard]] T& operator[](size_t idx) { return _value(idx); }
[[nodiscard]] const T& operator[](size_t idx) const { return _value(idx); } [[nodiscard]] const T& operator[](size_t idx) const { return _value(idx); }