GNU CommonC++
objmap.h
Go to the documentation of this file.
1 // Copyright (C) 2001 Open Source Telecom Corporation.
2 //
3 // This program is free software; you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation; either version 2 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 //
17 // As a special exception to the GNU General Public License, permission is
18 // granted for additional uses of the text contained in its release
19 // of Common C++.
20 //
21 // The exception is that, if you link the Common C++ library with other
22 // files to produce an executable, this does not by itself cause the
23 // resulting executable to be covered by the GNU General Public License.
24 // Your use of that executable is in no way restricted on account of
25 // linking the Common C++ library code into it.
26 //
27 // This exception does not however invalidate any other reasons why
28 // the executable file might be covered by the GNU General Public License.
29 //
30 // This exception applies only to the code released under the
31 // name Common C++. If you copy code from other releases into a copy of
32 // Common C++, as the General Public License permits, the exception does
33 // not apply to the code that you add in this way. To avoid misleading
34 // anyone as to the status of such modified files, you must delete
35 // this exception notice from them.
36 //
37 // If you write modifications of your own for Common C++, it is your choice
38 // whether to permit this exception to apply to your modifications.
39 // If you do not wish that, delete this exception notice.
40 
46 #include <cc++/strchar.h>
47 
48 namespace ost {
49 
58 template <class T, class K, unsigned S>
59 class objMap {
60 protected:
61  static T *objIndex[S];
62  T* objNext;
63  const K objKey;
64 
65  virtual unsigned keyIndex(K k)
66  {
67  unsigned idx = 0;
68  unsigned char *p = (unsigned char *)&k;
69  unsigned len = sizeof(K);
70 
71  while(len--) {
72  idx ^= (idx << 1) ^ *p;
73  ++p;
74  }
75  return idx % S;
76  }
77 
78  inline unsigned getSize(void)
79  {return S;}
80 
81  objMap(const K key)
82  {
83  unsigned idx = keyIndex(key);
84  objKey = key;
85  objNext = objIndex[idx];
86  objIndex[idx] = (T *)this;
87  }
88 public:
89  static T *getObject(keystring key);
90 };
91 
92 template <class T, unsigned S>
93 class keyMap : public objMap<T, keystring, S>
94 {
95  keyMap(keystring key) : objMap<T, keystring, S>(key) {};
96 
97  unsigned keyIndex(keystring k)
98  {
99  unsigned idx = 0;
100  while(*k) {
101  idx = (idx << 1) ^ (unsigned)*k;
102  ++k;
103  }
104  return idx % S;
105  }
106 };
107 
108 template <class T, class K, unsigned S>
110 
111 template <class T, class K, unsigned S>
112 T *objMap<T, K, S>::getObject(const keystring key)
113 {
114  T *obj = objIndex[keyIndex(key)];
115  while(obj) {
116  if(key == obj->objKey)
117  break;
118  obj = obj->objNext;
119  }
120  return obj;
121 }
122 
123 } // namespace