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