1 // boost lockfree 2 // 3 // Copyright (C) 2011 Tim Blechmann 4 // 5 // Distributed under the Boost Software License, Version 1.0. (See 6 // accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 9 #ifndef BOOST_LOCKFREE_POLICIES_HPP_INCLUDED 10 #define BOOST_LOCKFREE_POLICIES_HPP_INCLUDED 11 12 #include <boost/parameter/template_keyword.hpp> 13 #include <boost/mpl/bool.hpp> 14 #include <boost/mpl/size_t.hpp> 15 16 namespace boost { 17 namespace lockfree { 18 19 #ifndef BOOST_DOXYGEN_INVOKED 20 namespace tag { struct allocator ; } 21 namespace tag { struct fixed_sized; } 22 namespace tag { struct capacity; } 23 24 #endif 25 26 /** Configures a data structure as \b fixed-sized. 27 * 28 * The internal nodes are stored inside an array and they are addressed by array indexing. This limits the possible size of the 29 * queue to the number of elements that can be addressed by the index type (usually 2**16-2), but on platforms that lack 30 * double-width compare-and-exchange instructions, this is the best way to achieve lock-freedom. 31 * This implies that a data structure is bounded. 32 * */ 33 template <bool IsFixedSized> 34 struct fixed_sized: 35 boost::parameter::template_keyword<tag::fixed_sized, boost::mpl::bool_<IsFixedSized> > 36 {}; 37 38 /** Sets the \b capacity of a data structure at compile-time. 39 * 40 * This implies that a data structure is bounded and fixed-sized. 41 * */ 42 template <size_t Size> 43 struct capacity: 44 boost::parameter::template_keyword<tag::capacity, boost::mpl::size_t<Size> > 45 {}; 46 47 /** Defines the \b allocator type of a data structure. 48 * */ 49 template <class Alloc> 50 struct allocator: 51 boost::parameter::template_keyword<tag::allocator, Alloc> 52 {}; 53 54 } 55 } 56 57 #endif /* BOOST_LOCKFREE_POLICIES_HPP_INCLUDED */ 58