3 // Copyright (c) 2006-2007 Matias Capeletto
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)
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>
44 /// \brief Set Type Specification
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
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
61 using namespace support;
63 BOOST_STATIC_ASSERT( is_set_type_of< vector_of<Type> >::value )
69 vector_of<Type>::index_bind
76 random_access< tag<Tag>, KeyExtractor >
83 vector_of<Type>, RightKeyType
85 > bimap_with_left_type_as_vector;
91 vector_of<Type>::map_view_bind
94 bimap_with_left_type_as_vector
98 vector_map_view< member_at::left, bimap_with_left_type_as_vector >
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(
130 multi_index::random_access
133 BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER(
136 views::vector_map_view
139 BOOST_BIMAP_GENERATE_SET_VIEW_BINDER(
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.
158 template<class Relation>
161 typedef -unspecified- type;
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(
176 typedef mpl::bool_
<true> left_mutable_key
;
177 typedef mpl::bool_
<true> right_mutable_key
;
181 } // namespace bimaps
185 #endif // BOOST_BIMAP_VECTOR_OF_HPP