Add Boost.Test karmic valgrind suppressions
[senf.git] / boost_ext / boost / bimap / list_of.hpp
1 // Boost.Bimap
2 //
3 // Copyright (c) 2006-2007 Matias Capeletto
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8
9 /// \file list_of.hpp
10 /// \brief Include support for list constrains for the bimap container
11
12 #ifndef BOOST_BIMAP_LIST_OF_HPP
13 #define BOOST_BIMAP_LIST_OF_HPP
14
15 #if defined(_MSC_VER) && (_MSC_VER>=1200)
16 #pragma once
17 #endif
18
19 #include <boost/config.hpp>
20
21 #include <boost/bimap/detail/user_interface_config.hpp>
22
23 #include <boost/mpl/bool.hpp>
24
25 #include <boost/concept_check.hpp>
26
27 #include <boost/bimap/detail/concept_tags.hpp>
28
29 #include <boost/bimap/tags/support/value_type_of.hpp>
30
31 #include <boost/bimap/detail/generate_index_binder.hpp>
32 #include <boost/bimap/detail/generate_view_binder.hpp>
33 #include <boost/bimap/detail/generate_relation_binder.hpp>
34
35 #include <boost/multi_index/sequenced_index.hpp>
36
37 #include <boost/bimap/views/list_map_view.hpp>
38 #include <boost/bimap/views/list_set_view.hpp>
39
40 namespace boost {
41 namespace bimaps {
42
43
44 /// \brief Set Type Specification
45 /**
46 This struct is used to specify a set specification.
47 It is not a container, it is just a metaprogramming facility to
48 express the type of a set. Generally, this specification will
49 be used in other place to create a container.
50 It has the same syntax that an std::list instantiation, except
51 that the allocator cannot be specified. The rationale behind
52 this difference is that the allocator is not part of the set
53 type specification, rather it is a container configuration
54 parameter.
55
56 \code
57 using namespace support;
58
59 BOOST_STATIC_ASSERT( is_set_type_of< list_of<Type> >::value )
60
61 BOOST_STATIC_ASSERT
62 (
63      is_same
64      <
65         list_of<Type>::index_bind
66         <
67             KeyExtractor,
68             Tag
69
70         >::type,
71
72         sequenced< tag<Tag>, KeyExtractor >
73
74     >::value
75 )
76
77 typedef bimap
78 <
79     list_of<Type>, RightKeyType
80
81 > bimap_with_left_type_as_list;
82
83 BOOST_STATIC_ASSERT
84 (
85     is_same
86     <
87         list_of<Type>::map_view_bind
88         <
89             member_at::left,
90             bimap_with_left_type_as_list
91
92         >::type,
93         list_map_view< member_at::left, bimap_with_left_type_as_list >
94
95     >::value
96 )
97
98 \endcode
99
100 See also list_of_relation.
101                                                                         **/
102
103 template< class Type >
104 struct list_of : public ::boost::bimaps::detail::set_type_of_tag
105 {
106     /// User type, can be tagged
107     typedef Type user_type;
108
109     /// Type of the object that will be stored in the list
110         typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support::
111                 value_type_of<user_type>::type value_type;
112
113
114     struct lazy_concept_checked
115     {
116         BOOST_CLASS_REQUIRE ( value_type,
117                               boost, AssignableConcept );
118
119         typedef list_of type;
120     };
121
122     BOOST_BIMAP_GENERATE_INDEX_BINDER_0CP_NO_EXTRACTOR(
123
124         // binds to
125         multi_index::sequenced
126     )
127
128     BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER(
129
130         // binds to
131         views::list_map_view
132     )
133
134     BOOST_BIMAP_GENERATE_SET_VIEW_BINDER(
135
136         // binds to
137         views::list_set_view
138     )
139
140     typedef mpl::bool_<true> mutable_key;
141 };
142
143
144 /// \brief List Of Relation Specification
145 /**
146 This struct is similar to list_of but it is bind logically to a
147 relation. It is used in the bimap instantiation to specify the
148 desired type of the main view. This struct implements internally
149 a metafunction named bind_to that manages the quite complicated
150 task of finding the right type of the set for the relation.
151
152 \code
153 template<class Relation>
154 struct bind_to
155 {
156     typedef -unspecified- type;
157 };
158 \endcode
159
160 See also list_of, is_set_type_of_relation.
161                                                                 **/
162
163 struct list_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag
164 {
165     BOOST_BIMAP_GENERATE_RELATION_BINDER_0CP(
166
167         // binds to
168         list_of
169     )
170
171     typedef mpl::bool_<true>  left_mutable_key;
172     typedef mpl::bool_<true> right_mutable_key;
173 };
174
175
176 } // namespace bimaps
177 } // namespace boost
178
179
180 #endif // BOOST_BIMAP_LIST_OF_HPP
181