
#include <algorithm>
#include <iostream>
#include <array>


    struct range
    {
        struct const_iterator
        {
            const_iterator()
                : r(0), i(0)                                  { }
            const_iterator(range const * range, int index)
                :r(range), i(index)                           { }
            bool operator==(const const_iterator& rhs) const  {  return *r == *(rhs.r) && i == rhs.i; }
            bool operator!=(const const_iterator& rhs) const  {  return !(*this == rhs);              }
            int  operator*()                           const  {  return r->start + i;                 }
            const_iterator&  operator++()                     {  ++i; return *this;                   }
        private:
            range const * r;
            int i;
        };

        range(int astart, int astop)
            : start(astart), count(astop-astart)  { if (count < 0) count = 0;                      }
        range(int cnt)
            : start(0),      count(cnt)           { }
        bool operator==(const range& r)    const  {  return start == r.start && count == r.count;  }
        bool operator!=(const range& r)    const  {  return !(*this == r);                         }
        const_iterator begin()             const  {  return const_iterator(this, 0);               }
        const_iterator end()               const  {  return const_iterator(this, count);           }

    private:
        int start;
        int count;
    };


int main()
{
    using a4M = std::array<uint32_t, 10*10>;
    using AxG = std::vector<a4M>;

    AxG memory;
    uint32_t counter = 0;
    for(auto x: range(10)) {
       a4M block;
       for(auto& elem: block) {
           elem = ++counter;
       }
       memory.push_back(block);
    }

    for(auto& block: memory) {
        for(auto& elem: block) {
            std::cout << int(elem) << ' ';
        }
        std::cout << std::endl;
    }
}
