1   package org.opentrafficsim.kpi.sampling;
2   
3   import java.io.Serializable;
4   import java.util.Iterator;
5   import java.util.LinkedHashSet;
6   import java.util.Set;
7   
8   import org.djutils.exceptions.Throw;
9   import org.djutils.immutablecollections.ImmutableIterator;
10  import org.opentrafficsim.kpi.interfaces.LaneDataInterface;
11  import org.opentrafficsim.kpi.interfaces.LinkDataInterface;
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  public class CrossSection implements Serializable
26  {
27  
28      
29      private static final long serialVersionUID = 20160929L;
30  
31      
32      private final Set<KpiDirectedLanePosition> directedLanePositions;
33  
34      
35  
36  
37  
38      public CrossSection(final Set<KpiDirectedLanePosition> directedLanePositions)
39      {
40          Throw.whenNull(directedLanePositions, "Directed lane positions may not be null.");
41          this.directedLanePositions = new LinkedHashSet<>(directedLanePositions);
42      }
43  
44      
45  
46  
47  
48  
49  
50  
51      public CrossSection(final LinkDataInterface link, final KpiGtuDirectionality direction, final double fraction)
52              throws SamplingException
53      {
54          Throw.whenNull(link, "Link lane positions may not be null.");
55          Throw.whenNull(direction, "Direction may not be null.");
56          this.directedLanePositions = new LinkedHashSet<>();
57          for (LaneDataInterface lane : link.getLaneDatas())
58          {
59              KpiDirectedLanePosition directedLanePosition =
60                      new KpiDirectedLanePosition(lane, lane.getLength().times(fraction), direction);
61              this.directedLanePositions.add(directedLanePosition);
62          }
63      }
64  
65      
66  
67  
68      public final int size()
69      {
70          return this.directedLanePositions.size();
71      }
72  
73      
74  
75  
76      public final Set<KpiDirectedLanePosition> getDirectedLanePositions()
77      {
78          return new LinkedHashSet<>(this.directedLanePositions);
79      }
80  
81      
82  
83  
84      public final Iterator<KpiDirectedLanePosition> getIterator()
85      {
86          return new ImmutableIterator<>(this.directedLanePositions.iterator());
87      }
88  
89      
90      @Override
91      @SuppressWarnings("checkstyle:designforextension")
92      public String toString()
93      {
94          return "CrossSection [directedLanePositions=" + this.directedLanePositions + "]";
95      }
96  
97  }