summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2017-05-26 07:59:18 +0100
committerMaxime Coste <mawww@kakoune.org>2017-05-26 07:59:18 +0100
commit6e389512f548d3efdb4f25407fb51e0cbbdc8051 (patch)
treeaba75712ba2f8a7c8832113778f341066cf0bdb9 /src
parentca38e103148807c3a4b18f1e0bc36732553fcbd8 (diff)
Modernize the way we compute memory domains from type
Use a constexpr function instead of a template type
Diffstat (limited to 'src')
-rw-r--r--src/memory.hh12
-rw-r--r--src/meta.hh3
-rw-r--r--src/vector.hh2
3 files changed, 8 insertions, 9 deletions
diff --git a/src/memory.hh b/src/memory.hh
index 4d41c0c0..fe6f70ea 100644
--- a/src/memory.hh
+++ b/src/memory.hh
@@ -6,6 +6,7 @@
#include <utility>
#include "assert.hh"
+#include "meta.hh"
namespace Kakoune
{
@@ -141,14 +142,11 @@ bool operator!=(const Allocator<T1, d1>& lhs, const Allocator<T2, d2>& rhs)
return d1 != d2;
}
+
+constexpr MemoryDomain memory_domain(Meta::AnyType) { return MemoryDomain::Undefined; }
+
template<typename T>
-struct TypeDomain
-{
- static constexpr MemoryDomain domain() { return TypeDomain<T>::helper((T*)nullptr); }
-private:
- template<typename U> static decltype(U::Domain) constexpr helper(U*) { return U::Domain; }
- static constexpr MemoryDomain helper(...) { return MemoryDomain::Undefined; }
-};
+constexpr decltype(T::Domain) memory_domain(Meta::Type<T>) { return T::Domain; }
template<MemoryDomain d>
struct UseMemoryDomain
diff --git a/src/meta.hh b/src/meta.hh
index 70a99428..04c343d5 100644
--- a/src/meta.hh
+++ b/src/meta.hh
@@ -6,7 +6,8 @@ namespace Kakoune
inline namespace Meta
{
-template<typename T> struct Type {};
+struct AnyType{};
+template<typename T> struct Type : AnyType {};
}
diff --git a/src/vector.hh b/src/vector.hh
index c8cc9d08..e149998d 100644
--- a/src/vector.hh
+++ b/src/vector.hh
@@ -8,7 +8,7 @@
namespace Kakoune
{
-template<typename T, MemoryDomain domain = TypeDomain<T>::domain()>
+template<typename T, MemoryDomain domain = memory_domain(Meta::Type<T>{})>
using Vector = std::vector<T, Allocator<T, domain>>;
}