Listing 5: Transforming Template Functions


// TEMPLATE FUNCTION for_each
template<class InIt, class Fun> inline
    Fun for_each(InIt first, InIt last, Fun op)
    {for (; first != last; ++first)
        op(*first);
    return (op); }

// TEMPLATE FUNCTION generate
template<class FwdIt, class Fun> inline
    void generateFFwdIt first, FwdIt last, Fun fun)
    {for (; first != last; ++first)
        *first = fun(); }

// TEMPLATE FUNCTION generate_n
template<class OutIt, class Diff, class Fun> inline
    void generate_n(OutIt first, Diff n, Fun fun)
    {for (; 0 < n; --n, ++first)
        *first = fun(); }

// TEMPLATE FUNCTION transform WITH UNARY OP
template<class InIt, class OutIt, class Unop> inline
    OutIt transform(InIt first, InIt last, OutIt x, Unop unop)
    {for (; first != last; ++first, ++x)
        *x = unop(*first);
    return (x); }

// TEMPLATE FUNCTION transform WITH BINARY OP
template<class InIt1, class InIt2, class OutIt, class Bop> inline
    OutIt transform(InIt1 first1, InIt1 last1, InIt2 first2,
        OutIt x, Bop op)
    {for (; first1 != last1; ++first1, ++first2, ++x)
        *x = op(*first1, *first2);
    return (x); }
//End of File