Caffa  1.1.0
C++ Application Framework for Embedded Systems with introspection
cafFieldHandle.h
1 #pragma once
2 
3 #include "cafObjectAttribute.h"
4 #include "cafSignal.h"
5 
6 #include <list>
7 #include <memory>
8 #include <string>
9 #include <utility>
10 
11 namespace caffa
12 {
13 class FieldCapability;
14 class ObjectHandle;
15 
16 class Editor;
17 class Inspector;
18 
19 //==================================================================================================
21 //==================================================================================================
23 {
24 public:
25  FieldHandle();
26  ~FieldHandle() override;
27 
28  std::string keyword() const override { return m_keyword; }
29  ObjectHandle* ownerObject();
30 
31  virtual std::string dataType() const = 0;
32 
33  // Capabilities
34  void addCapability( std::unique_ptr<FieldCapability> capability );
35 
36  template <typename CapabilityType>
37  CapabilityType* capability();
38  template <typename CapabilityType>
39  const CapabilityType* capability() const;
40 
45  virtual void accept( Inspector* visitor ) const;
46 
51  virtual void accept( Editor* visitor );
52 
53 protected:
54  bool isInitialized() const { return m_ownerObject != nullptr; }
55 
56  std::list<FieldCapability*> capabilities();
57 
58 private:
59  FieldHandle( const FieldHandle& ) = delete;
60  FieldHandle& operator=( const FieldHandle& ) = delete;
61 
62  friend class ObjectHandle; // Give access to m_ownerObject and set Keyword
63  void setKeyword( const std::string& keyword );
64  ObjectHandle* m_ownerObject;
65 
66  std::string m_keyword;
67 
68  std::list<std::unique_ptr<FieldCapability>> m_capabilities;
69 };
70 
71 //--------------------------------------------------------------------------------------------------
73 //--------------------------------------------------------------------------------------------------
74 template <typename CapabilityType>
75 CapabilityType* FieldHandle::capability()
76 {
77  for ( auto& capabilityPtr : m_capabilities )
78  {
79  CapabilityType* capability = dynamic_cast<CapabilityType*>( capabilityPtr.get() );
80  if ( capability ) return capability;
81  }
82  return nullptr;
83 }
84 
85 //--------------------------------------------------------------------------------------------------
87 //--------------------------------------------------------------------------------------------------
88 template <typename CapabilityType>
89 const CapabilityType* FieldHandle::capability() const
90 {
91  for ( const auto& capabilityPtr : m_capabilities )
92  {
93  const CapabilityType* capability = dynamic_cast<const CapabilityType*>( capabilityPtr.get() );
94  if ( capability ) return capability;
95  }
96  return nullptr;
97 }
98 
99 } // End of namespace caffa
Definition: cafVisitor.h:43
Base class for all fields, making it possible to handle them generically.
Definition: cafFieldHandle.h:23
virtual void accept(Inspector *visitor) const
Definition: cafFieldHandle.cpp:67
Definition: cafVisitor.h:32
Definition: cafObjectAttribute.h:27
Definition: cafObjectHandle.h:55
Definition: cafSignal.h:63
Main Caffa namespace.
Definition: __init__.py:1