1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package Torello.Java.ReadOnly;

import java.util.Comparator;
import java.util.SortedMap;

import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;

class JavaHTMLReadOnlySortedMap<K, V> implements ReadOnlySortedMap<K, V>
{
    private final SortedMap<K, V> sm;

    JavaHTMLReadOnlySortedMap(SortedMap<K, V> sm) { this.sm = sm; }

    public Comparator<? super K> comparator()
    { return sm.comparator(); }

    public ReadOnlySortedMap<K, V> subMap(K fromKey, K toKey)
    { return new JavaHTMLReadOnlySortedMap<>(sm.subMap(fromKey, toKey)); }

    public ReadOnlySortedMap<K, V> headMap(K toKey)
    { return new JavaHTMLReadOnlySortedMap<>(sm.headMap(toKey)); }

    public ReadOnlySortedMap<K, V> tailMap(K fromKey)
    { return new JavaHTMLReadOnlySortedMap<>(sm.tailMap(fromKey)); }

    public K firstKey() { return sm.firstKey(); }
    public K lastKey()  { return sm.lastKey(); }

    public ReadOnlySet<K> keySet()
    { return new JavaHTMLReadOnlySet<>(sm.keySet()); }

    public ReadOnlyCollection<V> values()
    { return new JavaHTMLReadOnlyCollection<>(sm.values()); }

    public ReadOnlySet<ReadOnlyMap.Entry<K, V>> entrySet()
    { return ROHelperEntrySet.toReadOnlyEntrySet(sm.entrySet()); }


    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    // Defined in ReadOnlyMap only
    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

    public V get(Object key)
    { return sm.get(key); }

    public boolean containsValue(Object value)
    { return sm.containsValue(value); }

    public boolean containsKey(Object key)
    { return sm.containsKey(key); }

    public boolean isEmpty()
    { return sm.isEmpty(); }

    public int size()
    { return sm.size(); }


    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    // To Java-Collections Types
    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

    @SuppressWarnings("unchecked")
    public Map<K, V> cloneToMap() 
    {
        if (sm instanceof TreeMap) return (Map<K, V>) ((TreeMap<K, V>) sm).clone();
        return new TreeMap<>(sm);
    }

    public Map<K, V> wrapToImmutableMap()
    { return Collections.unmodifiableMap(sm); }


    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    // java.lang.Object
    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

    public boolean equals(Object other)
    { return ROHelperEquals.roMapEq(this, other); }

    public int hashCode()
    { return sm.hashCode(); }

    public String toString()
    { return sm.toString(); }
}