Caffa  1.1.0
C++ Application Framework for Embedded Systems with introspection
cafChildField.h
1 #pragma once
2 
3 #include "cafAssert.h"
4 #include "cafChildFieldAccessor.h"
5 #include "cafChildFieldHandle.h"
6 #include "cafFieldHandle.h"
7 #include "cafObjectHandle.h"
8 #include "cafVisitor.h"
9 
10 #include <concepts>
11 #include <memory>
12 #include <type_traits>
13 
14 namespace caffa
15 {
16 template <typename T>
17 class FieldJsonCap;
18 
24 template <typename DataTypePtr>
25  requires is_pointer<DataTypePtr>
27 {
28 public:
29  using DataType = typename std::remove_pointer<DataTypePtr>::type;
30  using Ptr = std::shared_ptr<DataType>;
31  using ConstPtr = std::shared_ptr<const DataType>;
32  using FieldDataType = DataTypePtr;
33 
34 public:
35  ChildField()
36  : m_fieldDataAccessor( std::make_unique<ChildFieldDirectStorageAccessor>( this ) )
37  {
38  static_assert( DerivesFromObjectHandle<DataType> &&
39  "Child fields can only contain ObjectHandle-derived objects" );
40  }
41 
42  virtual ~ChildField();
43 
44  // Assignment
45 
46  ChildField& operator=( Ptr object );
47  bool operator==( ObjectHandle::ConstPtr object ) const;
48  bool operator==( const ObjectHandle* object ) const;
49 
50  // Basic access
51 
52  std::shared_ptr<DataType> object() { return std::dynamic_pointer_cast<DataType>( m_fieldDataAccessor->object() ); }
53  std::shared_ptr<const DataType> object() const
54  {
55  return std::dynamic_pointer_cast<const DataType>( m_fieldDataAccessor->object() );
56  }
57  void setObject( Ptr object );
58 
59  // Access operators
60  operator std::shared_ptr<DataType>() { return this->object(); }
61  operator std::shared_ptr<const DataType>() const { return this->object(); }
62 
63  operator bool() const { return !!this->object(); }
64 
65  // Deep copy of object content
66  std::shared_ptr<DataType> deepCloneObject() const;
67  void deepCopyObjectFrom( std::shared_ptr<const DataType> copyFrom );
68 
69  std::shared_ptr<DataType> operator->() { return this->object(); }
70  std::shared_ptr<const DataType> operator->() const { return this->object(); }
71 
72  std::shared_ptr<DataType> operator()() { return this->object(); }
73  std::shared_ptr<const DataType> operator()() const { return this->object(); }
74 
75  // Child objects
76  std::vector<ObjectHandle::Ptr> childObjects() override;
77  std::vector<ObjectHandle::ConstPtr> childObjects() const override;
78  void clear() override;
79  void removeChildObject( ObjectHandle::ConstPtr object );
80  void setChildObject( ObjectHandle::Ptr object );
81 
82  std::string dataType() const override { return PortableDataType<DataType>::name(); }
83 
84  void setAccessor( std::unique_ptr<ChildFieldAccessor> accessor ) override
85  {
86  m_fieldDataAccessor = std::move( accessor );
87  }
88 
89  std::string childClassKeyword() const override { return std::string( DataType::classKeywordStatic() ); }
90 
91 private:
92  ChildField( const ChildField& ) = delete;
93  ChildField& operator=( const ChildField& ) = delete;
94 
95  friend class FieldJsonCap<ChildField<DataType*>>;
96  mutable std::unique_ptr<ChildFieldAccessor> m_fieldDataAccessor;
97 };
98 
99 } // End of namespace caffa
100 
101 #include "cafChildField.inl"
Definition: cafChildFieldHandle.h:50
Field class to handle a pointer to a caffa Object.
Definition: cafChildField.h:27
std::string childClassKeyword() const override
Get the class keyword of the contained child(ren)
Definition: cafChildField.h:89
Definition: cafFieldJsonCapabilitySpecializations.h:19
Definition: cafObjectHandle.h:55
Main Caffa namespace.
Definition: __init__.py:1
Definition: cafPortableDataType.h:35