// --------
// Copy.c++
// --------

#include <algorithm> // copy
#include <cassert>   // assert
#include <cstring>   // strcmp, strlen
#include <iostream>  // cout, endl

char* my_copy1 (const char* b, const char* e, char* x) {
    while (b != e) {
        *x = *b;
        ++b;
        ++x;}
    return x;}

template <typename II, typename OI>
OI my_copy2 (II b, II e, OI x) {
    while (b != e) {
        *x = *b;
        ++b;
        ++x;}
    return x;}

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

    const char a[] = "abCbA";
    const int  s   = strlen(a);

    {
    char x[] = "xxxxxxxx";
    const char* const p = copy(a, a + s, x);
    assert(strcmp(x, "abCbAxxx") == 0);
    assert(p - x == s);
    assert(!strncmp(x, "abCbA", s));
    }

    {
    char x[] = "xxxxxxxx";
    const char* const p = my_copy1(a, a + s, x);
    assert(strcmp(x, "abCbAxxx")  == 0);
    assert(p - x == s);
    assert(strncmp(x, "abCbA", s) == 0);
    }

    {
    char x[] = "xxxxxxxx";
    const char* const p = my_copy2(a, a + s, x);
    assert(strcmp(x, "abCbAxxx")  == 0);
    assert(p - x == s);
    assert(strncmp(x, "abCbA", s) == 0);
    }

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


syntax highlighted by Code2HTML, v. 0.9.1