Listing 5: Class gslice

class gslice {
public:
    gslice()
        : _Start(0) {}
    gslice(size_t _S, const _Sizarray& _L,
        const _Sizarray& _D)
        : _Start(_S), _Len(_L), _Stride(_D) {}
    size_t start() const
        {return (_Start); }
    _Sizarray size() const
        {return (_Len); }
    _Sizarray stride() const
        {return (_Stride); }
    size_t _Nslice() const
        {return (_Len.size()); }
    size_t _Off(_Sizarray& _Idx) const
        {size_t _I, _K = _Start;
        for (_I = 0; _I < _Idx.size(); ++_I)
            _K += _Idx[_I] * _Stride[_I];
        while (0 < _I--)
            if (++_Idx[_I] < _Len[_I])
                break;
            else
                _Idx[_I] = 0;
        return (_K); }
    size_t _Totlen() const
        {if (_Len.size() == 0)
            return (0);
        size_t _L = _Len[0];
        for (size_t _I = 0; ++_I < _Len.size(); )
            _L *= _Len[_I];
        return (_L); }
private:
    size_t _Start;
    _Sizarray _Len;
    _Sizarray _Stride;
    };
//End of File