aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/variant-wrapper.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil/variant-wrapper.hh')
-rw-r--r--src/libutil/variant-wrapper.hh30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/libutil/variant-wrapper.hh b/src/libutil/variant-wrapper.hh
new file mode 100644
index 000000000..cedcb999c
--- /dev/null
+++ b/src/libutil/variant-wrapper.hh
@@ -0,0 +1,30 @@
+#pragma once
+///@file
+
+// not used, but will be used by callers
+#include <variant>
+
+/**
+ * Force the default versions of all constructors (copy, move, copy
+ * assignment).
+ */
+#define FORCE_DEFAULT_CONSTRUCTORS(CLASS_NAME) \
+ CLASS_NAME(const CLASS_NAME &) = default; \
+ CLASS_NAME(CLASS_NAME &) = default; \
+ CLASS_NAME(CLASS_NAME &&) = default; \
+ \
+ CLASS_NAME & operator =(const CLASS_NAME &) = default; \
+ CLASS_NAME & operator =(CLASS_NAME &) = default;
+
+/**
+ * Make a wrapper constructor. All args are forwarded to the
+ * construction of the "raw" field. (Which we assume is the only one.)
+ *
+ * The moral equivalent of `using Raw::Raw;`
+ */
+#define MAKE_WRAPPER_CONSTRUCTOR(CLASS_NAME) \
+ FORCE_DEFAULT_CONSTRUCTORS(CLASS_NAME) \
+ \
+ CLASS_NAME(auto &&... arg) \
+ : raw(std::forward<decltype(arg)>(arg)...) \
+ { }