#include "functional.h"
#include "iostream.h"
#include "tpltutil.h"

#include "algorithm.c++"
#include "numeric.c++"


class MyRandomGenerator
{
  public:
    unsigned long operator()(unsigned long n_);
};

typedef int (*fn_i_i)(int);
typedef int (*fn_ii_i)(int, int);
typedef int (*fn_ccpccp_i)(char const*, char const*);

INSTANTIATE_FN_3(accumulate, int*, int*, int)
INSTANTIATE_FN_4(accumulate, int*, int*, int, divides<int>)
INSTANTIATE_FN_4(accumulate, int*, int*, int, fn_ii_i)
INSTANTIATE_FN_4(accumulate, int*, int*, int, multiplies<int>)
INSTANTIATE_FN_3(adjacent_difference, int*, int*, int*);
INSTANTIATE_FN_4(adjacent_difference, int*, int*, int*, fn_ii_i)
INSTANTIATE_FN_4(binary_search, char**, char**, char*, fn_ccpccp_i)
INSTANTIATE_FN_3(binary_search, int*, int*, int)
INSTANTIATE_FN_4(equal_range, char*, char*, char, less<char>)
INSTANTIATE_FN_3(equal_range, int*, int*, int)
INSTANTIATE_FN_5(includes, char**, char**, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_4(includes, int*, int*, int*, int*)
INSTANTIATE_FN_4(inner_product, int*, int*, int*, int)
INSTANTIATE_FN_6(inner_product, int*, int*, int*, int, plus<int>, multiplies<int>)
INSTANTIATE_FN_6(inner_product, int*, int*, int*, int, fn_ii_i, fn_ii_i)
INSTANTIATE_FN_3(inplace_merge, int*, int*, int*)
INSTANTIATE_FN_4(inplace_merge, int*, int*, int*, greater<int>)
INSTANTIATE_FN_3(make_heap, int*, int*, greater<int>)
INSTANTIATE_FN_3(max_element, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_2(max_element, int*, int*)
INSTANTIATE_FN_6(merge, int*, int*, int*, int*, int*, greater<int>)
INSTANTIATE_FN_3(min_element, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_2(min_element, int*, int*)
INSTANTIATE_FN_3(next_permutation, char*, char*, less<char>)
INSTANTIATE_FN_2(next_permutation, int*, int*)
INSTANTIATE_FN_3(nth_element, int*, int*, int*)
INSTANTIATE_FN_4(nth_element, int*, int*, int*, greater<int>)
INSTANTIATE_FN_4(partial_sort, char**, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_3(partial_sort, int*, int*, int*)
INSTANTIATE_FN_5(partial_sort_copy, char**, char**, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_4(partial_sort_copy, int*, int*, int*, int*)
INSTANTIATE_FN_3(partial_sum, int*, int*, int*)
INSTANTIATE_FN_4(partial_sum, int*, int*, int*, multiplies<int>)
INSTANTIATE_FN_3(partition, int*, int*, binder2nd<less<int> _ int _ int _ int>)
INSTANTIATE_FN_3(partition, int*, int*, fn_i_i)
INSTANTIATE_FN_3(pop_heap, int*, int*, less<int>)
INSTANTIATE_FN_2(prev_permutation, int*, int*)
INSTANTIATE_FN_3(prev_permutation, int*, int*, greater<int>)
INSTANTIATE_FN_2(push_heap, int*, int*)
INSTANTIATE_FN_3(push_heap, int*, int*, greater<int>)
INSTANTIATE_FN_3(push_heap, int*, int*, less<int>)
INSTANTIATE_FN_2(random_shuffle, int*, int*)
INSTANTIATE_FN_3(random_shuffle, int*, int*, MyRandomGenerator)
INSTANTIATE_FN_3(remove, int*, int*, int)
INSTANTIATE_FN_3(remove_if, int*, int*, binder1st<less<int> _ int _ int _ int>)
INSTANTIATE_FN_3(remove_if, int*, int*, fn_i_i)
INSTANTIATE_FN_2(reverse, int*, int*)
INSTANTIATE_FN_3(reverse_copy, int*, int*, int*)
INSTANTIATE_FN_4(rotate_copy, int*, int*, int*, int*)
INSTANTIATE_FN_5(search, char**, char**, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_4(search, int*, int*, int*, int*)
INSTANTIATE_FN_6(set_difference, char*, char*, char*, char*, ostream_iterator<char>, less<char>)
INSTANTIATE_FN_5(set_difference, int*, int*, int*, int*, ostream_iterator<int>)
INSTANTIATE_FN_5(set_difference, int*, int*, int*, int*, int*)
INSTANTIATE_FN_6(set_intersection, char*, char*, char*, char*, ostream_iterator<char>, less<char>)
INSTANTIATE_FN_5(set_intersection, int*, int*, int*, int*, ostream_iterator<int>)
INSTANTIATE_FN_5(set_intersection, int*, int*, int*, int*, int*)
INSTANTIATE_FN_6(set_symmetric_difference, char*, char*, char*, char*, ostream_iterator<char>, less<char>)
INSTANTIATE_FN_5(set_symmetric_difference, int*, int*, int*, int*, ostream_iterator<int>)
INSTANTIATE_FN_5(set_symmetric_difference, int*, int*, int*, int*, int*)
INSTANTIATE_FN_6(set_union, char*, char*, char*, char*, ostream_iterator<char>, less<char>)
INSTANTIATE_FN_5(set_union, int*, int*, int*, int*, ostream_iterator<int>)
INSTANTIATE_FN_5(set_union, int*, int*, int*, int*, int*)
INSTANTIATE_FN_3(sort, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_2(sort, int*, int*)
INSTANTIATE_FN_3(sort, int*, int*, binary_negate<greater<int> _ int _ int>)
INSTANTIATE_FN_3(sort, int*, int*, greater<int>)
INSTANTIATE_FN_3(sort, int*, int*, greater_equal<int>)
INSTANTIATE_FN_3(sort, int*, int*, fn_ii_i)
INSTANTIATE_FN_3(sort, int*, int*, less<int>)
INSTANTIATE_FN_3(sort, int*, int*, less_equal<int>)
INSTANTIATE_FN_2(sort_heap, int*, int*)
INSTANTIATE_FN_3(sort_heap, int*, int*, greater<int>)
INSTANTIATE_FN_3(stable_partition, int*, int*, binder2nd<less<int> _ int _ int _ int>)
INSTANTIATE_FN_3(stable_partition, int*, int*, fn_i_i)
INSTANTIATE_FN_3(stable_sort, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_2(stable_sort, int*, int*)
INSTANTIATE_FN_3(unique, char**, char**, fn_ccpccp_i)
INSTANTIATE_FN_2(unique, int*, int*)
INSTANTIATE_FN_4(upper_bound, char**, char**, char*, fn_ccpccp_i)
INSTANTIATE_FN_3(upper_bound, int*, int*, int)
