
class Cache{
public:
    typedef double& proxy ;
    typedef double* iterator ;
    
    Cache( iterator data_) : data(data_){}
    
    inline proxy ref(int i){ return data[i] ; }
    inline proxy ref(int i) const { return data[i] ; }
            
private:    
    iterator data ;
} ;

class Vec {
public:
    typedef double& proxy ;
    
    Vec( double* data_ ) : cache(data_){}
    inline proxy operator[]( int i){ return cache.ref(i) ; }
    inline proxy operator[]( int i) const { return cache.ref(i) ; }
    
private:
    Cache cache ;
} ;

