View Javadoc
1   package org.opentrafficsim.road.gtu.lane.perception;
2   
3   import java.util.function.Supplier;
4   
5   import org.djunits.value.vdouble.scalar.Length;
6   import org.opentrafficsim.road.gtu.lane.perception.headway.Headway;
7   
8   /**
9    * Iterable that additionally provides support for PerceptionCollectors. These gather raw data, to only 'perceive' the result.
10   * <p>
11   * Copyright (c) 2013-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
12   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
13   * <p>
14   * @version $Revision$, $LastChangedDate$, by $Author$, initial version 1 mrt. 2018 <br>
15   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
16   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
17   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
18   * @param <H> headway type
19   * @param <U> underlying object type
20   */
21  public interface PerceptionCollectable<H extends Headway, U> extends PerceptionIterable<H>
22  {
23  
24      /**
25       * Collect the underlying objects in to a perceived result. This methodology is loosely based on Stream.collect().
26       * @param collector PerceptionCollector; collector
27       * @param <C> collection result type
28       * @param <I> intermediate type
29       * @return C; collection result
30       */
31      default <C, I> C collect(final PerceptionCollector<C, ? super U, I> collector)
32      {
33          return collect(collector.getIdentity(), collector.getAccumulator(), collector.getFinalizer());
34      }
35  
36      /**
37       * Collect the underlying objects in to a perceived result. This methodology is loosely based on Stream.collect().
38       * @param identity Supplier; the initial intermediate result value
39       * @param accumulator PerceptionAccumulator; accumulator
40       * @param finalizer PerceptionFinalizer; finalizer
41       * @param <C> collection result type
42       * @param <I> intermediate type
43       * @return C; collection result
44       */
45      <C, I> C collect(Supplier<I> identity, PerceptionAccumulator<? super U, I> accumulator,
46              PerceptionFinalizer<C, I> finalizer);
47  
48      /**
49       * Combination of an accumulator and a finalizer.
50       * <p>
51       * Copyright (c) 2013-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
52       * <br>
53       * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
54       * <p>
55       * @version $Revision$, $LastChangedDate$, by $Author$, initial version 28 feb. 2018 <br>
56       * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
57       * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
58       * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
59       * @param <C> collection result type
60       * @param <U> underlying object type
61       * @param <I> intermediate result type
62       */
63      public interface PerceptionCollector<C, U, I>
64      {
65          /**
66           * Returns the identity value, the initial intermediate value.
67           * @return I; identity value, the initial intermediate value
68           */
69          Supplier<I> getIdentity();
70  
71          /**
72           * Returns the accumulator.
73           * @return PerceptionAccumulator; accumulator
74           */
75          PerceptionAccumulator<U, I> getAccumulator();
76  
77          /**
78           * Returns the finalizer.
79           * @return PerceptionFinalizer; finalizer
80           */
81          PerceptionFinalizer<C, I> getFinalizer();
82      }
83  
84      /**
85       * Accumulates an object one at a time in to an accumulating intermediate result.
86       * <p>
87       * Copyright (c) 2013-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
88       * <br>
89       * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
90       * <p>
91       * @version $Revision$, $LastChangedDate$, by $Author$, initial version 28 feb. 2018 <br>
92       * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
93       * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
94       * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
95       * @param <U> underlying object type
96       * @param <I> intermediate result type
97       */
98      public interface PerceptionAccumulator<U, I>
99      {
100         /**
101          * Accumulate the next object to intermediate result.
102          * @param intermediate I; intermediate result before accumulation of object
103          * @param object U; next object to include
104          * @param distance Length; distance to the considered object
105          * @return I; intermediate result after accumulation of object
106          */
107         Intermediate<I> accumulate(Intermediate<I> intermediate, U object, Length distance);
108     }
109 
110     /**
111      * Translates the last intermediate result of an accumulator in to the collection output.
112      * <p>
113      * Copyright (c) 2013-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
114      * <br>
115      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
116      * <p>
117      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 28 feb. 2018 <br>
118      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
119      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
120      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
121      * @param <C> collection result type
122      * @param <I> intermediate result type
123      */
124     public interface PerceptionFinalizer<C, I>
125     {
126         /**
127          * Translate the last intermediate result in to a final result.
128          * @param intermediate I; last intermediate result
129          * @return C; final result
130          */
131         C collect(I intermediate);
132     }
133 
134     /**
135      * Wrapper of intermediate result with info for the iterator algorithm.
136      * <p>
137      * Copyright (c) 2013-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
138      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
139      * <p>
140      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 3 apr. 2018 <br>
141      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
142      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
143      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>]
144      * @param <I> intermediate result type
145      */
146     class Intermediate<I>
147     {
148         /** Number of underlying object being iterated. */
149         private int number = 0;
150 
151         /** Intermediate object. */
152         private I object;
153         
154         /** Whether to stop accumulating. */
155         private boolean stop = false;
156 
157         /** 
158          * Constructor.
159          * @param object I; identity value
160          */
161         public Intermediate(final I object)
162         {
163             this.object = object;
164         }
165 
166         /**
167          * Get intermediate object.
168          * @return I; intermediate object
169          */
170         public I getObject()
171         {
172             return this.object;
173         }
174         
175         /**
176          * Set intermediate object.
177          * @param object I; intermediate object
178          */
179         public void setObject(final I object)
180         {
181             this.object = object;
182         }
183 
184         /**
185          * Returns the number of the underlying object currently being accumulated, starts at 0 for the first.
186          * @return int; number of the underlying object currently being accumulated
187          */
188         public int getNumber()
189         {
190             return this.number;
191         }
192 
193         /**
194          * Method for the iterator the increase the underlying object number.
195          */
196         public void step()
197         {
198             this.number++;
199         }
200         
201         /**
202          * Method for the accumulator to indicate the iterator can stop.
203          */
204         public void stop()
205         {
206             this.stop = true;
207         }
208         
209         /**
210          * Method for the iterator to check if it can stop.
211          * @return boolean; whether the iterator can stop
212          */
213         public boolean isStop()
214         {
215             return this.stop;
216         }
217     }
218 
219 }