//=======================================================================
// 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 <vector>
#include <string>
#include <boost/property_map/property_map.hpp>

#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;
  function_requires < Mutable_LvaluePropertyMapConcept < pmap_t, int > >();
  return 0;
}
