Caffa  1.1.0
C++ Application Framework for Embedded Systems with introspection
cafFieldHandle.h
1 #pragma once
2 
3 #include <list>
4 #include <memory>
5 #include <string>
6 #include <utility>
7 
8 namespace caffa
9 {
10 class FieldCapability;
11 class ObjectHandle;
12 
13 class Editor;
14 class Inspector;
15 
16 //==================================================================================================
18 //==================================================================================================
20 {
21 public:
22  FieldHandle();
23  virtual ~FieldHandle();
24 
25  std::string keyword() const { return m_keyword; }
26  ObjectHandle* ownerObject();
27  const ObjectHandle* ownerObject() const;
28 
29  virtual std::string dataType() const = 0;
30 
31  // Capabilities
32  void addCapability( std::unique_ptr<FieldCapability> capability );
33 
34  template <typename CapabilityType>
35  CapabilityType* capability();
36  template <typename CapabilityType>
37  const CapabilityType* capability() const;
38 
43  virtual void accept( Inspector* visitor ) const = 0;
44 
49  virtual void accept( Editor* visitor ) = 0;
50 
54  virtual bool isReadable() const = 0;
55 
59  virtual bool isWritable() const = 0;
60 
61  bool isDeprecated() const;
62  void markDeprecated();
63 
64  void setDocumentation( const std::string& documentation );
65  const std::string& documentation() const;
66 
67 protected:
68  bool isInitialized() const { return m_ownerObject != nullptr; }
69 
70  std::list<FieldCapability*> capabilities();
71 
72 private:
73  FieldHandle( const FieldHandle& ) = delete;
74  FieldHandle& operator=( const FieldHandle& ) = delete;
75 
76  friend class ObjectHandle; // Give access to m_ownerObject and set Keyword
77  void setKeyword( const std::string& keyword );
78  ObjectHandle* m_ownerObject;
79 
80  std::string m_keyword;
81 
82  std::list<std::unique_ptr<FieldCapability>> m_capabilities;
83 
84  bool m_isDeprecated;
85 
86  std::string m_documentation;
87 };
88 
89 //--------------------------------------------------------------------------------------------------
91 //--------------------------------------------------------------------------------------------------
92 template <typename CapabilityType>
93 CapabilityType* FieldHandle::capability()
94 {
95  for ( auto& capabilityPtr : m_capabilities )
96  {
97  CapabilityType* capability = dynamic_cast<CapabilityType*>( capabilityPtr.get() );
98  if ( capability ) return capability;
99  }
100  return nullptr;
101 }
102 
103 //--------------------------------------------------------------------------------------------------
105 //--------------------------------------------------------------------------------------------------
106 template <typename CapabilityType>
107 const CapabilityType* FieldHandle::capability() const
108 {
109  for ( const auto& capabilityPtr : m_capabilities )
110  {
111  const CapabilityType* capability = dynamic_cast<const CapabilityType*>( capabilityPtr.get() );
112  if ( capability ) return capability;
113  }
114  return nullptr;
115 }
116 
117 } // End of namespace caffa
virtual bool isReadable() const =0
Definition: cafVisitor.h:49
Definition: cafObjectHandle.h:47
Base class for all fields, making it possible to handle them generically.
Definition: cafFieldHandle.h:19
virtual bool isWritable() const =0
virtual void accept(Inspector *visitor) const =0
Definition: cafVisitor.h:32
Main Caffa namespace.
Definition: cafApplication.h:30