summaryrefslogtreecommitdiff
path: root/omegalib/omega/include/basic/Collection.h
blob: 80ddf48dfd7232127747746c0c66db25f51d2912 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#if !defined Already_Included_Collection
#define Already_Included_Collection

namespace omega {
  
template<class T> class Iterator;
template<class T> class Any_Iterator;


//! protocol for any kind of collection
template<class T> class Collection {
public:
    virtual Iterator<T> *new_iterator() = 0;
    virtual Any_Iterator<T>   any_iterator()     { return Any_Iterator<T>(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 T> class Sequence : public Collection<T> {
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<T>; \
					instantiate_Any_Iterator(T)
#define instantiate_Sequence(T) 	template class Sequence<T>; \
					instantiate_Collection(T)

#endif