Initial Commit
[fltk_mvc_template.git] / _template / src / Observer.cxx
1 ///////////////////////////////////////////////////////////////////////////
2 // Workfile: Observer.cpp
3 // Author: Daniel Giritzer <daniel@giritzer.eu>
4 // Date: 25.03.2018
5 // Description: Interface für eine Observer Klasse.
6 // Remarks: -
7 ///////////////////////////////////////////////////////////////////////////
8
9 #include "Observer.h"
10 #include "Subject.h"
11 #include <algorithm>
12
13 /////////////////////////////////////////////////
14 /// \brief Füge ein zu überwachendes Objekt hinzu.
15 /// \param s Zu überwachendes Objekt.
16 /////////////////////////////////////////////////
17 void Observer::subscribeSubject(Subject* s)
18 {
19     if(s == nullptr)
20         throw std::string("Nullpointer given as Subject!");
21
22     mSubjects.push_back(s);
23     s->subscribeObserver(this);
24 }
25
26 /////////////////////////////////////////////////
27 /// \brief Entferne ein überwachtes Objekt.
28 /// \param s Bereits überwachetes Objekt.
29 /////////////////////////////////////////////////
30 void Observer::unsubscribeSubject(Subject* s)
31 {
32     if(s == nullptr)
33         throw std::string("Nullpointer given as Subject!");
34
35     if(!(std::find(mSubjects.begin(), mSubjects.end(), s) != mSubjects.end()))
36         throw std::string("Not subscribed to this subject!");
37
38
39     mSubjects.remove(s);
40     s->unsubscribeObserver(this);
41 }
42
43 /////////////////////////////////////////////////
44 /// \brief Von Subject Klassen verwendete funktion
45 ///        um Observer über änderungen zu
46 ///        benachrichtigen.
47 /// \param s Objekt mit änderungen.
48 /////////////////////////////////////////////////
49 void Observer::updateObserver(Subject* s)
50 {
51     bool found = false;
52     if(s == nullptr)
53         throw std::string("Nullpointer given as Subject!");
54
55     for(auto curSub : mSubjects)
56     {
57         if(curSub == s)
58         {
59             //Funktionsaufruf der Observer
60             //Implementierung
61             updatedBySubject(curSub);
62             found = true;
63         }
64     }
65
66     if(!found)
67         throw std::string("Update called by unknown Subject!");
68 }