Object Detection  5.0
Image Processing Using Qt and Opencv
subject.cpp
1 #include "subject.h"
2 
3 using namespace Devices;
4 
5 class Subject::_SubjectImpl{
6 private:
7  Subject *const _ptr;
8  std::vector<Observer*> _observers;
9 public:
10  _SubjectImpl(Subject * const ptr);
11  void addObserver(Observer *obs);
12  void removeObserver(Observer *obs);
13  std::vector<Observer *> getObservers() const;
14 };
15 
16 Subject::~Subject()
17 {
18 
19 }
20 
21 std::vector<Observer *> Subject::getObservers() const
22 {
23  return _pimpl->getObservers();
24 }
25 
26 Subject::Subject(QObject *parent) : QObject(parent),
27  _pimpl{std::make_unique<Subject::_SubjectImpl>(this)}
28 {
29 
30 }
31 
32 void Subject::addObserver(Observer *obs)
33 {
34  _pimpl->addObserver(obs);
35 }
36 
37 void Subject::removeObserver(Observer *obs)
38 {
39  _pimpl->removeObserver(obs);
40 }
41 
42 
43 std::vector<Observer *> Subject::_SubjectImpl::getObservers() const
44 {
45 return _observers;
46 }
47 
48 Subject::_SubjectImpl::_SubjectImpl(Subject *const ptr) : _ptr {ptr}
49 {
50 
51 }
52 
53 void Subject::_SubjectImpl::addObserver(Observer *obs)
54 {
55  if(obs == nullptr)
56  return;
57  QObject::connect(_ptr, SIGNAL(notifyObservers(const ObservableData&)), obs, SLOT(onNotified(const ObservableData&)));
58  _observers.push_back(obs);
59 }
60 
61 void Subject::_SubjectImpl::removeObserver(Observer *obs)
62 {
63  if(obs == nullptr)
64  return;
65  QObject::disconnect(_ptr, SIGNAL(notifyObservers(ObservableData)), obs, SLOT(onNotified(const ObservableData&)));
66  _observers.erase(std::remove_if(_observers.begin(), _observers.end(), [&](Observer* ob){
67  return obs == ob;
68  }));
69 }