Listing 9: Assignment and Subscripting

        // slice_array TEMPLATE FUNCTIONS
template<class Ty> inline
    valarray<Ty>& valarray<Ty>::operator=(
        const slice_array<Ty>& Sl)
    {Grow(Sl.size(), &Sl.Data(Sl.start()),
        Sl.stride(), true);
    return (*this); }
template<class Ty> inline
    valarray<Ty> valarray<Ty>::operator[](slice Sl) const
    {return (valarray<Ty>(slice_array<Ty>(Sl, Ptr))); }
template<class Ty> inline
    slice_array<Ty> valarray<Ty>::operator[](slice Sl)
    {return (slice_array<Ty>(Sl, Ptr)); }

        // gslice_array TEMPLATE FUNCTIONS
template<class Ty> inline
    valarray<Ty>& valarray<Ty>::operator=(
        const gslice_array<Ty>& Gs)
    {Grow(Gs.Totlen(), 0, 0, true);
    Sizarray Idx((size_t)0, Gs.Nslice());
    VALGOP(= Gs.Data(Gs.Off(Idx))); }
template<class Ty> inline
    valarray<Ty> valarray<Ty>::operator[](
        const gslice& Gs) const
    {return (valarray<Ty>(gslice_array<Ty>(Gs, Ptr))); }
template<class Ty> inline
    gslice_array<Ty> valarray<Ty>::operator[](
        const gslice& Gs)
    {return (gslice_array<Ty>(Gs, Ptr)); }

        // mask_array TEMPLATE FUNCTIONS
template<class Ty> inline
    valarray<Ty>& valarray<Ty>::operator=(
        const mask_array<Ty>& Ma)
    {Grow(Ma.Totlen(), 0, 0, true);
    size_t N = 0;
    for (size_t I = 0; I < size(); ++N)
        if (Ma.Mask(N))
            Ptr[I++] = Ma.Data(N);
    return (*this); }
template<class Ty> inline
    valarray<Ty> valarray<Ty>::operator[](
        const Boolarray& Ba) const
    {return (valarray<Ty>(mask_array<Ty>(Ba, Ptr))); }
template<class Ty> inline
    mask_array<Ty> valarray<Ty>::operator[](
        const Boolarray& Ba)
    {return (mask_array<Ty>(Ba, Ptr)); }

        // indirect_array TEMPLATE FUNCTIONS
template<class Ty> inline
    valarray<Ty>& valarray<Ty>::operator=(
        const indirect_array<Ty>& Ia)
    {Grow(Ia.Totlen(), 0, 0, true);
    VALGOP(= Ia.Data(Ia.Indir(I))); }
template<class Ty> inline
    valarray<Ty> valarray<Ty>::operator[](
        const Sizarray& Ia) const
    {return (valarray<Ty>(indirect_array<Ty>(Ia, Ptr))); }
template<class Ty> inline
    indirect_array<Ty> valarray<Ty>::operator[](
        const Sizarray& Ia)
    {return (indirect_array<Ty>(Ia, Ptr)); }
//End of File