// @topic S-0314-11-01-10 C++ iterator design pattern I
// @brief C++ pointer is an iterator

#include <iostream>
void pause()
{
    std::cout << "Enter x to exit: ";
    char ch;
    std::cin >> ch;
}
void print( char message[] )
{
    std::cout << "In print: sizeof message is " << sizeof( message ) << '\n';
    // stop when NULL char is found
    // use index syntax to access characters
    int idx = 0;
    for ( ; message[ idx ] != '\0'; ++idx ) {
        std::cout << message[ idx ];
    }
    std::cout << '\n';
}

void print( char* message, int length )
{
    std::cout << "In print2: sizeof message is " << sizeof( message ) << '\n';
    // print all chars for given length
    // use pointer syntax to access characters
    while ( length--  ) {
        std::cout << *message++;
    }
    // childish version:
    while ( length != 0 ) {
        --length;
        std::cout << *message;
        ++message;
    }
    std::cout << '\n';
}

void print( char* from, char* to )
{
    // print all chars in given range
    // use pointer syntax to access characters
    while ( from < to  ) {
        std::cout << *from++;
    }
    std::cout << '\n';
}

int main()
{
    //char message[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
    char message[] = "Hello";
    //                012345
    std::cout << "In main: sizeof message is " << sizeof( message ) << '\n';
    //print( message );
    //print( message, strlen( message ) );
    print( message, message + sizeof( message ) );
    print( message, &message[ 5 ] );
    pause();
    return 0;
}

/*
    If ptr is a pointer, then:
        1).        *ptr    pointer dereference: provides access to the element in memory
        2).     ptr[0]  subscript operator:  does EXACTLY the same thing


*/