// Copyright 2001, FreeHEP. package org.freehep.postscript; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; /** * Objects for PostScript Processor, as defined in 3.3 Data Types and Objects * * @author Mark Donszelmann * @version $Id: PSDictionary.java 8958 2006-09-12 23:37:43Z duns $ */ public class PSDictionary extends PSComposite { protected Hashtable table; protected PSDictionary(Hashtable t) { super("dictionary", true); table = t; } public PSDictionary(int n) { this(new Hashtable(n)); } public PSDictionary() { this(new Hashtable()); } public boolean execute(OperandStack os) { os.push(this); return true; } public String getType() { return "dicttype"; } public int capacity() { return table.size(); } public int size() { return table.size(); } public void put(PSObject key, PSObject value) { table.put(key, value); } public void put(String key, PSObject value) { table.put(new PSName(key), value); } public void put(String key, String value) { table.put(new PSName(key), new PSString(value)); } public void put(String key, int value) { table.put(new PSName(key), new PSInteger(value)); } public void put(String key, double value) { table.put(new PSName(key), new PSReal(value)); } public void put(String key, boolean value) { table.put(new PSName(key), new PSBoolean(value)); } public void put(PSName key, String[] value) { PSArray array = new PSArray(value); array.setLiteral(); put(key, array); } public Object[] keys() { return table.keySet().toArray(); } public PSObject get(PSObject key) { return (PSObject)table.get(key); } public PSObject get(String key) { return (PSObject)table.get(new PSName(key)); } public String getString(String key) { return ((PSString)table.get(new PSName(key))).getValue(); } public PSNumber getNumber(String key) { return (PSNumber)table.get(new PSName(key)); } public int getInteger(String key) { return ((PSInteger)table.get(new PSName(key))).getValue(); } public double getReal(String key) { return ((PSReal)table.get(new PSName(key))).getValue(); } public boolean getBoolean(String key) { return ((PSBoolean)table.get(new PSName(key))).getValue(); } public PSPackedArray getPackedArray(String key) { return (PSPackedArray)table.get(new PSName(key)); } public PSDictionary getDictionary(String key) { return (PSDictionary)table.get(new PSName(key)); } public PSObject remove(PSObject key) { return (PSObject)table.remove(key); } public PSObject remove(String key) { return (PSObject)table.remove(new PSName(key)); } public void copyInto(PSDictionary d) { for (Enumeration e = table.keys(); e.hasMoreElements(); ) { PSObject key = (PSObject)e.nextElement(); PSObject value = (PSObject)table.get(key); d.put(key, value); } } public void forAll(PSArray proc, OperandStack os) { for (Enumeration e = table.keys(); e.hasMoreElements(); ) { PSObject key = (PSObject)e.nextElement(); os.push(key); os.push((PSObject)table.get(key)); proc.execute(os); } } public int hashCode() { return table.hashCode(); } public boolean equals(Object o) { if (o instanceof PSDictionary) { return (table == ((PSDictionary)o).table); } return false; } public Object clone() { return new PSDictionary(table); } public PSObject copy() { Hashtable newTable = new Hashtable(); Iterator i = table.keySet().iterator(); while (i.hasNext()) { Object key = i.next(); newTable.put(key, table.get(key)); } return new PSDictionary(newTable); //throw new RuntimeException("Dictionaries cannot be copied."); } public String cvs() { return toString(); } public String toString() { return "--"+((isExecutable()) ? "*" : "")+ "dictionary ("+size()+")--"; } public String dumpKeys() { StringBuffer out = new StringBuffer(); for (Enumeration e=table.keys(); e.hasMoreElements(); ) { out.append(e.nextElement().toString()); out.append(";"); } return out.toString(); } }