DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
BinarySearchQueueModel.hxx
Go to the documentation of this file.
1// Declarations for BinarySearchQueueModel
2
3namespace dunedaq {
4namespace datahandlinglibs {
5
6template<typename T>
7typename IterableQueueModel<T>::Iterator
9{
10 unsigned int start_index =
11 IterableQueueModel<T>::readIndex_.load(std::memory_order_relaxed); // NOLINT(build/unsigned)
12 unsigned int end_index =
13 IterableQueueModel<T>::writeIndex_.load(std::memory_order_acquire); // NOLINT(build/unsigned)
14
15 if (start_index == end_index) {
16 TLOG() << "Queue is empty" << std::endl;
18 }
19 end_index = end_index == 0 ? IterableQueueModel<T>::size_ - 1 : end_index - 1;
20
21 T& left_element = IterableQueueModel<T>::records_[start_index];
22
23 if (element < left_element) {
24 TLOG() << "Could not find element" << std::endl;
26 }
27
28 while (true) {
29 unsigned int diff =
30 start_index <= end_index ? end_index - start_index : IterableQueueModel<T>::size_ + end_index - start_index;
31 unsigned int middle_index = start_index + ((diff + 1) / 2);
32 if (middle_index >= IterableQueueModel<T>::size_)
33 middle_index -= IterableQueueModel<T>::size_;
34 T& element_between = IterableQueueModel<T>::records_[middle_index];
35
36 //if we landed on our element, let's get out of here.
37 if (element.get_timestamp()==element_between.get_timestamp())
38 return typename IterableQueueModel<T>::Iterator(*this, middle_index);
39
40 if ( diff == 0 ) {
41
42 //if we satisfy the lower_bound condition, we have the right index
43 if(element < element_between)
44 return typename IterableQueueModel<T>::Iterator(*this, middle_index);
45
46 //if we don't, we need to increment one up. for safety check size too
47 if(++middle_index >= IterableQueueModel<T>::size_)
48 middle_index -= IterableQueueModel<T>::size_;
49
50 return typename IterableQueueModel<T>::Iterator(*this, middle_index);
51 }
52
53 if (element < element_between) {
54 end_index = middle_index != 0 ? middle_index - 1 : IterableQueueModel<T>::size_ - 1;
55 } else {
56 start_index = middle_index;
57 }
58 }
59}
60
61} // namespace datahandlinglibs
62} // namespace dunedaq
IterableQueueModel< T >::Iterator lower_bound(T &element, bool=false)
#define TLOG(...)
Definition macro.hpp:22
Including Qt Headers.