///////////////////////////////////////////////////////////////////////////
// FILE: numeric ()
//
// =========================================================================
//
//                          Open Watcom Project
//
// Copyright (c) 2004-2010 The Open Watcom Contributors. All Rights Reserved.
//
//    This file is automatically generated. Do not edit directly.
//
// =========================================================================
//
// Description: This header is part of the C++ standard library.
///////////////////////////////////////////////////////////////////////////
#ifndef _NUMERIC_INCLUDED
#define _NUMERIC_INCLUDED

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file;
#endif

#ifndef __cplusplus
 #error This header file requires C++
#endif

namespace std {

  // accumulate
  // **********

  template< class InputIterator, class Type >
  Type accumulate( InputIterator first, InputIterator last, Type init )
  {
    Type result( init );
    while( first != last ) {
      result = result + *first;
      ++first;
    }
    return( result );
  }

  template< class InputIterator, class Type, class BinaryOperation >
  Type accumulate(
    InputIterator first,
    InputIterator last,
    Type init,
    BinaryOperation bin_op )
  {
    Type result( init );
    while( first != last ) {
      result = bin_op( result, *first );
      ++first;
    }
    return( result );
  }

  // inner_product
  // *************

  template< class InputIterator1, class InputIterator2, class Type >
  Type inner_product(
    InputIterator1 first1,
    InputIterator1 last1,
    InputIterator2 first2,
    Type init )
  {
    Type result( init );
    while( first1 != last1 ) {
      result = result + ( *first1 ) * ( *first2 );
      ++first1;
      ++first2;
    }
    return( result );
  }

  template< class InputIterator1, class InputIterator2, class Type,
            class BinaryOperation1, class BinaryOperation2 >
  Type inner_product(
    InputIterator1 first1,
    InputIterator1 last1,
    InputIterator2 first2,
    Type init,
    BinaryOperation1 bin_op1,
    BinaryOperation2 bin_op2 )
  {
    Type result( init );
    while( first1 != last1 ) {
      result = bin_op1( result, bin_op2( *first1, *first2 ) );
      ++first1;
      ++first2;
    }
    return( result );
  }

  // partial_sum
  // ***********

  template< class InputIterator, class OutputIterator >
  OutputIterator partial_sum(
    InputIterator first, InputIterator last, OutputIterator result )
  {
    if( first == last ) return( result );

    typename iterator_traits< InputIterator >::value_type acc( *first );
    *result = acc;
    ++first;
    ++result;

    while( first != last ) {
      acc = acc + *first;
      *result = acc;
      ++first;
      ++result;
    }
    return( result );
  }

  template< class InputIterator, class OutputIterator, class BinaryOperation >
  OutputIterator partial_sum(
    InputIterator first,
    InputIterator last,
    OutputIterator result,
    BinaryOperation bin_op )
  {
    if( first == last ) return( result );

    typename iterator_traits< InputIterator >::value_type acc( *first );
    *result = acc;
    ++first;
    ++result;

    while( first != last ) {
      acc = bin_op( acc, *first );
      *result = acc;
      ++first;
      ++result;
    }
    return( result );
  }

  // adjacent_difference
  // *******************

  template< class InputIterator, class OutputIterator >
  OutputIterator adjacent_difference(
    InputIterator first,
    InputIterator last,
    OutputIterator result )
  {
    if( first == last ) return( result );

    typename iterator_traits< InputIterator >::value_type previous( *first );
    *result = previous;
    ++first;
    ++result;

    while( first != last ) {
      typename iterator_traits< InputIterator >::value_type temp( *first );
      *result = temp - previous;
      previous = temp;
      ++first;
      ++result;
    }
    return( result );
  }

  template< class InputIterator, class OutputIterator, class BinaryOperation >
  OutputIterator adjacent_difference(
    InputIterator first,
    InputIterator last,
    OutputIterator result,
    BinaryOperation bin_op )
  {
    if( first == last ) return( result );

    typename iterator_traits< InputIterator >::value_type previous( *first );
    *result = previous;
    ++first;
    ++result;

    while( first != last ) {
      typename iterator_traits< InputIterator >::value_type temp( *first );
      *result = bin_op( temp, previous );
      previous = temp;
      ++first;
      ++result;
    }
    return( result );
  }

} // namespace std

#endif
