KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > retrotranslator > runtime > java > util > EnumMap_


1 /***
2  * Retrotranslator: a Java bytecode transformer that translates Java classes
3  * compiled with JDK 5.0 into classes that can be run on JVM 1.4.
4  *
5  * Copyright (c) 2005 - 2007 Taras Puchko
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the copyright holders nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  */

32 package net.sf.retrotranslator.runtime.java.util;
33
34 import java.io.Serializable JavaDoc;
35 import java.util.*;
36
37 /**
38  * @author Taras Puchko
39  */

40 public class EnumMap_<K extends Enum JavaDoc<K>, V> extends TreeMap<K, V> {
41
42     private static final long serialVersionUID = 3267103726949236459L;
43
44     private final Class JavaDoc<K> keyType;
45
46     public EnumMap_(Class JavaDoc<K> keyType) {
47         super(new EnumComparator());
48         if (!keyType.isEnum()) {
49             throw new NullPointerException JavaDoc();
50         }
51         this.keyType = keyType;
52     }
53
54     public EnumMap_(EnumMap_<K, ? extends V> map) {
55         super(map);
56         this.keyType = map.keyType;
57     }
58
59     public EnumMap_(Map<K, ? extends V> map) {
60         this(getKeyType(map));
61         putAll(map);
62     }
63
64     public V put(K key, V value) {
65         Class JavaDoc<? extends Enum JavaDoc> aClass = key.getClass();
66         if (aClass != keyType && aClass.getSuperclass() != keyType) {
67             throw new ClassCastException JavaDoc(aClass.getName());
68         }
69         return super.put(key, value);
70     }
71
72     public void putAll(Map<? extends K, ? extends V> map) {
73         for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
74             put(entry.getKey(), entry.getValue());
75         }
76     }
77
78     public EnumMap_<K, V> clone() {
79         return (EnumMap_<K, V>) super.clone();
80     }
81
82     private static <K extends Enum JavaDoc<K>, V> Class JavaDoc<K> getKeyType(Map<K, ? extends V> map) {
83         if (map instanceof EnumMap_) {
84             return ((EnumMap_<K, ? extends V>) map).keyType;
85         }
86         if (map.isEmpty()) {
87             throw new IllegalArgumentException JavaDoc();
88         }
89         return map.keySet().iterator().next().getDeclaringClass();
90     }
91
92     private static class EnumComparator implements Comparator, Serializable JavaDoc {
93         public int compare(Object JavaDoc o1, Object JavaDoc o2) {
94             if (o1 instanceof Enum JavaDoc) {
95                 return o2 instanceof Enum JavaDoc ? ((Enum JavaDoc) o1).ordinal() - ((Enum JavaDoc) o2).ordinal() : 1;
96             } else {
97                 return o2 instanceof Enum JavaDoc ? -1 : 0;
98             }
99         }
100     }
101
102 }
103
Popular Tags