1   package org.djutils.immutablecollections;
2   
3   import java.util.Collection;
4   import java.util.Comparator;
5   import java.util.NavigableSet;
6   import java.util.TreeSet;
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  public class ImmutableTreeSet<E> extends ImmutableAbstractSet<E> implements ImmutableNavigableSet<E>
21  {
22      
23  
24  
25      public ImmutableTreeSet(final Collection<? extends E> sortedSet)
26      {
27          super(new TreeSet<E>(sortedSet), Immutable.COPY);
28      }
29  
30      
31  
32  
33  
34      public ImmutableTreeSet(final NavigableSet<E> treeSet, final Immutable copyOrWrap)
35      {
36          super(copyOrWrap == Immutable.COPY ? new TreeSet<E>(treeSet) : treeSet, copyOrWrap);
37      }
38  
39      
40  
41  
42      public ImmutableTreeSet(final ImmutableAbstractSet<E> immutableSortedSet)
43      {
44          super(new TreeSet<E>(immutableSortedSet.getUnderlyingCollection()), Immutable.COPY);
45      }
46  
47      
48  
49  
50  
51      public ImmutableTreeSet(final ImmutableTreeSet<E> immutableTreeSet, final Immutable copyOrWrap)
52      {
53          super(copyOrWrap == Immutable.COPY ? new TreeSet<E>(immutableTreeSet.getUnderlyingCollection())
54                  : immutableTreeSet.getUnderlyingCollection(), copyOrWrap);
55      }
56  
57      @Override
58      public final NavigableSet<E> toSet()
59      {
60          return new TreeSet<E>(getUnderlyingCollection());
61      }
62  
63      @Override
64      protected NavigableSet<E> getUnderlyingCollection()
65      {
66          return (NavigableSet<E>) super.getUnderlyingCollection();
67      }
68  
69      @Override
70      public final Comparator<? super E> comparator()
71      {
72          return getUnderlyingCollection().comparator();
73      }
74  
75      @Override
76      public final ImmutableSortedSet<E> subSet(final E fromElement, final E toElement)
77      {
78          return new ImmutableTreeSet<E>((TreeSet<E>) getUnderlyingCollection().subSet(fromElement, toElement), Immutable.WRAP);
79      }
80  
81      @Override
82      public final ImmutableSortedSet<E> headSet(final E toElement)
83      {
84          return new ImmutableTreeSet<E>((TreeSet<E>) getUnderlyingCollection().headSet(toElement), Immutable.WRAP);
85      }
86  
87      @Override
88      public final ImmutableSortedSet<E> tailSet(final E fromElement)
89      {
90          return new ImmutableTreeSet<E>((TreeSet<E>) getUnderlyingCollection().tailSet(fromElement), Immutable.WRAP);
91      }
92  
93      @Override
94      public final E first()
95      {
96          return getUnderlyingCollection().first();
97      }
98  
99      @Override
100     public final E last()
101     {
102         return getUnderlyingCollection().last();
103     }
104 
105     @Override
106     public final E lower(final E e)
107     {
108         return getUnderlyingCollection().lower(e);
109     }
110 
111     @Override
112     public final E floor(final E e)
113     {
114         return getUnderlyingCollection().floor(e);
115     }
116 
117     @Override
118     public final E ceiling(final E e)
119     {
120         return getUnderlyingCollection().ceiling(e);
121     }
122 
123     @Override
124     public final E higher(final E e)
125     {
126         return getUnderlyingCollection().higher(e);
127     }
128 
129     @Override
130     public final ImmutableNavigableSet<E> descendingSet()
131     {
132         return new ImmutableTreeSet<E>(getUnderlyingCollection().descendingSet());
133     }
134 
135     @Override
136     public final ImmutableIterator<E> descendingIterator()
137     {
138         return new ImmutableIterator<E>(getUnderlyingCollection().descendingIterator());
139     }
140 
141     @Override
142     public final ImmutableNavigableSet<E> subSet(final E fromElement, final boolean fromInclusive, final E toElement,
143             final boolean toInclusive)
144     {
145         return new ImmutableTreeSet<E>(getUnderlyingCollection().subSet(fromElement, fromInclusive, toElement, toInclusive),
146                 Immutable.WRAP);
147     }
148 
149     @Override
150     public final ImmutableNavigableSet<E> headSet(final E toElement, final boolean inclusive)
151     {
152         return new ImmutableTreeSet<E>(getUnderlyingCollection().headSet(toElement, inclusive), Immutable.WRAP);
153     }
154 
155     @Override
156     public final ImmutableNavigableSet<E> tailSet(final E fromElement, final boolean inclusive)
157     {
158         return new ImmutableTreeSet<E>(getUnderlyingCollection().tailSet(fromElement, inclusive), Immutable.WRAP);
159     }
160 
161     @Override
162     public final String toString()
163     {
164         NavigableSet<E> set = getUnderlyingCollection();
165         if (null == set)
166         {
167             return "ImmutableTreeSet []";
168         }
169         return "ImmutableTreeSet [" + set.toString() + "]";
170     }
171 
172 }