1 // 2 // Copyright © 2017 Arm Ltd. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #pragma once 6 7 #include "IGraphObservable.hpp" 8 #include "Graph.hpp" 9 10 namespace armnn 11 { 12 13 template <typename ObservedType> 14 class GraphObservable : public IGraphObservable 15 { 16 public: 17 using Iterator = typename std::list<ObservedType>::const_iterator; 18 GraphObservable(Graph & subject,GraphEvent notifyOnEvent)19 GraphObservable(Graph& subject, GraphEvent notifyOnEvent) 20 : m_Subject(&subject) 21 { 22 m_NotifyOnEvent = notifyOnEvent; 23 m_Subject->AttachObservable(this, m_NotifyOnEvent); 24 }; 25 Clear()26 void Clear() { m_ObservedObjects.clear(); }; 27 begin()28 Iterator begin() { return m_ObservedObjects.begin(); } 29 end()30 Iterator end() { return m_ObservedObjects.end(); } 31 32 protected: ~GraphObservable()33 ~GraphObservable() 34 { 35 if (m_Subject) 36 { 37 m_Subject->DetachObservable(this, m_NotifyOnEvent); 38 } 39 } 40 41 GraphEvent m_NotifyOnEvent; 42 Graph* m_Subject; 43 std::list<ObservedType> m_ObservedObjects; 44 }; 45 46 class AddedLayerObservable : public GraphObservable<Layer*> 47 { 48 public: AddedLayerObservable(Graph & subject)49 explicit AddedLayerObservable(Graph& subject) 50 : GraphObservable<Layer*>(subject, GraphEvent::LayerAdded) 51 {}; 52 53 void Update(Layer* graphLayer) override; 54 }; 55 56 class ErasedLayerNamesObservable : public GraphObservable<std::string> 57 { 58 public: ErasedLayerNamesObservable(Graph & subject)59 explicit ErasedLayerNamesObservable(Graph& subject) 60 : GraphObservable<std::string>(subject, GraphEvent::LayerErased) 61 {}; 62 63 void Update(Layer* graphLayer) override; 64 }; 65 66 } //namespace armnn 67 68