#if !defined Already_Included_Collection #define Already_Included_Collection namespace omega { template class Iterator; template class Any_Iterator; //! protocol for any kind of collection template class Collection { public: virtual Iterator *new_iterator() = 0; virtual Any_Iterator any_iterator() { return Any_Iterator(new_iterator()); } virtual int size() const = 0; }; /*! * protocol for collections whose elements are ordered * by the way they are entered into the collection, and * whose elements can be accessed by "index" * * note that the implementation need not be a linked list */ template class Sequence : public Collection { public: virtual const T &operator[](int) const = 0; virtual T &operator[](int) = 0; /*! Y in X --> X[X.index(Y)] == Y */ virtual int index(const T &) const = 0; }; } // namespace #define instantiate_Collection(T) template class Collection; \ instantiate_Any_Iterator(T) #define instantiate_Sequence(T) template class Sequence; \ instantiate_Collection(T) #endif