summaryrefslogtreecommitdiffhomepage
path: root/compat
diff options
context:
space:
mode:
Diffstat (limited to 'compat')
-rw-r--r--compat/vector-wrapper-fwd.hpp5
-rw-r--r--compat/vector-wrapper.hpp15
2 files changed, 11 insertions, 9 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