fix doc example typo
[boost.git] / boost / bimap / vector_of.hpp
blobcacb41fe72915d59f85a4e1f38c214c83f81e156
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)
9 /// \file vector_of.hpp
10 /// \brief Include support for vector constrains for the bimap container
12 #ifndef BOOST_BIMAP_VECTOR_OF_HPP
13 #define BOOST_BIMAP_VECTOR_OF_HPP
15 #if defined(_MSC_VER) && (_MSC_VER>=1200)
16 #pragma once
17 #endif
19 #include <boost/config.hpp>
21 #include <boost/bimap/detail/user_interface_config.hpp>
23 #include <boost/mpl/bool.hpp>
25 #include <boost/concept_check.hpp>
27 #include <boost/bimap/detail/concept_tags.hpp>
29 #include <boost/bimap/tags/support/value_type_of.hpp>
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>
35 #include <boost/multi_index/random_access_index.hpp>
37 #include <boost/bimap/views/vector_map_view.hpp>
38 #include <boost/bimap/views/vector_set_view.hpp>
40 namespace boost {
41 namespace bimaps {
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::vector 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 The first parameter is the type of the objects in the set, and
56 the second one is a Functor that compares them.
57 Bimap binding metafunctions can be used with this class in
58 the following way:
60 \code
61 using namespace support;
63 BOOST_STATIC_ASSERT( is_set_type_of< vector_of<Type> >::value )
65 BOOST_STATIC_ASSERT
67 is_same
69 vector_of<Type>::index_bind
71 KeyExtractor,
72 Tag
74 >::type,
76 random_access< tag<Tag>, KeyExtractor >
78 >::value
81 typedef bimap
83 vector_of<Type>, RightKeyType
85 > bimap_with_left_type_as_vector;
87 BOOST_STATIC_ASSERT
89 is_same
91 vector_of<Type>::map_view_bind
93 member_at::left,
94 bimap_with_left_type_as_vector
96 >::type,
98 vector_map_view< member_at::left, bimap_with_left_type_as_vector >
100 >::value
103 \endcode
105 See also vector_of_relation.
108 template< class Type >
109 struct vector_of : public ::boost::bimaps::detail::set_type_of_tag
111 /// User type, can be tagged
112 typedef Type user_type;
114 /// Type of the object that will be stored in the vector
115 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support::
116 value_type_of<user_type>::type value_type;
119 struct lazy_concept_checked
121 BOOST_CLASS_REQUIRE ( value_type,
122 boost, AssignableConcept );
124 typedef vector_of type;
127 BOOST_BIMAP_GENERATE_INDEX_BINDER_0CP_NO_EXTRACTOR(
129 // binds to
130 multi_index::random_access
133 BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER(
135 // binds to
136 views::vector_map_view
139 BOOST_BIMAP_GENERATE_SET_VIEW_BINDER(
141 // binds to
142 views::vector_set_view
145 typedef mpl::bool_<true> mutable_key;
149 /// \brief Set Of Relation Specification
151 This struct is similar to vector_of but it is bind logically to a
152 relation. It is used in the bimap instantiation to specify the
153 desired type of the main view. This struct implements internally
154 a metafunction named bind_to that manages the quite complicated
155 task of finding the right type of the set for the relation.
157 \code
158 template<class Relation>
159 struct bind_to
161 typedef -unspecified- type;
163 \endcode
165 See also vector_of, is_set_type_of_relation.
168 struct vector_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag
170 BOOST_BIMAP_GENERATE_RELATION_BINDER_0CP(
172 // binds to
173 vector_of
176 typedef mpl::bool_<true> left_mutable_key;
177 typedef mpl::bool_<true> right_mutable_key;
181 } // namespace bimaps
182 } // namespace boost
185 #endif // BOOST_BIMAP_VECTOR_OF_HPP