concept RandomAccessNDImageViewConcept<Regular View> {
    typename value_type;
    typename reference;       
    typename difference_type; 
    typename const_t;  where RandomAccessNDImageViewConcept<View>; 
    typename point_t;  where PointNDConcept<point_t>; 
    typename locator;  where RandomAccessNDLocatorConcept<locator>; 
    typename iterator; where RandomAccessTraversalConcept<iterator>; 
    typename reverse_iterator; where RandomAccessTraversalConcept<reverse_iterator>; 
    typename size_type;       
    
    template <size_t D> struct axis {
        typename coord_t = point_t::axis<D>::coord_t;
        typename iterator; where RandomAccessTraversalConcept<iterator>;   
        where SameType<coord_t, iterator::difference_type>;
        where SameType<iterator::value_type,value_type>;
    };
    
    template <PixelDereferenceAdaptorConcept Deref> struct add_deref {
        typename type;        where RandomAccessNDImageViewConcept<type>;
        static type make(const View& v, const Deref& deref);
    };
    static const size_t num_dimensions = point_t::num_dimensions;
    
    
    View::View(const locator&, const point_type&);
    
    size_type        View::size()       const; 
    reference        operator[](View, const difference_type&) const; 
    iterator         View::begin()      const;
    iterator         View::end()        const;
    reverse_iterator View::rbegin()     const;
    reverse_iterator View::rend()       const;
    iterator         View::at(const point_t&);
    point_t          View::dimensions() const; 
    bool             View::is_1d_traversable() const;   
    
    template <size_t D> View::axis<D>::iterator View::axis_iterator(const point_t&) const;
    reference operator()(View,const point_t&) const;
};