// ---------------------
// FunctionTemplates.c++
// ---------------------

#include <cassert>  // assert
#include <cstring>  // strcmp
#include <iostream> // cout, endl
#include <string>   // string
#include <vector>   // vector

// template
template <typename T>
T my_max (T x, T y) {
    if (x < y)
        return y;
    return x;}

// template
template <typename T>
const T* my_max (const T* x, const T* y) {
    if (*x < *y)
        return y;
    return x;}

// non-template
const char* my_max (const char* x, const char* y) {
    if (std::strcmp(x, y) < 0)
        return y;
    return x;}

// template
template <typename T>
void my_swap (T& x, T& y) {
    T tmp = x;
    x = y;
    y = tmp;}

// template
template <typename T>
void my_swap (std::vector<T>& x, std::vector<T>& y) {
    x.swap(y);}

// non-template
void my_swap (int& x, int& y) {
    assert(&x != &y);
    x ^= y;
    y ^= x;
    x ^= y;}

int main () {
    using namespace std;
    cout << "FunctionTemplates.c++" << endl;

    {
    const int i = 2;
    const int j = 3;
    assert(       my_max              (i,     j)             == 3);
    assert(       my_max              (&i,    &j)            == &j);
    assert(strcmp(my_max              ("abc", "def"), "def") == 0);
//  assert(       my_max              (2,     3.4)           == 3.4); // error: invalid conversion from "int" to "const char*"
    assert(       my_max              (2.0,   3.4)           == 3.4);
    assert(       my_max<      int>   (2,     3.4)           == 3);
    assert(       my_max<      double>(2,     3.4)           == 3.4);
    assert(strcmp(my_max<      char>  ("ggg", "ghi"), "ggg") == 0);   // <T*>
    assert(strcmp(my_max<const char*> ("stu", "pqr"), "stu") == 0);   // <T>
    }

    {
    int i = 2;
    int j = 3;
    my_swap(i, j);
    assert(i == 3);
    assert(j == 2);
    }

    {
    double d = 2;
    double e = 3;
    my_swap(d, e);
    assert(d == 3);
    assert(e == 2);
    }

    {
    vector<int> x(10, 2);
    vector<int> y(20, 3);
    my_swap(x, y);
    assert(x.size() == 20);
    assert(y.size() == 10);
    }

    cout << "Done." << endl;
    return 0;}


syntax highlighted by Code2HTML, v. 0.9.1