//======================================================================= // Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee, // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= #include #include #include #include #ifdef BOOST_NO_STD_ITERATOR_TRAITS #error This examples requires a compiler that provides a working std::iterator_traits #endif namespace foo { using namespace boost; template < class RandomAccessIterator, class IndexMap > class iterator_property_map:public boost::put_get_helper < typename std::iterator_traits < RandomAccessIterator >::reference, iterator_property_map < RandomAccessIterator, IndexMap > > { public: typedef std::ptrdiff_t key_type; typedef typename std::iterator_traits < RandomAccessIterator >::value_type value_type; typedef typename std::iterator_traits < RandomAccessIterator >::reference reference; typedef boost::lvalue_property_map_tag category; iterator_property_map(RandomAccessIterator cc = RandomAccessIterator(), const IndexMap & _id = IndexMap()):iter(cc), index(_id) { } reference operator[] (std::ptrdiff_t v) const { return *(iter + get(index, v)); } protected: RandomAccessIterator iter; IndexMap index; }; } int main() { typedef std::vector < std::string > vec_t; typedef foo::iterator_property_map < vec_t::iterator, boost::identity_property_map > pmap_t; using namespace boost; BOOST_CONCEPT_ASSERT(( Mutable_LvaluePropertyMapConcept )); return 0; }