1 package org.opentrafficsim.road.network.lane;
2
3 import java.io.Serializable;
4
5 import org.djutils.exceptions.Throw;
6 import org.opentrafficsim.base.HierarchicalType;
7 import org.opentrafficsim.core.compatibility.Compatibility;
8 import org.opentrafficsim.core.compatibility.GTUCompatibility;
9 import org.opentrafficsim.core.gtu.GTUDirectionality;
10 import org.opentrafficsim.core.gtu.GTUType;
11 import org.opentrafficsim.core.network.LongitudinalDirectionality;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public class LaneType extends HierarchicalType<LaneType> implements Serializable, Compatibility<GTUType, LaneType>
28 {
29
30 private static final long serialVersionUID = 20140821L;
31
32
33 private final GTUCompatibility<LaneType> compatibility;
34
35
36 public static final LaneType NONE;
37
38
39 public static final LaneType TWO_WAY_LANE;
40
41
42 public static final LaneType ONE_WAY_LANE;
43
44
45 public static final LaneType FREEWAY;
46
47
48 public static final LaneType HIGHWAY;
49
50
51 public static final LaneType RURAL_ROAD_LANE;
52
53
54 public static final LaneType URBAN_ROAD_LANE;
55
56
57 public static final LaneType RESIDENTIAL_ROAD_LANE;
58
59
60 public static final LaneType BUS_LANE;
61
62
63 public static final LaneType MOPED_PATH;
64
65
66 public static final LaneType BICYCLE_PATH;
67
68
69 public static final LaneType FOOTPATH;
70
71 static
72 {
73 GTUCompatibility<LaneType> noTrafficCompatibility = new GTUCompatibility<>((LaneType) null);
74 NONE = new LaneType("NONE", null, noTrafficCompatibility);
75 GTUCompatibility<LaneType> roadCompatibility = new GTUCompatibility<>((LaneType) null);
76 roadCompatibility.addAllowedGTUType(GTUType.ROAD_USER, LongitudinalDirectionality.DIR_BOTH);
77 TWO_WAY_LANE = new LaneType("TWO_WAY_LANE", null, roadCompatibility);
78 RURAL_ROAD_LANE = new LaneType("RURAL_ROAD", TWO_WAY_LANE, new GTUCompatibility<>(roadCompatibility));
79 URBAN_ROAD_LANE = new LaneType("URBAN_ROAD", TWO_WAY_LANE, new GTUCompatibility<>(roadCompatibility));
80 RESIDENTIAL_ROAD_LANE = new LaneType("RESIDENTIAL_ROAD", TWO_WAY_LANE, new GTUCompatibility<>(roadCompatibility));
81 GTUCompatibility<LaneType> oneWayLaneCompatibility = new GTUCompatibility<>(roadCompatibility);
82 oneWayLaneCompatibility.addAllowedGTUType(GTUType.ROAD_USER, LongitudinalDirectionality.DIR_PLUS);
83 oneWayLaneCompatibility.addAllowedGTUType(GTUType.PEDESTRIAN, LongitudinalDirectionality.DIR_BOTH);
84 ONE_WAY_LANE = new LaneType("ONE_WAY_LANE", oneWayLaneCompatibility);
85 GTUCompatibility<LaneType> highwayLaneCompatibility = new GTUCompatibility<>(oneWayLaneCompatibility)
86 .addAllowedGTUType(GTUType.PEDESTRIAN, LongitudinalDirectionality.DIR_NONE);
87 FREEWAY = new LaneType("FREEWAY", highwayLaneCompatibility);
88 HIGHWAY = new LaneType("FREEWAY", highwayLaneCompatibility);
89 GTUCompatibility<LaneType> busLaneCompatibility = new GTUCompatibility<>(roadCompatibility);
90 busLaneCompatibility.addAllowedGTUType(GTUType.BUS, LongitudinalDirectionality.DIR_BOTH);
91 busLaneCompatibility.addAllowedGTUType(GTUType.ROAD_USER, LongitudinalDirectionality.DIR_NONE);
92 BUS_LANE = new LaneType("BUS_LANE", busLaneCompatibility);
93 GTUCompatibility<LaneType> mopedAndBicycleLaneCompatibility = new GTUCompatibility<>(roadCompatibility);
94 mopedAndBicycleLaneCompatibility.addAllowedGTUType(GTUType.BICYCLE, LongitudinalDirectionality.DIR_BOTH);
95 mopedAndBicycleLaneCompatibility.addAllowedGTUType(GTUType.ROAD_USER, LongitudinalDirectionality.DIR_NONE);
96 MOPED_PATH = new LaneType("MOPED_PATH", mopedAndBicycleLaneCompatibility);
97 GTUCompatibility<LaneType> bicycleOnlyCompatibility = new GTUCompatibility<>(mopedAndBicycleLaneCompatibility);
98 bicycleOnlyCompatibility.addAllowedGTUType(GTUType.MOPED, LongitudinalDirectionality.DIR_NONE);
99 BICYCLE_PATH = new LaneType("BICYCLE_PATH", bicycleOnlyCompatibility);
100 GTUCompatibility<LaneType> pedestriansOnly = new GTUCompatibility<>(roadCompatibility);
101 pedestriansOnly.addAllowedGTUType(GTUType.ROAD_USER, LongitudinalDirectionality.DIR_NONE);
102 FOOTPATH = new LaneType("FOOTPATH", pedestriansOnly);
103 }
104
105
106
107
108
109
110
111
112
113 private LaneType(final String id, final GTUCompatibility<LaneType> compatibility) throws NullPointerException
114 {
115 super(id);
116 Throw.whenNull(compatibility, "compatibility collection cannot be null for LaneType with id = %s", id);
117 this.compatibility = new GTUCompatibility<>(compatibility);
118 }
119
120
121
122
123
124
125 private LaneType(final String id, final boolean inverted)
126 {
127 super(id);
128 this.compatibility = null;
129 }
130
131
132
133
134
135 public final LaneType inv()
136 {
137 return new LaneType(getId(), true);
138 }
139
140
141
142
143
144
145
146
147
148
149 public LaneType(final String id, final LaneType parent, final GTUCompatibility<LaneType> compatibility)
150 throws NullPointerException
151 {
152 super(id, parent);
153 Throw.whenNull(compatibility, "compatibility collection cannot be null for LaneType with id = %s", id);
154 this.compatibility = new GTUCompatibility<>(compatibility);
155 }
156
157
158
159
160
161
162
163
164 @Override
165 public final Boolean isCompatible(final GTUType gtuType, final GTUDirectionality direction)
166 {
167
168
169 return getDirectionality(gtuType).permits(direction);
170 }
171
172
173
174
175
176
177 public final LongitudinalDirectionality getDirectionality(final GTUType gtuType)
178 {
179 LongitudinalDirectionality result = this.compatibility.getDirectionality(gtuType, true);
180 if (null == this.compatibility)
181 {
182 return result.invert();
183 }
184 return result;
185 }
186
187
188
189
190
191
192 public final void addGtuCompatability(final GTUType gtuType, final LongitudinalDirectionality direction)
193 {
194 if (null == this.compatibility)
195 {
196 getParent().addGtuCompatability(gtuType, direction.invert());
197 }
198 else
199 {
200 this.compatibility.addAllowedGTUType(gtuType, direction);
201 }
202 }
203
204
205 @Override
206 @SuppressWarnings("checkstyle:designforextension")
207 public String toString()
208 {
209 return "LaneType [id=" + this.getId() + ", compatibilitySet=" + this.compatibility + "]";
210 }
211
212
213 @Override
214 @SuppressWarnings("checkstyle:designforextension")
215 public int hashCode()
216 {
217 final int prime = 31;
218 int result = super.hashCode();
219 result = prime * result + ((this.compatibility == null) ? 0 : this.compatibility.hashCode());
220 return result;
221 }
222
223
224 @Override
225 @SuppressWarnings("checkstyle:designforextension")
226 public boolean equals(final Object obj)
227 {
228 if (this == obj)
229 {
230 return true;
231 }
232 if (!super.equals(obj))
233 {
234 return false;
235 }
236 if (getClass() != obj.getClass())
237 {
238 return false;
239 }
240 LaneType other = (LaneType) obj;
241 if (this.compatibility == null)
242 {
243 if (other.compatibility != null)
244 {
245 return false;
246 }
247 }
248 else if (!this.compatibility.equals(other.compatibility))
249 {
250 return false;
251 }
252 return true;
253 }
254
255
256 @Override
257 public final LongitudinalDirectionality getDirectionality(final GTUType gtuType, final boolean tryParentsOfGTUType)
258 {
259 LongitudinalDirectionality result = this.compatibility.getDirectionality(gtuType, tryParentsOfGTUType);
260 if (null == this.compatibility)
261 {
262 return result.invert();
263 }
264 return result;
265 }
266
267 }