1 package org.opentrafficsim.road.od;
2
3 import java.io.Serializable;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import org.djutils.base.Identifiable;
8 import org.djutils.exceptions.Throw;
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public class Categorization implements Serializable, Identifiable
23 {
24
25
26 public static final Categorization UNCATEGORIZED = new Categorization("Uncategorized");
27
28
29 private static final long serialVersionUID = 20160921L;
30
31
32 private final String id;
33
34
35 private final List<Class<?>> classes = new ArrayList<>();
36
37
38
39
40 private Categorization(final String id)
41 {
42 Throw.whenNull(id, "Id may not be null.");
43 this.id = id;
44 }
45
46
47
48
49
50
51
52
53 public Categorization(final String id, final Class<?> class1, final Class<?>... classes)
54 {
55 this(id);
56 Throw.whenNull(class1, "Classes may not be null.");
57 this.classes.add(class1);
58 for (Class<?> clazz : classes)
59 {
60 Throw.whenNull(clazz, "Classes may not be null.");
61 Throw.when(this.classes.contains(clazz), IllegalArgumentException.class, "Class %s is given multiple times.",
62 clazz);
63 this.classes.add(clazz);
64 }
65 }
66
67
68
69
70
71 public final int size()
72 {
73 return this.classes.size();
74 }
75
76
77
78
79
80
81
82 public final Class<?> get(final int i)
83 {
84 Throw.when(i < 0 || i >= size(), IndexOutOfBoundsException.class,
85 "Index %d is out of range for categorization of size %d.", i, size());
86 return this.classes.get(i);
87 }
88
89
90
91
92 @Override
93 public final String getId()
94 {
95 return this.id;
96 }
97
98
99
100
101
102
103 public final boolean entails(final Class<?> clazz)
104 {
105 for (Class<?> clazz2 : this.classes)
106 {
107 if (clazz.isAssignableFrom(clazz2))
108 {
109 return true;
110 }
111 }
112 return false;
113 }
114
115
116 @Override
117 public final int hashCode()
118 {
119 final int prime = 31;
120 int result = 1;
121 result = prime * result + ((this.classes == null) ? 0 : this.classes.hashCode());
122 return result;
123 }
124
125
126 @Override
127 public final boolean equals(final Object obj)
128 {
129 if (this == obj)
130 {
131 return true;
132 }
133 if (obj == null)
134 {
135 return false;
136 }
137 if (getClass() != obj.getClass())
138 {
139 return false;
140 }
141 Categorization other = (Categorization) obj;
142 if (this.classes == null)
143 {
144 if (other.classes != null)
145 {
146 return false;
147 }
148 }
149 else if (!this.classes.equals(other.classes))
150 {
151 return false;
152 }
153 return true;
154 }
155
156
157 @Override
158 public final String toString()
159 {
160 return "Categorization [id=" + this.id + ", classes=" + this.classes + "]";
161 }
162
163 }