| Commit | Line | Data |
|---|---|---|
| 92d0a6a6 | 1 | // -*- C++ -*- |
| 4d3e9548 JL |
2 | /* Copyright (C) 1989, 1990, 1991, 1992, 2009 |
| 3 | Free Software Foundation, Inc. | |
| 92d0a6a6 JR |
4 | Written by James Clark (jjc@jclark.com) |
| 5 | ||
| 6 | This file is part of groff. | |
| 7 | ||
| 8 | groff is free software; you can redistribute it and/or modify it under | |
| 9 | the terms of the GNU General Public License as published by the Free | |
| 4d3e9548 JL |
10 | Software Foundation, either version 3 of the License, or |
| 11 | (at your option) any later version. | |
| 92d0a6a6 JR |
12 | |
| 13 | groff is distributed in the hope that it will be useful, but WITHOUT ANY | |
| 14 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 15 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 16 | for more details. | |
| 17 | ||
| 4d3e9548 JL |
18 | You should have received a copy of the GNU General Public License |
| 19 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
| 92d0a6a6 JR |
20 | |
| 21 | ||
| 22 | ||
| 23 | // there is no distinction between name with no value and name with NULL value | |
| 24 | // null names are not permitted (they will be ignored). | |
| 25 | ||
| 26 | struct association { | |
| 27 | symbol s; | |
| 28 | void *v; | |
| 29 | association() : v(0) {} | |
| 30 | }; | |
| 31 | ||
| 32 | class dictionary; | |
| 33 | ||
| 34 | class dictionary_iterator { | |
| 35 | dictionary *dict; | |
| 36 | int i; | |
| 37 | public: | |
| 38 | dictionary_iterator(dictionary &); | |
| 39 | int get(symbol *, void **); | |
| 40 | }; | |
| 41 | ||
| 42 | class dictionary { | |
| 43 | int size; | |
| 44 | int used; | |
| 45 | double threshold; | |
| 46 | double factor; | |
| 47 | association *table; | |
| 48 | void rehash(int); | |
| 49 | public: | |
| 50 | dictionary(int); | |
| 51 | void *lookup(symbol s, void *v=0); // returns value associated with key | |
| 52 | void *lookup(const char *); | |
| 53 | // if second parameter not NULL, value will be replaced | |
| 54 | void *remove(symbol); | |
| 55 | friend class dictionary_iterator; | |
| 56 | }; | |
| 57 | ||
| 58 | class object { | |
| 59 | int rcount; | |
| 60 | public: | |
| 61 | object(); | |
| 62 | virtual ~object(); | |
| 63 | void add_reference(); | |
| 64 | void remove_reference(); | |
| 65 | }; | |
| 66 | ||
| 67 | class object_dictionary; | |
| 68 | ||
| 69 | class object_dictionary_iterator { | |
| 70 | dictionary_iterator di; | |
| 71 | public: | |
| 72 | object_dictionary_iterator(object_dictionary &); | |
| 73 | int get(symbol *, object **); | |
| 74 | }; | |
| 75 | ||
| 76 | class object_dictionary { | |
| 77 | dictionary d; | |
| 78 | public: | |
| 79 | object_dictionary(int); | |
| 80 | object *lookup(symbol nm); | |
| 81 | void define(symbol nm, object *obj); | |
| 82 | void rename(symbol oldnm, symbol newnm); | |
| 83 | void remove(symbol nm); | |
| 84 | int alias(symbol newnm, symbol oldnm); | |
| 85 | friend class object_dictionary_iterator; | |
| 86 | }; | |
| 87 | ||
| 88 | ||
| 89 | inline int object_dictionary_iterator::get(symbol *sp, object **op) | |
| 90 | { | |
| 91 | return di.get(sp, (void **)op); | |
| 92 | } |