msgQ test: implement enumerate() for STL msgq
authorRamprasad Venkataraman <ramv@illinois.edu>
Thu, 28 Jun 2012 15:32:50 +0000 (10:32 -0500)
committerRamprasad Venkataraman <ramv@illinois.edu>
Thu, 28 Jun 2012 16:01:34 +0000 (11:01 -0500)
tests/charm++/queue/msgq.h

index edee8d5dc5532364b2048aa99df162eff06ad362..2ab1d8e9d8cdf8841f27aeff8d4259147f3a74c5 100644 (file)
@@ -41,6 +41,8 @@ class msgQ
         ///
         inline prio_t top_priority() const { return prios.top(); }
 
         ///
         inline prio_t top_priority() const { return prios.top(); }
 
+        ///
+        void enumerate(msg_t **first, msg_t **last) const;
         ///
         friend std::ostream& operator<< (std::ostream &out, const msgQ &q)
         {
         ///
         friend std::ostream& operator<< (std::ostream &out, const msgQ &q)
         {
@@ -50,12 +52,19 @@ class msgQ
         }
 
     private:
         }
 
     private:
+        ///
         size_t qSize;
         size_t qSize;
+        ///
         #if CMK_HAS_STD_UNORDERED_MAP
         std::unordered_map<prio_t, std::deque<const msg_t*> > msgmap;
         #if CMK_HAS_STD_UNORDERED_MAP
         std::unordered_map<prio_t, std::deque<const msg_t*> > msgmap;
+        typedef typename std::unordered_map<prio_t, std::deque<const msg_t*> >::iterator msgmapitr_t;
+        typedef typename std::unordered_map<prio_t, std::deque<const msg_t*> >::const_iterator msgmapconstitr_t;
         #else
         std::map<prio_t, std::deque<const msg_t*> > msgmap;
         #else
         std::map<prio_t, std::deque<const msg_t*> > msgmap;
+        typedef typename std::map<prio_t, std::deque<const msg_t*> >::iterator msgmapitr_t;
+        typedef typename std::map<prio_t, std::deque<const msg_t*> >::const_iterator msgmapconstitr_t;
         #endif
         #endif
+        ///
         std::priority_queue<prio_t, std::vector<prio_t>, std::greater<prio_t> > prios;
 };
 
         std::priority_queue<prio_t, std::vector<prio_t>, std::greater<prio_t> > prios;
 };
 
@@ -116,5 +125,24 @@ const msg_t* msgQ<P>::front() const
     return msgmap[prio].front();
 }
 
     return msgmap[prio].front();
 }
 
+
+
+template <typename P>
+void msgQ<P>::enumerate(msg_t **first, msg_t **last) const
+{
+    if (first >= last)
+        return;
+
+    msg_t **ptr = first;
+    msgmapconstitr_t mapitr = msgmap.begin();
+    while (ptr != last && mapitr != msgmap.end())
+    {
+        std::deque<const msg_t*>::const_iterator itr = mapitr->second.begin();
+        while (ptr != last && itr != mapitr->second.end())
+            *ptr++ = (msg_t*) *itr++;
+        mapitr++;
+    }
+}
+
 #endif // MSG_Q_H
 
 #endif // MSG_Q_H