summaryrefslogtreecommitdiff
path: root/asl
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-07-30 00:19:08 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-07-30 00:19:08 +0200
commit9289f825f4e2b30b6197e18896780782cd3a088e (patch)
tree5cddc0a5b86888afc0613cc30c8e9455799d594e /asl
parent4e3fd3eac50d3685a7771b570741f2922c4e3693 (diff)
Add meta module
Diffstat (limited to 'asl')
-rw-r--r--asl/meta/BUILD.bazel18
-rw-r--r--asl/meta/types.hpp14
-rw-r--r--asl/meta/types_tests.cpp16
3 files changed, 48 insertions, 0 deletions
diff --git a/asl/meta/BUILD.bazel b/asl/meta/BUILD.bazel
new file mode 100644
index 0000000..f914bf3
--- /dev/null
+++ b/asl/meta/BUILD.bazel
@@ -0,0 +1,18 @@
+cc_library(
+ name = "meta",
+ hdrs = [
+ "types.hpp",
+ ],
+ visibility = ["//visibility:public"],
+)
+
+cc_test(
+ name = "types_tests",
+ srcs = [
+ "types_tests.cpp",
+ ],
+ deps = [
+ ":meta",
+ ],
+)
+
diff --git a/asl/meta/types.hpp b/asl/meta/types.hpp
new file mode 100644
index 0000000..b5aa192
--- /dev/null
+++ b/asl/meta/types.hpp
@@ -0,0 +1,14 @@
+#pragma once
+
+namespace asl {
+
+template<typename T> using void_t = void;
+
+template<typename T, typename = void>
+inline constexpr bool referenceable = false;
+
+template<typename T>
+inline constexpr bool referenceable<T, void_t<T&>> = true;
+
+} // namespace asl
+
diff --git a/asl/meta/types_tests.cpp b/asl/meta/types_tests.cpp
new file mode 100644
index 0000000..cab9118
--- /dev/null
+++ b/asl/meta/types_tests.cpp
@@ -0,0 +1,16 @@
+#include "asl/meta/types.hpp"
+
+using namespace asl;
+
+static_assert(referenceable<int>);
+static_assert(referenceable<int&>);
+static_assert(referenceable<int&&>);
+static_assert(!referenceable<void>);
+static_assert(referenceable<void*>);
+static_assert(referenceable<void()>);
+static_assert(referenceable<void(*)()>);
+static_assert(!referenceable<void() const>);
+static_assert(!referenceable<void() &>);
+static_assert(!referenceable<void() const &&>);
+
+int main() { return 0; }