Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / nsgmls / NamedTable.h
1 /* $XConsortium: NamedTable.h /main/2 1996/08/13 10:09:04 mgreess $ */
2 // Copyright (c) 1994 James Clark
3 // See the file COPYING for copying permission.
4
5 #ifndef NamedTable_INCLUDED
6 #define NamedTable_INCLUDED 1
7
8 #include "Hash.h"
9 #include "StringC.h"
10 #include "Named.h"
11 #include "OwnerTable.h"
12
13 #ifdef SP_NAMESPACE
14 namespace SP_NAMESPACE {
15 #endif
16
17 class NamedTableKeyFunction {
18 public:
19   static inline const StringC &key(const Named &obj) { return obj.name(); }
20 };
21
22 template<class T> class NamedTableIter;
23 template<class T> class ConstNamedTableIter;
24
25 template<class T>
26 class NamedTable {
27 public:
28   NamedTable() { }
29   T *insert(T *p) { return (T *)table_.insert(p); }
30   T *lookup(const StringC &str) const { return (T *)table_.lookup(str); }
31   T *remove(const StringC &str) { return (T *)table_.remove(str); }
32   size_t count() const { return table_.count(); }
33   void clear() { table_.clear(); }
34   void swap(NamedTable<T> &to) { table_.swap(to.table_); }
35 private:
36   NamedTable(const NamedTable<T> &) {}
37   void operator=(const NamedTable<T> &) {}
38   OwnerTable<Named, StringC, Hash, NamedTableKeyFunction>
39     table_;
40   friend class NamedTableIter<T>;
41   friend class ConstNamedTableIter<T>;
42 };
43
44 template<class T>
45 class NamedTableIter {
46 public:
47   NamedTableIter(const NamedTable<T> &table) : iter_(table.table_) { }
48   T *next() { return (T *)iter_.next(); }
49 private:
50   OwnerTableIter<Named, StringC, Hash, NamedTableKeyFunction> iter_;
51 };
52
53 template<class T>
54 class ConstNamedTableIter {
55 public:
56   ConstNamedTableIter(const NamedTable<T> &table) : iter_(table.table_) { }
57   const T *next() { return (T *)iter_.next(); }
58 private:
59   OwnerTableIter<Named, StringC, Hash, NamedTableKeyFunction> iter_;
60 };
61
62 #ifdef SP_NAMESPACE
63 }
64 #endif
65
66 #endif /* not NamedTable_INCLUDED */