]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/poll.cpp
Add move semantics to Variant
[libs/core.git] / source / io / poll.cpp
index 6da777cf4470778f4e6401dbcc39f1a3a539b4e7..7aa41e1c330c9ac41ae5ebdf9fa96eb3678a274c 100644 (file)
@@ -1,4 +1,5 @@
-#include <stdexcept>
+#include <msp/core/except.h>
+#include <msp/core/algorithm.h>
 #include "eventobject.h"
 #include "poll.h"
 #include "poll_platform.h"
@@ -9,8 +10,7 @@ namespace Msp {
 namespace IO {
 
 Poller::Poller():
-       priv(new Private),
-       objs_changed(false)
+       priv(new Private)
 { }
 
 Poller::~Poller()
@@ -24,34 +24,39 @@ void Poller::set_object(EventObject &obj, PollEvent ev)
        if(ev)
                obj.get_event_handle();
 
-       EventMap::iterator i = objects.find(&obj);
+       auto i = find_member(objects, &obj, &PolledObject::object);
        if(i!=objects.end())
        {
                if(ev)
-                       i->second = ev;
+                       i->events = ev;
                else
-                       objects.erase(i);
-
-               objs_changed = true;
+               {
+                       *i = objects.back();
+                       objects.pop_back();
+                       objs_changed = true;
+               }
+               events_changed = true;
+               return;
        }
-       else if(ev)
-       {
+
+       if(!ev)
+               return;
+
 #ifdef _WIN32
-               if(objects.size()>=MAXIMUM_WAIT_OBJECTS)
-                       throw logic_error("Maximum number of wait objects reached");
+       if(objects.size()>=MAXIMUM_WAIT_OBJECTS)
+               throw invalid_state("too many objects");
 #endif
-               objects.insert(EventMap::value_type(&obj, ev));
 
-               objs_changed = true;
-       }
+       objects.push_back({ &obj, ev });
+       objs_changed = true;
 }
 
-int Poller::poll()
+unsigned Poller::poll()
 {
        return do_poll(-1);
 }
 
-int Poller::poll(const Time::TimeDelta &timeout)
+unsigned Poller::poll(const Time::TimeDelta &timeout)
 {
        if(timeout<Time::zero)
                throw invalid_argument("Poller::poll");
@@ -59,10 +64,14 @@ int Poller::poll(const Time::TimeDelta &timeout)
        return do_poll(static_cast<int>(timeout/Time::msec));
 }
 
-int Poller::do_poll(int timeout)
+unsigned Poller::do_poll(int timeout)
 {
-       if(objs_changed)
+       if(objs_changed || events_changed)
+       {
                rebuild_array();
+               events_changed = false;
+               objs_changed = false;
+       }
 
        poll_result.clear();
 
@@ -72,7 +81,6 @@ int Poller::do_poll(int timeout)
 }
 
 
-
 PollEvent platform_poll(EventObject &, PollEvent, int);
 
 PollEvent poll(EventObject &obj, PollEvent pe)
@@ -83,7 +91,7 @@ PollEvent poll(EventObject &obj, PollEvent pe)
 PollEvent poll(EventObject &obj, PollEvent pe, const Time::TimeDelta &timeout)
 {
        if(timeout<Time::zero)
-               throw invalid_argument("poll");
+               throw invalid_argument("IO::poll");
 
        return platform_poll(obj, pe, static_cast<int>(timeout/Time::msec));
 }