summaryrefslogtreecommitdiff
path: root/boost/lockfree/detail/parameter.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/lockfree/detail/parameter.hpp')
-rw-r--r--boost/lockfree/detail/parameter.hpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/boost/lockfree/detail/parameter.hpp b/boost/lockfree/detail/parameter.hpp
new file mode 100644
index 0000000000..2e2b068bed
--- /dev/null
+++ b/boost/lockfree/detail/parameter.hpp
@@ -0,0 +1,73 @@
+// boost lockfree
+//
+// Copyright (C) 2011 Tim Blechmann
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_LOCKFREE_DETAIL_PARAMETER_HPP
+#define BOOST_LOCKFREE_DETAIL_PARAMETER_HPP
+
+#include <boost/lockfree/policies.hpp>
+
+namespace boost {
+namespace lockfree {
+namespace detail {
+
+namespace mpl = boost::mpl;
+
+template <typename bound_args, typename tag_type>
+struct has_arg
+{
+ typedef typename parameter::binding<bound_args, tag_type, mpl::void_>::type type;
+ static const bool value = mpl::is_not_void_<type>::type::value;
+};
+
+
+template <typename bound_args>
+struct extract_capacity
+{
+ static const bool has_capacity = has_arg<bound_args, tag::capacity>::value;
+
+ typedef typename mpl::if_c<has_capacity,
+ typename has_arg<bound_args, tag::capacity>::type,
+ mpl::size_t< 0 >
+ >::type capacity_t;
+
+ static const std::size_t capacity = capacity_t::value;
+};
+
+
+template <typename bound_args, typename T>
+struct extract_allocator
+{
+ static const bool has_allocator = has_arg<bound_args, tag::allocator>::value;
+
+ typedef typename mpl::if_c<has_allocator,
+ typename has_arg<bound_args, tag::allocator>::type,
+ std::allocator<T>
+ >::type allocator_arg;
+
+ typedef typename allocator_arg::template rebind<T>::other type;
+};
+
+template <typename bound_args, bool default_ = false>
+struct extract_fixed_sized
+{
+ static const bool has_fixed_sized = has_arg<bound_args, tag::fixed_sized>::value;
+
+ typedef typename mpl::if_c<has_fixed_sized,
+ typename has_arg<bound_args, tag::fixed_sized>::type,
+ mpl::bool_<default_>
+ >::type type;
+
+ static const bool value = type::value;
+};
+
+
+} /* namespace detail */
+} /* namespace lockfree */
+} /* namespace boost */
+
+#endif /* BOOST_LOCKFREE_DETAIL_PARAMETER_HPP */