+
+
+// WorkItem class for event thread
+class PersonInEventWorkItem : public WorkItem
+{
+public:
+ PersonInEventWorkItem(std::set<EngineObserver*> obs, PersonsInfoPtr info) : obs(obs), info(info){
+ }
+ ~PersonInEventWorkItem(){}
+ void run (){
+ for (auto o : obs){
+ o->onPersonsIn(*(info.get()));
+ }
+ }
+private:
+ std::set<EngineObserver*> obs;
+ PersonsInfoPtr info;
+};
+
+class PersonOutEventWorkItem : public WorkItem
+{
+public:
+ PersonOutEventWorkItem(std::set<EngineObserver*> obs, PersonsInfoPtr info) : obs(obs), info(info){
+ }
+ ~PersonOutEventWorkItem(){}
+ void run (){
+ for (auto o : obs){
+ o->onPersonsIn(*(info.get()));
+ }
+ }
+private:
+ std::set<EngineObserver*> obs;
+ PersonsInfoPtr info;
+};
+
+void Engine::onPersonsOut(const std::vector<Person>& p)
+{
+ PersonsInfoPtr pp = std::make_shared<std::vector<Person>>(p);
+ eventThread.enqueue(new PersonOutEventWorkItem(this->observer_list, pp));
+}
+
+void Engine::onPersonsIn(const std::vector<Person>& p)
+{
+ PersonsInfoPtr pp = std::make_shared<std::vector<Person>>(p);
+ eventThread.enqueue(new PersonInEventWorkItem(this->observer_list, pp));
+}
+
+void Engine::onStatusChanged()
+{
+ Person pm, p2;
+ std::vector<Person> ps;
+ ps.push_back(pm);
+ ps.push_back(p2);
+ onPersonsOut(ps);
+}