1// -*- C++ -*- 2/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. 3 Written by James Clark (jjc@jclark.com) 4 5This file is part of groff. 6 7groff is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 2, or (at your option) any later 10version. 11 12groff is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License along 18with groff; see the file COPYING. If not, write to the Free Software 19Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 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 26struct association { 27 symbol s; 28 void *v; 29 association() : v(0) {} 30}; 31 32class dictionary; 33 34class dictionary_iterator { 35 dictionary *dict; 36 int i; 37public: 38 dictionary_iterator(dictionary &); 39 int get(symbol *, void **); 40}; 41 42class dictionary { 43 int size; 44 int used; 45 double threshold; 46 double factor; 47 association *table; 48 void rehash(int); 49public: 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 58class object { 59 int rcount; 60 public: 61 object(); 62 virtual ~object(); 63 void add_reference(); 64 void remove_reference(); 65}; 66 67class object_dictionary; 68 69class object_dictionary_iterator { 70 dictionary_iterator di; 71public: 72 object_dictionary_iterator(object_dictionary &); 73 int get(symbol *, object **); 74}; 75 76class object_dictionary { 77 dictionary d; 78public: 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 89inline int object_dictionary_iterator::get(symbol *sp, object **op) 90{ 91 return di.get(sp, (void **)op); 92} 93