18 #ifndef INCLUDE_RCF_HEAP_HPP 19 #define INCLUDE_RCF_HEAP_HPP 26 #include <RCF/ThreadLibrary.hpp> 27 #include <RCF/Tools.hpp> 31 template<
typename Element,
typename Compare = std::less<Element> >
40 Heap(
const Compare & compare) : mCompare(compare)
44 void add(
const Element & element)
46 mStore.push_back(element);
47 std::push_heap(mStore.begin(), mStore.end(), mCompare);
50 void remove(
const Element & element)
52 RCF::eraseRemove(mStore, element);
53 std::make_heap(mStore.begin(), mStore.end(), mCompare);
58 return *mStore.begin();
61 const Element & top()
const 63 return *mStore.begin();
68 std::pop_heap(mStore.begin(), mStore.end(), mCompare);
72 std::size_t size()
const 79 return mStore.empty();
87 void setCompare(
const Compare & compare,
bool reorder =
true)
93 std::make_heap(mStore.begin(), mStore.end(), mCompare);
100 std::vector<Element> mStore;
111 TimerCompare(std::uint32_t baseTimeMs) :
112 mBaseTimeMs(baseTimeMs)
119 const std::pair<std::uint32_t, T> & lhs,
120 const std::pair<std::uint32_t, T> & rhs)
122 std::uint32_t lhsTimeMs = lhs.first - mBaseTimeMs;
123 std::uint32_t rhsTimeMs = rhs.first - mBaseTimeMs;
126 std::make_pair(lhsTimeMs, lhs.second)
127 > std::make_pair(rhsTimeMs, rhs.second);
132 std::uint32_t mBaseTimeMs;
148 Lock lock(mTimerHeapMutex);
150 std::uint32_t timeNowMs = RCF::getCurrentTimeMs();
151 if (timeNowMs - mBaseTimeMs > 1000*60*60)
153 mBaseTimeMs = mTimerHeap.empty() ?
154 timeNowMs - 1000*10 :
155 mTimerHeap.top().first - 1000*10;
157 mTimerHeap.setCompare( TimerCompare(mBaseTimeMs),
false );
162 typedef std::pair<std::uint32_t, T> TimerEntry;
164 void add(
const TimerEntry & timerEntry)
166 Lock lock(mTimerHeapMutex);
167 mTimerHeap.add(timerEntry);
171 void remove(
const TimerEntry & timerEntry)
173 Lock lock(mTimerHeapMutex);
174 mTimerHeap.remove(timerEntry);
177 bool compareTop(
const TimerEntry & timerEntry)
179 Lock lock(mTimerHeapMutex);
180 if (mTimerHeap.empty())
184 return mTimerHeap.top() == timerEntry;
187 std::size_t size()
const 189 Lock lock(mTimerHeapMutex);
190 return mTimerHeap.size();
195 Lock lock(mTimerHeapMutex);
196 return mTimerHeap.empty();
201 Lock lock(mTimerHeapMutex);
205 bool popExpiredEntry(TimerEntry & timerEntry)
207 Lock lock(mTimerHeapMutex);
209 if ( !mTimerHeap.empty()
210 && getTimeoutMs( mTimerHeap.top() ) == 0)
212 timerEntry= mTimerHeap.top();
220 bool getExpiredEntry(TimerEntry & timerEntry)
222 Lock lock(mTimerHeapMutex);
224 if ( !mTimerHeap.empty()
225 && getTimeoutMs( mTimerHeap.top() ) == 0)
227 timerEntry= mTimerHeap.top();
234 std::uint32_t getNextEntryTimeoutMs()
236 Lock lock(mTimerHeapMutex);
238 return mTimerHeap.empty() ?
240 getTimeoutMs(mTimerHeap.top());
245 std::uint32_t getTimeoutMs(
const TimerEntry & timerEntry)
247 return generateTimeoutMs(timerEntry.first);
250 std::uint32_t mBaseTimeMs;
252 mutable Mutex mTimerHeapMutex;
253 Heap<TimerEntry, TimerCompare> mTimerHeap;
259 #endif // ! INCLUDE_RCF_HEAP_HPP Definition: AmiIoHandler.hpp:23