diff options
-rw-r--r-- | src/path-search-result.cpp | 33 | ||||
-rw-r--r-- | src/path-search-result.hpp | 21 |
2 files changed, 42 insertions, 12 deletions
diff --git a/src/path-search-result.cpp b/src/path-search-result.cpp index 065f3d65..2d9f6ebd 100644 --- a/src/path-search-result.cpp +++ b/src/path-search-result.cpp @@ -1,9 +1,38 @@ #include "path-search.hpp" #include "path-search-result.hpp" +#include "compat/assert.hpp" namespace floormat { -path_search_result::path_search_result() = default; -size_t path_search_result::size() const { return _size; } +path_search_result::path_search_result() : _next{nullptr} {} +size_t path_search_result::size() const { return _path.size(); } +path_search_result::operator bool() const { return !_path.empty(); } +path_search_result::operator ArrayView<const global_coords>() const { return {_path.data(), _path.size()}; } +const global_coords* path_search_result::begin() const { return _path.data(); } +const global_coords* path_search_result::end() const { return _path.data() + _path.size(); } + +const global_coords& path_search_result::operator[](size_t index) const +{ + fm_debug_assert(index < _path.size()); + return data()[index]; +} + +const global_coords* path_search_result::data() const +{ + fm_debug_assert(!_next); + return _path.data(); +} + +path_search_result::path_search_result(ArrayView<const global_coords> array) : _next{nullptr} +{ + _path.reserve(std::max(array.size(), min_length)); + _path = {array.begin(), array.end()}; +} + +path_search_result::path_search_result(const path_search_result& other) : _next{nullptr} +{ + _path.reserve(std::max(min_length, other._path.size())); + _path = {other._path.begin(), other._path.end()}; +} } // namespace floormat diff --git a/src/path-search-result.hpp b/src/path-search-result.hpp index bc63a932..7e3f30a7 100644 --- a/src/path-search-result.hpp +++ b/src/path-search-result.hpp @@ -1,31 +1,32 @@ #pragma once #include "src/global-coords.hpp" +#include <vector> namespace floormat { struct path_search_result final { friend class path_search; + path_search_result(); - size_t size() const; + path_search_result(ArrayView<const global_coords> array); + path_search_result(const path_search_result& other); + const global_coords* data() const; const global_coords& operator[](size_t index) const; - explicit operator ArrayView<global_coords>() const; + size_t size() const; + + explicit operator ArrayView<const global_coords>() const; + explicit operator bool() const; const global_coords* begin() const; - const global_coords* cbegin() const; const global_coords* end() const; - const global_coords* cend() const; - const global_coords* data() const; - - explicit operator bool() const; private: static constexpr size_t min_length = TILE_MAX_DIM*2; - path_search_result* _next = nullptr; - global_coords* _path = nullptr; - size_t _size = 0, _reserved = 0; + path_search_result* _next; + std::vector<global_coords> _path; }; } // namespace floormat |