summaryrefslogtreecommitdiffstats
path: root/src/input/detail/policyChain.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/detail/policyChain.h')
-rw-r--r--src/input/detail/policyChain.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/input/detail/policyChain.h b/src/input/detail/policyChain.h
new file mode 100644
index 0000000..efaf371
--- /dev/null
+++ b/src/input/detail/policyChain.h
@@ -0,0 +1,74 @@
+/*
+ # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg
+ #
+ # This program is free software distributed under the GPL version 2.
+ # See http://openslx.org/COPYING
+ #
+ # If you have any feedback please consult http://openslx.org/feedback and
+ # send your suggestions, praise, or complaints to feedback@openslx.org
+ #
+ # General information about OpenSLX can be found at http://openslx.org/
+ # --------------------------------------------------------------------------
+ # detail/policyChain.h:
+ # - Tie together the different bits of policy information a handler may
+ # give us
+ # --------------------------------------------------------------------------
+ */
+
+#ifndef POLICYCHAIN_H_
+#define POLICYCHAIN_H_
+
+#include "typeList.h"
+
+namespace input_policy
+{
+namespace detail
+{
+
+template<typename BaseCase, typename PolicyList>
+struct PolicyChain : public PolicyList::head::template apply_<PolicyChain<BaseCase, typename PolicyList::tail> >
+{
+};
+
+template<typename BaseCase>
+struct PolicyChain<BaseCase, EmptyList> : public BaseCase
+{
+};
+
+}
+}
+
+/////////////////////////////////////////////////////////////////////////
+// Macros that enable specification of policies:
+// A policy is declared like this:
+// template< PARAM1, PARAM2, ... >
+// BEGIN_POLICY_CLASS(MyPolicy) {
+// static const int field1 = 2;
+// ...
+// } END_POLICY_CLASS(MyPolicy);
+/////////////////////////////////////////////////////////////////////////
+#define BEGIN_POLICY_CLASS(policyName) \
+ struct policyName { \
+ template<typename NextPolicy> \
+ struct apply_ : public NextPolicy
+#define END_POLICY_CLASS \
+ ; };
+
+/////////////////////////////////////////////////////////////////////////
+// A macro that enables us to use a template parameter list
+// in a class using a policy, like this:
+//
+// template<POLICY_PARAMS>
+// struct MyPolicyBasedClass
+// {
+// typedef USE_POLICY(baseCase) policy_type;
+// };
+//
+// now, the following type is valid:
+// MyPolicyBasedClass<Policy1, Policy2>
+/////////////////////////////////////////////////////////////////////////
+#define POLICY_PARAMS IMPLICIT_TYPE_LIST_PARAMS(Policy)
+#define POLICY_PARAMS_LIST IMPLICIT_TYPE_LIST(Policy)
+#define USE_POLICY(baseCase) ::input_policy::detail::PolicyChain<baseCase, POLICY_PARAMS_LIST>
+
+#endif /* POLICYCHAIN_H_ */