19 #ifndef INCLUDE_RCF_HEAP_HPP 20 #define INCLUDE_RCF_HEAP_HPP 27 #include <RCF/ThreadLibrary.hpp> 28 #include <RCF/Tools.hpp> 32 template<
typename Element,
typename Compare = std::less<Element> >
41 Heap(
const Compare & compare) : mCompare(compare)
45 void add(
const Element & element)
47 mStore.push_back(element);
48 std::push_heap(mStore.begin(), mStore.end(), mCompare);
51 void remove(
const Element & element)
53 RCF::eraseRemove(mStore, element);
54 std::make_heap(mStore.begin(), mStore.end(), mCompare);
59 return *mStore.begin();
62 const Element & top()
const 64 return *mStore.begin();
69 std::pop_heap(mStore.begin(), mStore.end(), mCompare);
73 std::size_t size()
const 80 return mStore.empty();
88 void setCompare(
const Compare & compare,
bool reorder =
true)
94 std::make_heap(mStore.begin(), mStore.end(), mCompare);
101 std::vector<Element> mStore;
112 TimerCompare(std::uint32_t baseTimeMs) :
113 mBaseTimeMs(baseTimeMs)
120 const std::pair<std::uint32_t, T> & lhs,
121 const std::pair<std::uint32_t, T> & rhs)
123 std::uint32_t lhsTimeMs = lhs.first - mBaseTimeMs;
124 std::uint32_t rhsTimeMs = rhs.first - mBaseTimeMs;
127 std::make_pair(lhsTimeMs, lhs.second)
128 > std::make_pair(rhsTimeMs, rhs.second);
133 std::uint32_t mBaseTimeMs;
149 Lock lock(mTimerHeapMutex);
151 std::uint32_t timeNowMs = RCF::getCurrentTimeMs();
152 if (timeNowMs - mBaseTimeMs > 1000*60*60)
154 mBaseTimeMs = mTimerHeap.empty() ?
155 timeNowMs - 1000*10 :
156 mTimerHeap.top().first - 1000*10;
158 mTimerHeap.setCompare( TimerCompare(mBaseTimeMs),
false );
163 typedef std::pair<std::uint32_t, T> TimerEntry;
165 void add(
const TimerEntry & timerEntry)
167 Lock lock(mTimerHeapMutex);
168 mTimerHeap.add(timerEntry);
172 void remove(
const TimerEntry & timerEntry)
174 Lock lock(mTimerHeapMutex);
175 mTimerHeap.remove(timerEntry);
178 bool compareTop(
const TimerEntry & timerEntry)
180 Lock lock(mTimerHeapMutex);
181 if (mTimerHeap.empty())
185 return mTimerHeap.top() == timerEntry;
188 std::size_t size()
const 190 Lock lock(mTimerHeapMutex);
191 return mTimerHeap.size();
196 Lock lock(mTimerHeapMutex);
197 return mTimerHeap.empty();
202 Lock lock(mTimerHeapMutex);
206 bool popExpiredEntry(TimerEntry & timerEntry)
208 Lock lock(mTimerHeapMutex);
210 if ( !mTimerHeap.empty()
211 && getTimeoutMs( mTimerHeap.top() ) == 0)
213 timerEntry= mTimerHeap.top();
221 bool getExpiredEntry(TimerEntry & timerEntry)
223 Lock lock(mTimerHeapMutex);
225 if ( !mTimerHeap.empty()
226 && getTimeoutMs( mTimerHeap.top() ) == 0)
228 timerEntry= mTimerHeap.top();
235 std::uint32_t getNextEntryTimeoutMs()
237 Lock lock(mTimerHeapMutex);
239 return mTimerHeap.empty() ?
241 getTimeoutMs(mTimerHeap.top());
246 std::uint32_t getTimeoutMs(
const TimerEntry & timerEntry)
248 return generateTimeoutMs(timerEntry.first);
251 std::uint32_t mBaseTimeMs;
253 mutable Mutex mTimerHeapMutex;
254 Heap<TimerEntry, TimerCompare> mTimerHeap;
260 #endif // ! INCLUDE_RCF_HEAP_HPP Definition: AmiIoHandler.hpp:24