From 13ca99b91f1a892c14c3558914c1f172c63a29e0 Mon Sep 17 00:00:00 2001 From: Spartan322 Date: Fri, 4 Sep 2026 02:47:23 -0400 Subject: [PATCH] Add OV_LIFETIME_BOUND attribute Add OV_LIFETIME_BOUND attributes to core types --- src/openvic-simulation/core/Typedefs.hpp | 14 ++++ src/openvic-simulation/core/io/BMP.hpp | 5 +- src/openvic-simulation/core/object/Colour.hpp | 10 +-- .../core/object/FixedPoint/String.hpp | 7 +- .../core/object/VectorN.inc | 4 +- .../core/random/RandomGenerator.hpp | 4 +- .../core/stl/containers/BulkInsertWrapper.hpp | 49 ++++++------ .../core/stl/containers/CowPtr.hpp | 16 ++-- .../core/stl/containers/CowVector.hpp | 80 +++++++++---------- .../core/stl/containers/FixedVector.hpp | 38 ++++----- .../core/stl/containers/RingBuffer.hpp | 60 +++++++------- .../core/stl/containers/StackString.hpp | 9 ++- .../core/string/StringLiteral.hpp | 37 ++++----- 13 files changed, 175 insertions(+), 158 deletions(-) diff --git a/src/openvic-simulation/core/Typedefs.hpp b/src/openvic-simulation/core/Typedefs.hpp index 903586025..b4c0cfa8e 100644 --- a/src/openvic-simulation/core/Typedefs.hpp +++ b/src/openvic-simulation/core/Typedefs.hpp @@ -47,6 +47,20 @@ #endif #endif // OV_NO_UNIQUE_ADDRESS +#ifndef OV_LIFETIME_BOUND +#if __has_cpp_attribute(clang::lifetimebound) +#define OV_LIFETIME_BOUND [[clang::lifetimebound]] +#elif __has_cpp_attribute(gnu::lifetimebound) +#define OV_LIFETIME_BOUND [[gnu::lifetimebound]] +#elif __has_cpp_attribute(msvc::lifetimebound) +#define OV_LIFETIME_BOUND [[msvc::lifetimebound]] +#elif __has_cpp_attribute(lifetimebound) +#define OV_LIFETIME_BOUND [[lifetimebound]] +#else +#define OV_LIFETIME_BOUND +#endif +#endif // OV_LIFETIME_BOUND + namespace OpenVic { template constexpr auto substring_as_array(std::string_view str, std::index_sequence) { diff --git a/src/openvic-simulation/core/io/BMP.hpp b/src/openvic-simulation/core/io/BMP.hpp index c1ac71c4e..2b60c21c8 100644 --- a/src/openvic-simulation/core/io/BMP.hpp +++ b/src/openvic-simulation/core/io/BMP.hpp @@ -5,6 +5,7 @@ #include #include "openvic-simulation/core/memory/Vector.hpp" +#include "openvic-simulation/core/Typedefs.hpp" namespace OpenVic { namespace fs = std::filesystem; @@ -60,7 +61,7 @@ namespace OpenVic { int32_t get_width() const; int32_t get_height() const; uint16_t get_bits_per_pixel() const; - std::span get_palette() const; - std::span get_pixel_data() const; + std::span get_palette() const OV_LIFETIME_BOUND; + std::span get_pixel_data() const OV_LIFETIME_BOUND; }; } diff --git a/src/openvic-simulation/core/object/Colour.hpp b/src/openvic-simulation/core/object/Colour.hpp index 041dae18e..4e98f2fef 100644 --- a/src/openvic-simulation/core/object/Colour.hpp +++ b/src/openvic-simulation/core/object/Colour.hpp @@ -546,11 +546,11 @@ namespace OpenVic { return operator integer_type() <=> rhs; } - OV_SPEED_INLINE constexpr value_type& operator[](std::size_t index) { + OV_SPEED_INLINE constexpr value_type& operator[](std::size_t index) OV_LIFETIME_BOUND { return _array_access_helper(*this, index); } - OV_SPEED_INLINE constexpr value_type const& operator[](std::size_t index) const { + OV_SPEED_INLINE constexpr value_type const& operator[](std::size_t index) const OV_LIFETIME_BOUND { return _array_access_helper(*this, index); } @@ -611,7 +611,7 @@ namespace OpenVic { public: template - OV_SPEED_INLINE auto&& get() & { + OV_SPEED_INLINE auto&& get() & OV_LIFETIME_BOUND { return get_helper(*this); } @@ -621,12 +621,12 @@ namespace OpenVic { } template - OV_SPEED_INLINE auto&& get() const& { + OV_SPEED_INLINE auto&& get() const& OV_LIFETIME_BOUND { return get_helper(*this); } template - OV_SPEED_INLINE auto&& get() const&& { + OV_SPEED_INLINE auto&& get() const&& OV_LIFETIME_BOUND { return get_helper(*this); } diff --git a/src/openvic-simulation/core/object/FixedPoint/String.hpp b/src/openvic-simulation/core/object/FixedPoint/String.hpp index 11feba71d..e2d1fba50 100644 --- a/src/openvic-simulation/core/object/FixedPoint/String.hpp +++ b/src/openvic-simulation/core/object/FixedPoint/String.hpp @@ -6,6 +6,7 @@ #include "openvic-simulation/core/object/FixedPoint.hpp" #include "openvic-simulation/core/stl/containers/StackString.hpp" #include "openvic-simulation/core/string/CharConv.hpp" +#include "openvic-simulation/core/Typedefs.hpp" #include "openvic-simulation/utility/Logger.hpp" namespace OpenVic::fp { @@ -13,15 +14,15 @@ namespace OpenVic::fp { protected: using StackString::StackString; public: - constexpr char* front() { + constexpr char* front() OV_LIFETIME_BOUND { return _array.data(); } - constexpr char* back() { + constexpr char* back() OV_LIFETIME_BOUND { return _array.data() + _array.size(); } - constexpr uint8_t& string_size() { + constexpr uint8_t& string_size() OV_LIFETIME_BOUND { return _string_size; } }; diff --git a/src/openvic-simulation/core/object/VectorN.inc b/src/openvic-simulation/core/object/VectorN.inc index d1ae54312..daadcbc82 100644 --- a/src/openvic-simulation/core/object/VectorN.inc +++ b/src/openvic-simulation/core/object/VectorN.inc @@ -190,11 +190,11 @@ namespace OpenVic { return components; } - OV_SPEED_INLINE constexpr T& operator[](size_t index) { + OV_SPEED_INLINE constexpr T& operator[](size_t index) OV_LIFETIME_BOUND { return components[index % size]; } - OV_SPEED_INLINE constexpr T const& operator[](size_t index) const { + OV_SPEED_INLINE constexpr T const& operator[](size_t index) const OV_LIFETIME_BOUND { return components[index % size]; } diff --git a/src/openvic-simulation/core/random/RandomGenerator.hpp b/src/openvic-simulation/core/random/RandomGenerator.hpp index a010c146a..554d15c60 100644 --- a/src/openvic-simulation/core/random/RandomGenerator.hpp +++ b/src/openvic-simulation/core/random/RandomGenerator.hpp @@ -66,11 +66,11 @@ namespace OpenVic { return lhs._generator != rhs._generator; } - [[nodiscard]] OV_ALWAYS_INLINE constexpr T& generator() { + [[nodiscard]] OV_ALWAYS_INLINE constexpr T& generator() OV_LIFETIME_BOUND { return _generator; } - [[nodiscard]] OV_ALWAYS_INLINE constexpr T const& generator() const { + [[nodiscard]] OV_ALWAYS_INLINE constexpr T const& generator() const OV_LIFETIME_BOUND { return _generator; } diff --git a/src/openvic-simulation/core/stl/containers/BulkInsertWrapper.hpp b/src/openvic-simulation/core/stl/containers/BulkInsertWrapper.hpp index cd31e8bdf..8968b7344 100644 --- a/src/openvic-simulation/core/stl/containers/BulkInsertWrapper.hpp +++ b/src/openvic-simulation/core/stl/containers/BulkInsertWrapper.hpp @@ -9,6 +9,7 @@ #include #include "openvic-simulation/core/Assert.hpp" +#include "openvic-simulation/core/Typedefs.hpp" namespace OpenVic { // not thread safe @@ -64,74 +65,74 @@ namespace OpenVic { } // Element access based on std::vector - constexpr reference operator[](const size_type pos) { + constexpr reference operator[](const size_type pos) OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(pos, "operator[]"); return container[pos]; } - constexpr const_reference operator[](const size_type pos) const { + constexpr const_reference operator[](const size_type pos) const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(pos, "operator[]"); return container[pos]; } - constexpr reference front() { + constexpr reference front() OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("front"); return container[0]; } - constexpr const_reference front() const { + constexpr const_reference front() const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("front"); return container[0]; } - - constexpr reference back() { + + constexpr reference back() OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("back"); return container[size()-1]; } - constexpr const_reference back() const { + constexpr const_reference back() const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("back"); return container[size()-1]; } - constexpr value_type* data() noexcept { return container.data(); } - constexpr value_type const* data() const noexcept { return container.data(); } + constexpr value_type* data() noexcept OV_LIFETIME_BOUND { return container.data(); } + constexpr value_type const* data() const noexcept OV_LIFETIME_BOUND { return container.data(); } // Iterators based on std::vector - constexpr iterator begin() noexcept { + constexpr iterator begin() noexcept OV_LIFETIME_BOUND { return container.begin(); } - constexpr const_iterator begin() const noexcept { + constexpr const_iterator begin() const noexcept OV_LIFETIME_BOUND { return container.begin(); } - constexpr const_iterator cbegin() const noexcept { + constexpr const_iterator cbegin() const noexcept OV_LIFETIME_BOUND { return container.cbegin(); } - constexpr iterator end() noexcept { + constexpr iterator end() noexcept OV_LIFETIME_BOUND { return container.end(); } - constexpr const_iterator end() const noexcept { + constexpr const_iterator end() const noexcept OV_LIFETIME_BOUND { return container.end(); } - constexpr const_iterator cend() const noexcept { + constexpr const_iterator cend() const noexcept OV_LIFETIME_BOUND { return container.cend(); } - constexpr reverse_iterator rbegin() noexcept { + constexpr reverse_iterator rbegin() noexcept OV_LIFETIME_BOUND { return container.rbegin(); } - constexpr const_reverse_iterator rbegin() const noexcept { + constexpr const_reverse_iterator rbegin() const noexcept OV_LIFETIME_BOUND { return container.rbegin(); } - constexpr const_reverse_iterator crbegin() const noexcept { + constexpr const_reverse_iterator crbegin() const noexcept OV_LIFETIME_BOUND { return container.crbegin(); } - constexpr reverse_iterator rend() noexcept { + constexpr reverse_iterator rend() noexcept OV_LIFETIME_BOUND { return container.rend(); } - constexpr const_reverse_iterator rend() const noexcept { + constexpr const_reverse_iterator rend() const noexcept OV_LIFETIME_BOUND { return container.rend(); } - constexpr const_reverse_iterator crend() const noexcept { + constexpr const_reverse_iterator crend() const noexcept OV_LIFETIME_BOUND { return container.crend(); } @@ -173,7 +174,7 @@ namespace OpenVic { template requires std::is_trivially_destructible_v - constexpr reference emplace_back(Args&&... args) { + constexpr reference emplace_back(Args&&... args) OV_LIFETIME_BOUND { return container.emplace_back(std::forward(args)...); } @@ -185,7 +186,7 @@ namespace OpenVic { template constexpr void append_range(const InputIt first, const InputIt last) { flush_pending_room(); - + const size_type new_valid_size = size() + std::distance(first, last); if (new_valid_size > container.capacity()) { assert(!"append_range called without make_room_for"); @@ -198,4 +199,4 @@ namespace OpenVic { // resize() is omitted as we manage that via make_room_for }; -} \ No newline at end of file +} diff --git a/src/openvic-simulation/core/stl/containers/CowPtr.hpp b/src/openvic-simulation/core/stl/containers/CowPtr.hpp index 9a7c9591c..0439a12aa 100644 --- a/src/openvic-simulation/core/stl/containers/CowPtr.hpp +++ b/src/openvic-simulation/core/stl/containers/CowPtr.hpp @@ -113,26 +113,26 @@ namespace OpenVic::stl { return *this; } - OV_ALWAYS_INLINE reference write() { + OV_ALWAYS_INLINE reference write() OV_LIFETIME_BOUND { if (data->count != 1) { *this = cow_ptr(read(), payload_allocator_traits::select_on_container_copy_construction(alloc)); } return data->value; } - OV_ALWAYS_INLINE const_reference read() const { + OV_ALWAYS_INLINE const_reference read() const OV_LIFETIME_BOUND { return data->value; } - OV_ALWAYS_INLINE const_pointer get() const { + OV_ALWAYS_INLINE const_pointer get() const OV_LIFETIME_BOUND { return &read(); } - OV_ALWAYS_INLINE const_reference operator*() const { + OV_ALWAYS_INLINE const_reference operator*() const OV_LIFETIME_BOUND { return read(); } - OV_ALWAYS_INLINE const_pointer operator->() const { + OV_ALWAYS_INLINE const_pointer operator->() const OV_LIFETIME_BOUND { return get(); } @@ -142,7 +142,7 @@ namespace OpenVic::stl { template requires std::constructible_from - OV_ALWAYS_INLINE const_reference emplace(Args&&... args) { + OV_ALWAYS_INLINE const_reference emplace(Args&&... args) OV_LIFETIME_BOUND { if (data->count > 1) { ~cow_ptr(); data = _allocate_payload(); @@ -155,7 +155,7 @@ namespace OpenVic::stl { template requires std::constructible_from&, Args&&...> - OV_ALWAYS_INLINE const_reference emplace(std::initializer_list ilist, Args&&... args) { + OV_ALWAYS_INLINE const_reference emplace(std::initializer_list ilist, Args&&... args) OV_LIFETIME_BOUND { if (data->count > 1) { ~cow_ptr(); data = _allocate_payload(); @@ -189,7 +189,7 @@ namespace OpenVic::stl { OV_NO_UNIQUE_ADDRESS payload_allocator_type alloc; payload* data; - inline payload* _allocate_payload() { + inline payload* _allocate_payload() OV_LIFETIME_BOUND { return payload_allocator_traits::allocate(alloc, 1); } }; diff --git a/src/openvic-simulation/core/stl/containers/CowVector.hpp b/src/openvic-simulation/core/stl/containers/CowVector.hpp index 1b506e790..890e1a4e2 100644 --- a/src/openvic-simulation/core/stl/containers/CowVector.hpp +++ b/src/openvic-simulation/core/stl/containers/CowVector.hpp @@ -169,33 +169,33 @@ namespace OpenVic::stl { return alloc; } - const_reference at(size_type pos) const { + const_reference at(size_type pos) const OV_LIFETIME_BOUND { if (OV_unlikely(pos >= size())) { _abort_on_out_of_range("at", "pos", pos, size()); } return _data->array[pos]; } - const_reference operator[](size_type pos) const { + const_reference operator[](size_type pos) const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(pos, "operator[]"); return _data->array[pos]; } - const_reference front() const { + const_reference front() const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("front"); return *_data->array; } - const_reference back() const { + const_reference back() const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("back"); return *_data->array_end; } - T const* data() const { + T const* data() const OV_LIFETIME_BOUND { return !_data ? nullptr : _data->array; } - std::span read() const { + std::span read() const OV_LIFETIME_BOUND { if (!_data) { return {}; } @@ -203,35 +203,35 @@ namespace OpenVic::stl { return { _data->array, _data->array_end }; } - const_iterator begin() const { + const_iterator begin() const OV_LIFETIME_BOUND { return !_data ? end() : const_iterator(_data->array); } - const_iterator cbegin() const { + const_iterator cbegin() const OV_LIFETIME_BOUND { return !_data ? cend() : begin(); } - const_iterator end() const { + const_iterator end() const OV_LIFETIME_BOUND { return !_data ? const_iterator() : const_iterator(_data->array_end); } - const_iterator cend() const { + const_iterator cend() const OV_LIFETIME_BOUND { return end(); } - const_reverse_iterator rbegin() const { + const_reverse_iterator rbegin() const OV_LIFETIME_BOUND { return !_data ? rend() : const_reverse_iterator(_data->array); } - const_reverse_iterator crbegin() const { + const_reverse_iterator crbegin() const OV_LIFETIME_BOUND { return rbegin(); } - const_reverse_iterator rend() const { + const_reverse_iterator rend() const OV_LIFETIME_BOUND { return !_data ? const_reverse_iterator() : const_reverse_iterator(_data->array_end); } - const_reverse_iterator crend() const { + const_reverse_iterator crend() const OV_LIFETIME_BOUND { return rend(); } @@ -276,7 +276,7 @@ namespace OpenVic::stl { friend struct writer; struct writer; - writer& write() { + writer& write() OV_LIFETIME_BOUND { if (!_data || _data->count <= 1) { return *reinterpret_cast(this); } @@ -286,7 +286,7 @@ namespace OpenVic::stl { return result; } - writer& write_for_overwrite() { + writer& write_for_overwrite() OV_LIFETIME_BOUND { writer& result = *reinterpret_cast(this); if (!_data || _data->count <= 1) { return result; @@ -315,7 +315,7 @@ namespace OpenVic::stl { OV_NO_UNIQUE_ADDRESS allocator_type alloc; mutable payload* _data; - inline payload* _allocate_payload(size_t reserve) { + inline payload* _allocate_payload(size_t reserve) OV_LIFETIME_BOUND { if (reserve == 0) { return nullptr; } @@ -374,45 +374,45 @@ namespace OpenVic::stl { _assign_aux(ilist.begin(), ilist.end(), std::random_access_iterator_tag()); } - reference at(size_type pos) { + reference at(size_type pos) OV_LIFETIME_BOUND { if (OV_unlikely(pos >= size())) { _abort_on_out_of_range("at", "pos", pos, size()); } return _data->array[pos]; } - reference operator[](size_type pos) { + reference operator[](size_type pos) OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(pos, "operator[]"); return _data->array[pos]; } - reference front() { + reference front() OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("front"); return *_data->array; } - reference back() { + reference back() OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("back"); return *_data->array_end; } - T* data() { + T* data() OV_LIFETIME_BOUND { return !_data ? nullptr : _data->array; } - iterator begin() { + iterator begin() OV_LIFETIME_BOUND { return !_data ? end() : iterator(_data->array); } - iterator end() { + iterator end() OV_LIFETIME_BOUND { return !_data ? iterator() : iterator(_data->array_end); } - reverse_iterator rbegin() { + reverse_iterator rbegin() OV_LIFETIME_BOUND { return !_data ? rend() : reverse_iterator(_data->array); } - reverse_iterator rend() { + reverse_iterator rend() OV_LIFETIME_BOUND { return !_data ? reverse_iterator() : reverse_iterator(_data->array_end); } @@ -467,7 +467,7 @@ namespace OpenVic::stl { _data->array_end = _data->array; } - iterator insert(const_iterator pos, T const& value) { + iterator insert(const_iterator pos, T const& value) OV_LIFETIME_BOUND { const size_type n = pos - begin(); if (_data) { if (_data->array_end != _data->store_end) { @@ -493,35 +493,35 @@ namespace OpenVic::stl { return iterator(_data->array + n); } - iterator insert(const_iterator pos, T&& value) { + iterator insert(const_iterator pos, T&& value) OV_LIFETIME_BOUND { return _insert_rval(pos, std::move(value)); } - iterator insert(const_iterator pos, size_type count, T const& value) { + iterator insert(const_iterator pos, size_type count, T const& value) OV_LIFETIME_BOUND { difference_type offset = pos - cbegin(); _fill_insert(begin() + offset, count, value); return begin() + offset; } template - iterator insert(const_iterator pos, InputIt first, InputIt last) { + iterator insert(const_iterator pos, InputIt first, InputIt last) OV_LIFETIME_BOUND { difference_type offset = pos - cbegin(); _range_insert(begin() + offset, first, last, std::iterator_traits::iterator_category()); return begin() + offset; } - iterator insert(const_iterator pos, std::initializer_list ilist) { + iterator insert(const_iterator pos, std::initializer_list ilist) OV_LIFETIME_BOUND { auto offset = pos - cbegin(); _range_insert(begin() + offset, ilist.begin(), ilist.end(), std::random_access_iterator_tag()); return begin() + offset; } template - iterator emplace(const_iterator pos, Args&&... args) { + iterator emplace(const_iterator pos, Args&&... args) OV_LIFETIME_BOUND { return _emplace_aux(pos, std::forward(args)...); } - iterator erase(const_iterator pos) { + iterator erase(const_iterator pos) OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_VALID_ITERATOR(pos, "erase(const_iterator)"); if (pos + 1 != end()) { std::move(pos + 1, end(), pos); @@ -531,7 +531,7 @@ namespace OpenVic::stl { return pos; } - iterator erase(const_iterator first, const_iterator last) { + iterator erase(const_iterator first, const_iterator last) OV_LIFETIME_BOUND { if (first != last) { if (last != end()) { std::move(last, end(), first); @@ -559,7 +559,7 @@ namespace OpenVic::stl { } template - reference emplace_back(Args&&... args) { + reference emplace_back(Args&&... args) OV_LIFETIME_BOUND { if (_data) { if (_data->array_end != _data->store_end) { allocator_traits::construct(alloc, _data->array_end, std::forward(args)...); @@ -736,12 +736,12 @@ namespace OpenVic::stl { allocator_traits::destroy(self->alloc, ptr()); } - value_type& value() { + value_type& value() OV_LIFETIME_BOUND { return storage.value; } private: - T* ptr() { + T* ptr() OV_LIFETIME_BOUND { return std::addressof(storage.value); } @@ -866,7 +866,7 @@ namespace OpenVic::stl { } } - iterator _insert_rval(const_iterator pos, value_type&& value) { + iterator _insert_rval(const_iterator pos, value_type&& value) OV_LIFETIME_BOUND { const auto n = pos - cbegin(); if (_data) { if (_data->array_end != _data->store_end) { @@ -887,7 +887,7 @@ namespace OpenVic::stl { } template - iterator _emplace_aux(const_iterator pos, Args&&... args) { + iterator _emplace_aux(const_iterator pos, Args&&... args) OV_LIFETIME_BOUND { const auto n = pos - cbegin(); if (_data) { if (_data->array_end != _data->store_end) { @@ -911,7 +911,7 @@ namespace OpenVic::stl { return iterator(_data->array + n); } - iterator _emplace_aux(const_iterator pos, value_type&& value) { + iterator _emplace_aux(const_iterator pos, value_type&& value) OV_LIFETIME_BOUND { return _insert_rval(pos, std::move(value)); } diff --git a/src/openvic-simulation/core/stl/containers/FixedVector.hpp b/src/openvic-simulation/core/stl/containers/FixedVector.hpp index 7c1659eb6..f3ca5784a 100644 --- a/src/openvic-simulation/core/stl/containers/FixedVector.hpp +++ b/src/openvic-simulation/core/stl/containers/FixedVector.hpp @@ -202,53 +202,53 @@ namespace OpenVic::stl { using iterator = T*; using const_iterator = T const*; - constexpr iterator begin() { return _data_start_ptr; } - constexpr const_iterator begin() const { return _data_start_ptr; } - constexpr const_iterator cbegin() const { return _data_start_ptr; } + constexpr iterator begin() OV_LIFETIME_BOUND { return _data_start_ptr; } + constexpr const_iterator begin() const OV_LIFETIME_BOUND { return _data_start_ptr; } + constexpr const_iterator cbegin() const OV_LIFETIME_BOUND { return _data_start_ptr; } - constexpr iterator end() { return begin() + get_index_as_size_t(_size); } - constexpr const_iterator end() const { return begin() + get_index_as_size_t(_size); } - constexpr const_iterator cend() const { return cbegin() + get_index_as_size_t(_size); } + constexpr iterator end() OV_LIFETIME_BOUND { return begin() + get_index_as_size_t(_size); } + constexpr const_iterator end() const OV_LIFETIME_BOUND { return begin() + get_index_as_size_t(_size); } + constexpr const_iterator cend() const OV_LIFETIME_BOUND { return cbegin() + get_index_as_size_t(_size); } using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; - constexpr reverse_iterator rbegin() { return reverse_iterator(end()); } - constexpr const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } - constexpr const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); } + constexpr reverse_iterator rbegin() OV_LIFETIME_BOUND { return reverse_iterator(end()); } + constexpr const_reverse_iterator rbegin() const OV_LIFETIME_BOUND { return const_reverse_iterator(end()); } + constexpr const_reverse_iterator crbegin() const OV_LIFETIME_BOUND { return const_reverse_iterator(end()); } - constexpr reverse_iterator rend() { return reverse_iterator(begin()); } - constexpr const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } - constexpr const_reverse_iterator crend() const { return const_reverse_iterator(begin()); } + constexpr reverse_iterator rend() OV_LIFETIME_BOUND { return reverse_iterator(begin()); } + constexpr const_reverse_iterator rend() const OV_LIFETIME_BOUND { return const_reverse_iterator(begin()); } + constexpr const_reverse_iterator crend() const OV_LIFETIME_BOUND { return const_reverse_iterator(begin()); } - constexpr T& operator[](const size_type typed_index) { + constexpr T& operator[](const size_type typed_index) OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(typed_index, "operator[]"); return _data_start_ptr[get_index_as_size_t(typed_index)]; } - constexpr T const& operator[](const size_type typed_index) const { + constexpr T const& operator[](const size_type typed_index) const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(typed_index, "operator[]"); return _data_start_ptr[get_index_as_size_t(typed_index)]; } - constexpr T& front() { + constexpr T& front() OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("front"); return *begin(); } - constexpr T const& front() const { + constexpr T const& front() const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("front"); return *cbegin(); } - constexpr T& back() { + constexpr T& back() OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("back"); return *(end()-1); } - constexpr T const& back() const { + constexpr T const& back() const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("back"); return *(cend()-1); } template - constexpr iterator emplace_back(Args&&... args) { + constexpr iterator emplace_back(Args&&... args) OV_LIFETIME_BOUND { if (_size >= _max_size) { return end(); } diff --git a/src/openvic-simulation/core/stl/containers/RingBuffer.hpp b/src/openvic-simulation/core/stl/containers/RingBuffer.hpp index aa635d4a4..c886df666 100644 --- a/src/openvic-simulation/core/stl/containers/RingBuffer.hpp +++ b/src/openvic-simulation/core/stl/containers/RingBuffer.hpp @@ -216,86 +216,86 @@ namespace OpenVic::stl { } private: - reference _unsafe_access(const size_type index) { + reference _unsafe_access(const size_type index) OV_LIFETIME_BOUND { return _data[_ring_wrap(_offset + index, capacity())]; } - const_reference _unsafe_access(const size_type index) const { + const_reference _unsafe_access(const size_type index) const OV_LIFETIME_BOUND { return _data[_ring_wrap(_offset + index, capacity())]; } public: - reference front() { + reference front() OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("front"); return _unsafe_access(0); } - reference back() { + reference back() OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("back"); return _unsafe_access(size() - 1); } - const_reference back() const { + const_reference back() const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_NONEMPTY("back"); return _unsafe_access(size() - 1); } - const_reference operator[](const size_type index) const { + const_reference operator[](const size_type index) const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(index, "operator[]"); return _unsafe_access(index); } - reference operator[](const size_type index) { + reference operator[](const size_type index) OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(index, "operator[]"); return _unsafe_access(index); } - const_reference at(const size_type index) const { + const_reference at(const size_type index) const OV_LIFETIME_BOUND { if (OV_unlikely(index >= size())) { _abort_on_out_of_range("at", "index", index, size()); } return _unsafe_access(index); } - reference at(const size_type index) { + reference at(const size_type index) OV_LIFETIME_BOUND { if (OV_unlikely(index >= size())) { _abort_on_out_of_range("at", "index", index, size()); } return _unsafe_access(index); } - iterator begin() noexcept { + iterator begin() noexcept OV_LIFETIME_BOUND { return iterator(&_data[0], _offset, 0, _capacity); } - iterator end() noexcept { + iterator end() noexcept OV_LIFETIME_BOUND { return iterator(&_data[0], _offset, size(), _capacity); } - const_iterator begin() const noexcept { + const_iterator begin() const noexcept OV_LIFETIME_BOUND { return const_iterator(&_data[0], _offset, 0, _capacity); } const_iterator end() const noexcept { return const_iterator(&_data[0], _offset, size(), _capacity); } - const_iterator cbegin() const noexcept { + const_iterator cbegin() const noexcept OV_LIFETIME_BOUND { return const_cast(*this).begin(); } - const_iterator cend() const noexcept { + const_iterator cend() const noexcept OV_LIFETIME_BOUND { return const_cast(*this).end(); } - reverse_iterator rbegin() noexcept { + reverse_iterator rbegin() noexcept OV_LIFETIME_BOUND { return reverse_iterator(end()); } - reverse_iterator rend() noexcept { + reverse_iterator rend() noexcept OV_LIFETIME_BOUND { return reverse_iterator(begin()); } - const_reverse_iterator rbegin() const noexcept { + const_reverse_iterator rbegin() const noexcept OV_LIFETIME_BOUND { return const_reverse_iterator(end()); } - const_reverse_iterator rend() const noexcept { + const_reverse_iterator rend() const noexcept OV_LIFETIME_BOUND { return const_reverse_iterator(begin()); } - const_reverse_iterator crbegin() const noexcept { + const_reverse_iterator crbegin() const noexcept OV_LIFETIME_BOUND { return const_cast(*this).rbegin(); } - const_reverse_iterator crend() const noexcept { + const_reverse_iterator crend() const noexcept OV_LIFETIME_BOUND { return const_cast(*this).rend(); } @@ -416,7 +416,7 @@ namespace OpenVic::stl { } template - reference emplace_front(Args&&... args) { + reference emplace_front(Args&&... args) OV_LIFETIME_BOUND { if (capacity() == 0) { // A buffer of size zero is conceptually sound, so let's support it. return (*this)[0]; @@ -440,7 +440,7 @@ namespace OpenVic::stl { } template - reference emplace_back(Args&&... args) { + reference emplace_back(Args&&... args) OV_LIFETIME_BOUND { if (capacity() == 0) { // A buffer of size zero is conceptually sound, so let's support it. return (*this)[0]; @@ -459,7 +459,7 @@ namespace OpenVic::stl { /// Appends the range between first (inclusive) and last (exclusive) to end(). /// If size() + (last - first) > capacity(), rotates the front elements to the back and overwrites them. template - iterator append(InputIt first, InputIt last) { + iterator append(InputIt first, InputIt last) OV_LIFETIME_BOUND { using distance_type = typename std::iterator_traits::difference_type; const size_type _capacity = capacity(); @@ -516,14 +516,14 @@ namespace OpenVic::stl { /// Appends the range from first (inclusive) upto count to end(). /// If size() + count > capacity(), rotates the front elements to the back and overwrites them. template - iterator append(InputIt first, size_type count) { + iterator append(InputIt first, size_type count) OV_LIFETIME_BOUND { return append(first, first + count); } /// Appends the range to after end, truncated by write_size. /// If size() + (end(range) - begin(range)) > capacity(), rotates the front elements to the back and overwrites them template - iterator append_range(Range&& range, size_type write_size = std::numeric_limits::max()) { + iterator append_range(Range&& range, size_type write_size = std::numeric_limits::max()) OV_LIFETIME_BOUND { if (write_size < capacity()) { auto end = ranges::begin(range); ranges::advance(end, std::min(ranges::distance(range), write_size)); @@ -616,9 +616,7 @@ namespace OpenVic::stl { _next = 0; } - iterator erase(const_iterator from, const_iterator to) noexcept( - noexcept(pop_front()) && std::is_nothrow_move_assignable::value - ) { + iterator erase(const_iterator from, const_iterator to) OV_LIFETIME_BOUND { if (OV_unlikely(from > end() || to > end())) { return std::bit_cast(from); } @@ -701,12 +699,12 @@ namespace OpenVic::stl { return result; } - iterator erase(const_iterator pos, size_type count) noexcept(noexcept(erase(pos, pos + count))) { + iterator erase(const_iterator pos, size_type count) OV_LIFETIME_BOUND { const_iterator last = pos; std::advance(last, count); return erase(pos, last); } - iterator erase(const_iterator pos) noexcept(noexcept(erase(pos, 1))) { + iterator erase(const_iterator pos) OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_VALID_ITERATOR(pos, "erase(const_iterator)"); return erase(pos, 1); } @@ -767,7 +765,7 @@ namespace OpenVic::stl { --_size; } - pointer _allocate(const size_type new_capacity) { + pointer _allocate(const size_type new_capacity) OV_LIFETIME_BOUND { return allocator_traits::allocate(_allocator, new_capacity + 1); } diff --git a/src/openvic-simulation/core/stl/containers/StackString.hpp b/src/openvic-simulation/core/stl/containers/StackString.hpp index 15aca796f..263913e45 100644 --- a/src/openvic-simulation/core/stl/containers/StackString.hpp +++ b/src/openvic-simulation/core/stl/containers/StackString.hpp @@ -7,6 +7,7 @@ #include "openvic-simulation/core/Assert.hpp" #include "openvic-simulation/core/memory/String.hpp" +#include "openvic-simulation/core/Typedefs.hpp" namespace OpenVic { template @@ -20,7 +21,7 @@ namespace OpenVic { constexpr StackString() {} public: - constexpr const char* data() const { + constexpr const char* data() const OV_LIFETIME_BOUND { return _array.data(); } @@ -32,15 +33,15 @@ namespace OpenVic { return _string_size; } - constexpr decltype(_array)::const_iterator begin() const { + constexpr decltype(_array)::const_iterator begin() const OV_LIFETIME_BOUND { return _array.begin(); } - constexpr decltype(_array)::const_iterator end() const { + constexpr decltype(_array)::const_iterator end() const OV_LIFETIME_BOUND { return begin() + size(); } - constexpr decltype(_array)::const_reference operator[](size_t index) const { + constexpr decltype(_array)::const_reference operator[](size_t index) const OV_LIFETIME_BOUND { OV_HARDEN_ASSERT_ACCESS(index, "operator[]"); return _array[index]; } diff --git a/src/openvic-simulation/core/string/StringLiteral.hpp b/src/openvic-simulation/core/string/StringLiteral.hpp index 0935e3d39..8b5c1687e 100644 --- a/src/openvic-simulation/core/string/StringLiteral.hpp +++ b/src/openvic-simulation/core/string/StringLiteral.hpp @@ -7,6 +7,7 @@ #include #include "openvic-simulation/core/stl/BasicIterator.hpp" +#include "openvic-simulation/core/Typedefs.hpp" namespace OpenVic { template @@ -61,42 +62,42 @@ namespace OpenVic { _data[size()] = '\0'; } - [[nodiscard]] constexpr const_iterator begin() const noexcept { + [[nodiscard]] constexpr const_iterator begin() const noexcept OV_LIFETIME_BOUND { return const_iterator(_data); } - [[nodiscard]] constexpr const_iterator end() const noexcept { + [[nodiscard]] constexpr const_iterator end() const noexcept OV_LIFETIME_BOUND { return const_iterator(_data + size()); } - [[nodiscard]] constexpr const_iterator cbegin() const noexcept { + [[nodiscard]] constexpr const_iterator cbegin() const noexcept OV_LIFETIME_BOUND { return begin(); } - [[nodiscard]] constexpr const_iterator cend() const noexcept { + [[nodiscard]] constexpr const_iterator cend() const noexcept OV_LIFETIME_BOUND { return end(); } - [[nodiscard]] constexpr const_reverse_iterator rbegin() const noexcept { + [[nodiscard]] constexpr const_reverse_iterator rbegin() const noexcept OV_LIFETIME_BOUND { return const_reverse_iterator(end()); } - [[nodiscard]] constexpr const_reverse_iterator rend() const noexcept { + [[nodiscard]] constexpr const_reverse_iterator rend() const noexcept OV_LIFETIME_BOUND { return const_reverse_iterator(begin()); } - [[nodiscard]] constexpr const_reverse_iterator crbegin() const noexcept { + [[nodiscard]] constexpr const_reverse_iterator crbegin() const noexcept OV_LIFETIME_BOUND { return rbegin(); } - [[nodiscard]] constexpr const_reverse_iterator crend() const noexcept { + [[nodiscard]] constexpr const_reverse_iterator crend() const noexcept OV_LIFETIME_BOUND { return rend(); } - [[nodiscard]] constexpr const_reference front() const noexcept { + [[nodiscard]] constexpr const_reference front() const noexcept OV_LIFETIME_BOUND { return as_string_view().front(); } - [[nodiscard]] constexpr const_reference back() const noexcept { + [[nodiscard]] constexpr const_reference back() const noexcept OV_LIFETIME_BOUND { return as_string_view().back(); } - [[nodiscard]] constexpr const_reference at(size_type pos) const { + [[nodiscard]] constexpr const_reference at(size_type pos) const OV_LIFETIME_BOUND { return as_string_view().at(pos); } - [[nodiscard]] constexpr const_reference operator[](size_type pos) const noexcept { + [[nodiscard]] constexpr const_reference operator[](size_type pos) const noexcept OV_LIFETIME_BOUND { return _data[pos]; } @@ -199,7 +200,7 @@ namespace OpenVic { return result; } - [[nodiscard]] constexpr string_literal const& substr() const noexcept { + [[nodiscard]] constexpr string_literal const& substr() const noexcept OV_LIFETIME_BOUND { return *this; } @@ -236,23 +237,23 @@ namespace OpenVic { return as_string_view().compare(0, size(), literal, N2 - 1); } - [[nodiscard]] constexpr operator std::basic_string_view() const { + [[nodiscard]] constexpr operator std::basic_string_view() const OV_LIFETIME_BOUND { return as_string_view(); } - [[nodiscard]] constexpr std::basic_string_view as_string_view() const { + [[nodiscard]] constexpr std::basic_string_view as_string_view() const OV_LIFETIME_BOUND { return std::basic_string_view(_data, size()); } - [[nodiscard]] constexpr operator value_type const*() const { + [[nodiscard]] constexpr operator value_type const*() const OV_LIFETIME_BOUND { return c_str(); } - [[nodiscard]] constexpr value_type const* c_str() const { + [[nodiscard]] constexpr value_type const* c_str() const OV_LIFETIME_BOUND { return _data; } - [[nodiscard]] constexpr value_type const* data() const { + [[nodiscard]] constexpr value_type const* data() const OV_LIFETIME_BOUND { return _data; }