29 #include <boost/type_traits/remove_reference.hpp>
30 #include <boost/noncopyable.hpp>
32 #include "../runtime/TypeStringTools.h"
44 template<
typename Key,
typename Mapped,
typename Accessor>
49 return make_pair<Key, typename Accessor::result_type> (
pair.
first,
61 template<
typename Container,
typename Accessor = pass_through>
63 detail::pair_adapter<typename Container::key_type,
64 typename Container::mapped_type, Accessor> > {
67 typedef typename boost::remove_reference<typename Accessor::result_type>::type
85 typename Accessor::result_type
106 template<
typename Container>
108 Container, pass_through> {
141 template<
typename Container,
typename Accessor>
146 template<
typename Container,
typename Accessor>
148 Container, Accessor>::operator[](
const key_type& key)
const {
149 typename Container::const_iterator it;
150 if ((it = base_type::container.find(key)) == base_type::container.end()) {
151 throw no_such_key(type_string(
"no such key in container: `%1%'",
152 "no such key in container", key));
155 return this->accessor(it->second);
158 template<
typename Container,
typename Accessor>
161 typename Container::iterator it;
162 if ((it = base_type::container.find(key)) == base_type::container.end()) {
163 throw no_such_key(type_string(
"no such key in container: `%1%'",
164 "no such key in container", key));
167 return this->accessor(it->second);
172 template<
typename Container>
174 Container& container) :
178 template<
typename Container>
182 typename Container::const_iterator it;
184 throw no_such_key(type_string(
"no such key in container: `%1%'",
185 "no such key in container", key));
191 template<
typename Container>
194 typename Container::iterator it;
196 throw no_such_key(type_string(
"no such key in container: `%1%'",
197 "no such key in container", key));
203 template<
typename Container>
206 return base_type::container.find(key);
209 template<
typename Container>
212 return base::container.find(key);
detail::pair< Key, typename Accessor::result_type > result_type
ContainerProxy< Container, pass_through > base_type
container_type & container
base_type::const_iterator find(const key_type &key) const
boost::transform_iterator< Accessor, typename Container::iterator, typename Accessor::result_type > iterator
Container::key_type key_type
detail::force_const< typename Accessor::result_type >::type operator[](const key_type &key) const
boost::mpl::if_< typename boost::is_reference< T >::type, typename boost::add_reference< typename boost::add_const< typename boost::remove_reference< T >::type >::type >::type, typename boost::add_const< T >::type >::type type
_T2 second
second is a copy of the second object
detail::pair_adapter< typename Container::key_type, typename Container::mapped_type, Accessor > base_accessor_type
_T1 first
first is a copy of the first object
pass_through base_accessor_type
const_iterator end() const
boost::remove_reference< typename Accessor::result_type >::type mapped_type
ContainerProxy< Container, pass_through > base
boost::transform_iterator< Accessor, typename Container::const_iterator, typename detail::force_const< typename Accessor::result_type >::type > const_iterator
Container::key_type key_type
result_type operator()(const std::pair< Key, Mapped > &pair) const
ContainerProxy< Container, base_accessor_type > base_type
Container::mapped_type mapped_type
pair holds two objects of arbitrary type.
AssociativeProxy(Container &container)
base_type::iterator find(const key_type &key)