summaryrefslogtreecommitdiffhomepage
path: root/entity/util.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'entity/util.hpp')
-rw-r--r--entity/util.hpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/entity/util.hpp b/entity/util.hpp
new file mode 100644
index 00000000..073745e9
--- /dev/null
+++ b/entity/util.hpp
@@ -0,0 +1,22 @@
+#pragma once
+#include <type_traits>
+
+namespace Corrade::Containers {
+
+template<typename T> class BasicStringView;
+using StringView = BasicStringView<const char>;
+
+} // namespace Corrade::Containers
+
+namespace floormat::entities {
+
+template<typename T, typename = void> struct pass_by_value : std::bool_constant<std::is_fundamental_v<T>> {};
+template<> struct pass_by_value<StringView> : std::true_type {};
+template<typename T> struct pass_by_value<T, std::enable_if_t<std::is_trivially_copy_constructible_v<T> && sizeof(T) <= sizeof(void*)>> : std::true_type {};
+template<typename T> constexpr inline bool pass_by_value_v = pass_by_value<T>::value;
+
+template<typename T> using const_qualified = std::conditional_t<pass_by_value_v<T>, T, const T&>;
+template<typename T> using ref_qualified = std::conditional_t<pass_by_value_v<T>, T, T&>;
+template<typename T> using move_qualified = std::conditional_t<pass_by_value_v<T>, T, T&&>;
+
+} // namespace floormat::entities