/**************************************************************************
 *
 * alg6.cpp - STL generic algorithms that produce new sequences.
 *
 * $Id: //stdlib/dev/examples/stdlib/tutorial/alg6.cpp#16 $
 *
 ***************************************************************************
 *
 * Copyright (c) 1994-2005 Quovadx,  Inc., acting through its  Rogue Wave
 * Software division. Licensed under the Apache License, Version 2.0 (the
 * "License");  you may  not use this file except  in compliance with the
 * License.    You    may   obtain   a   copy   of    the   License    at
 * http://www.apache.org/licenses/LICENSE-2.0.    Unless   required    by
 * applicable law  or agreed to  in writing,  software  distributed under
 * the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR
 * CONDITIONS OF  ANY KIND, either  express or implied.  See  the License
 * for the specific language governing permissions  and limitations under
 * the License.
 * 
 **************************************************************************/

#include <vector>
#include <list>
#include <functional>
#include <algorithm>
#include <numeric>
#include <iostream>
#include <iterator>
#include <functional>

#include <examples.h>

typedef std::ostream_iterator<int, char, std::char_traits<char> > ostrm_iter_type;


int square (int n) {
    return n * n;
}


class iotaGen {
public:
    iotaGen (int iv) : current (iv)
        { }
    int operator () () {
        return current++;
    }
private:
    int current;
};


// Illustrate the use of the transform algorithm.
void transform_example () {

    // Generate a std::list of values from 1 to 6.
    std::list<int, std::allocator<int> > aList;

    std::generate_n (std::inserter (aList, aList.begin ()), 6, iotaGen (1));
    std::cout << "Original list: ";
    std::copy (aList.begin (), aList.end (), ostrm_iter_type (std::cout, " "));

    std::cout << std::endl;

    // Transform elements by squaring, copy into std::vector.
    std::vector<int, std::allocator<int> > aVec (6);

    std::transform (aList.begin (), aList.end (), aVec.begin (), square);
    std::cout << "After squaring: ";
    std::copy (aVec.begin (), aVec.end (), ostrm_iter_type (std::cout, " "));

    std::cout << std::endl;

    // Transform std::vector again, in place, yielding 4th powers.
    std::transform (aVec.begin (), aVec.end (), aVec.begin (), square);
    std::cout << "After squaring again: ";
    std::copy (aVec.begin (), aVec.end (),ostrm_iter_type (std::cout, " "));

    std::cout << std::endl;

    // Transform in parallel, yielding cubes.
    std::vector<int, std::allocator<int> > cubes (6);

    std::transform (aVec.begin (), aVec.end (), aList.begin (), cubes.begin (),
                   std::divides<int> ());
    std::cout << "After division: ";
    std::copy (cubes.begin (), cubes.end (), ostrm_iter_type (std::cout, " "));

    std::cout << std::endl;
}


// Illustrate the use of the partial sum algorithm.
void partial_sum_example () {

    // Generate values 1 to 5.
    std::vector<int, std::allocator<int> > aVec (5);
    std::generate (aVec.begin (), aVec.end (), iotaGen (1));

    // Output partial sums.
    std::cout << "Partial sums examples" << std::endl;
    std::cout << "Partial sums : ";
    std::partial_sum (aVec.begin (), aVec.end (),
                 ostrm_iter_type (std::cout, " "));

    std::cout << std::endl;

    // Output partial products.
    std::cout << "Partial products: ";
    std::partial_sum (aVec.begin (), aVec.end (),
                 ostrm_iter_type (std::cout, " "), std::multiplies<int> () );

    std::cout << std::endl;
}


// Illustrate the use of the adjacent difference algorithm.
void adjacent_difference_example () {

    // Generate values 1 to 5.
    std::vector<int, std::allocator<int> > aVec (5);
    std::generate (aVec.begin (), aVec.end (), iotaGen (1));

    // Output partial sums.
    std::cout << "Adjacent Differences examples" << std::endl;
    std::cout << "Adjacent Differences : ";
    std::adjacent_difference
        (aVec.begin (), aVec.end (), ostrm_iter_type (std::cout, " "));
    std::cout << std::endl;

    // Output partial products.
    std::cout << "Adjacent sums: ";
    std::adjacent_difference (aVec.begin (), aVec.end (),
                              ostrm_iter_type (std::cout, " "),
                              std::plus<int> ());

    std::cout << std::endl;
}


int main () {

    std::cout << "STL generic algorithms -- that transform sequences"
              << std::endl;

    transform_example ();
    partial_sum_example ();
    adjacent_difference_example ();

    std::cout << "End generic transform algorithms example" << std::endl;

    return 0;
}







