// oo_iterator_solution.C
// ----------------------------------------------------------------
// COMP 290-001: Algorithm Library Design, Lutz Kettner, 01/11/2000
// Solution for Exercise 3, an iterator design following OO principles.


// A common base class for all iterators. Assume value type char.
struct Iterator {
    virtual void advance()             = 0;
    virtual bool equal( Iterator* i)   = 0;
    virtual char get()                 = 0;
    virtual ~Iterator() {}
};

// Write a concrete class for an iterator over C-arrays of characters.
class Array_iterator : public Iterator {
    char* s;
public:
    Array_iterator() : s(0) {}
    Array_iterator( char* p) : s(p) {}
    virtual void advance() {
	++s;
    }
    virtual bool equal( Iterator* i) {
	if ( dynamic_cast< Array_iterator*>(i))
	    return s == dynamic_cast< Array_iterator*>(i)->s;
	return false;
    }
    virtual char get() {
	return *s;
    }
};


// Write a generic function that finds a char in a range of two iterators.
// Returns true if c exists in the range [first,last).
bool contains( Iterator* first, Iterator* last, char c) {
    while ( ! first->equal( last)) {
	if ( first->get() == c)
	    return true;
	first->advance();
    }
    return false;
}


// A small test program.
#include <assert.h>

int main() {
    char* s = "Some useless text.";
    Array_iterator* begin = new  Array_iterator(s);
    Array_iterator* last  = new  Array_iterator(s+18);
    assert(   contains( begin, last, 'u'));
    delete begin;
    begin = new  Array_iterator(s);
    assert( ! contains( begin, last, 'q'));
    delete begin;
    delete last;
}

