#include<boost/iterator/iterator_adaptor.hpp>
#include<boost/range/adaptor/reversed.hpp>
#include<boost/range/algorithm/copy.hpp>
#include<vector>
#include<iostream>

class B {
public:
  B(std::vector<int> vec) : _vec(vec) {}

private:
  std::vector<int> _vec;
  
public:
  // iterator interface
  class const_iterator :
    public boost::iterator_adaptor<const_iterator,
                                   std::vector<int>::const_iterator,
                                   int const,
                                   boost::bidirectional_traversal_tag>
  {
  public:
    const_iterator(std::vector<int>::const_iterator const& vec_it)
      : const_iterator::iterator_adaptor_(vec_it) {}

    const_iterator(const_iterator const& other)
      : const_iterator::iterator_adaptor_(other.base()) {}

  private:
    friend class boost::iterator_core_access;

    int const& dereference() const {
      m_mut_tmp = 2 * (*base());
      //std::cerr << m_mut_tmp << std::endl;
      return m_mut_tmp;
    }

    mutable int m_mut_tmp;
  };

  // iterator type is not in use, necessary to fulfill boosts Range Concept
  typedef const_iterator iterator;
  typedef std::vector<int>::size_type size_type;

  const_iterator begin() const { return const_iterator(_vec.begin()); }
  const_iterator end() const { return const_iterator(_vec.end()); }
  size_type size() const { return _vec.size(); }
};

int main(int argc, char * argv[])
{
  B b({1, 2});

  boost::copy(b | boost::adaptors::reversed, std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
  return 0;
}

// /usr/bin/c++ -g -Wall -std=c++0x -O0 iterator_adaptor_weirdness.cpp -o iterator_adaptor_weirdness 
// /usr/bin/c++ -g -Wall -std=c++0x -O1 iterator_adaptor_weirdness.cpp -o iterator_adaptor_weirdness

// /usr/bin/c++   -g -Wall -std=c++0x -O1 iterator_adaptor_weirdness.cpp.o  -o iterator_adaptor_weirdness -rdynamic -lboost_python -lboost_unit_test_framework-mt -lpython2.7