// oo_iterator.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:
    .
    .
    .
    .
    .
    .
};


// 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) {
    .
    .
    .
    .
    .
    .
}


// 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'));
    // Note, iterator begin has been advanced to be equal to last here.
    delete begin;
    begin = new  Array_iterator(s);
    assert( ! contains( begin, last, 'q'));
    delete begin;
    delete last;
}

