#include <iostream>
#include <vector>

template <typename Range>
class counted_view {
    Range r;

    typedef counted_view self;

    typedef decltype(std::begin(r)) nested_iterator;
    typedef decltype(*std::begin(r)) nested_value_type;
public:

    counted_view(Range& r) : r(r) {}

    class iterator
    {
    public:
        iterator(nested_iterator iter) : iter(iter), counter(0) {}

        std::pair<std::size_t, nested_value_type> operator*()
        {
            return std::pair<std::size_t, nested_value_type>(counter, *iter);
        }

        iterator& operator++()
        {
            ++iter;
            ++counter;

            return *this;
        }

        bool operator!=(iterator& other)
        {
            return iter != other.iter;
        }
        
    private:
        nested_iterator iter;
        std::size_t counter;
    };

    iterator begin()
    {
        
        return iterator(std::begin(r));
    }

    iterator end()
    {
        return iterator(std::end(r));
    }
};

template <typename Range>
counted_view<Range> counted(Range& r) {
    return counted_view<Range>(r);
}

int main(int argc, const char * argv[])
{
    std::vector<double> vec = {10,20,30,40,50,60,70,80,90};
    for(auto p : counted(vec))
    {
        std::cout << p.first << ": " << p.second << std::endl;
    }

    // insert code here...
    std::cout << "Hello, World!\n";
    return 0;
}

