summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--compat/vector-wrapper-fwd.hpp5
-rw-r--r--compat/vector-wrapper.hpp15
-rw-r--r--loader/ground-cell.cpp1
-rw-r--r--src/path-search-result.cpp2
-rw-r--r--src/path-search-result.hpp2
5 files changed, 13 insertions, 12 deletions
diff --git a/compat/vector-wrapper-fwd.hpp b/compat/vector-wrapper-fwd.hpp
index 4e4ab371..f3da48bc 100644
--- a/compat/vector-wrapper-fwd.hpp
+++ b/compat/vector-wrapper-fwd.hpp
@@ -2,15 +2,14 @@
namespace floormat {
-template<typename T> struct vector_wrapper;
-
enum class vector_wrapper_repr : uint8_t // todo! use this
{
invalid,
lvalue_reference_to_vector,
const_reference_to_vector,
vector,
- //rvalue_reference_to_vector,
};
+template<typename T, vector_wrapper_repr> struct vector_wrapper;
+
} // namespace floormat
diff --git a/compat/vector-wrapper.hpp b/compat/vector-wrapper.hpp
index cb6e7549..5bbb8677 100644
--- a/compat/vector-wrapper.hpp
+++ b/compat/vector-wrapper.hpp
@@ -1,16 +1,19 @@
#pragma once
-#include "vector-wrapper-fwd.hpp" // todo!
+#include "vector-wrapper-fwd.hpp"
#include <vector>
namespace floormat {
-template<typename T>
+template<typename T, vector_wrapper_repr> struct vector_wrapper_traits;
+
+template<typename T> struct vector_wrapper_traits<T, vector_wrapper_repr::lvalue_reference_to_vector> { using vector_type = std::vector<T>&; };
+template<typename T> struct vector_wrapper_traits<T, vector_wrapper_repr::const_reference_to_vector> { using vector_type = const std::vector<T>&; };
+template<typename T> struct vector_wrapper_traits<T, vector_wrapper_repr::vector> { using vector_type = std::vector<T>; };
+
+template<typename T, vector_wrapper_repr R>
struct vector_wrapper final
{
- using vector_type = std::conditional_t<std::is_const_v<T>, const std::vector<std::remove_const_t<T>>, std::vector<T>>;
- using qualified_type = std::conditional_t<std::is_const_v<T>, vector_type, vector_type&>;
-
- qualified_type vec;
+ typename vector_wrapper_traits<T, R>::vector_type vec;
};
} // namespace floormat
diff --git a/loader/ground-cell.cpp b/loader/ground-cell.cpp
index 82829b62..21982bd0 100644
--- a/loader/ground-cell.cpp
+++ b/loader/ground-cell.cpp
@@ -1,5 +1,4 @@
#include "ground-cell.hpp"
-#include "compat/vector-wrapper.hpp"
#include "loader/loader.hpp"
#include "serialize/json-helper.hpp"
//#include "serialize/corrade-string.hpp"
diff --git a/src/path-search-result.cpp b/src/path-search-result.cpp
index d805bd31..afc4bf59 100644
--- a/src/path-search-result.cpp
+++ b/src/path-search-result.cpp
@@ -93,7 +93,7 @@ const point& path_search_result::operator[](size_t index) const
fm_debug_assert(index < _node->vec.size());
return data()[index];
}
-vector_wrapper<point> path_search_result::raw_path() { fm_assert(_node); return {_node->vec}; }
+vector_wrapper<point, vector_wrapper_repr::lvalue_reference_to_vector> path_search_result::raw_path() { fm_assert(_node); return {_node->vec}; }
ArrayView<const point> path_search_result::path() const { fm_assert(_node); return {_node->vec.data(), _node->vec.size()}; }
} // namespace floormat
diff --git a/src/path-search-result.hpp b/src/path-search-result.hpp
index b12b23d3..d29fdc44 100644
--- a/src/path-search-result.hpp
+++ b/src/path-search-result.hpp
@@ -24,7 +24,7 @@ struct path_search_result final
uint32_t distance() const;
void set_distance(uint32_t dist);
- vector_wrapper<point> raw_path();
+ vector_wrapper<point, vector_wrapper_repr::lvalue_reference_to_vector> raw_path();
ArrayView<const point> path() const;
explicit operator ArrayView<const point>() const;
explicit operator bool() const;