summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/path-search-result.cpp33
-rw-r--r--src/path-search-result.hpp21
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