Caffa  1.1.0
C++ Application Framework for Embedded Systems with introspection
cafChildArrayField.h
1 #pragma once
2 
3 #include "cafAssert.h"
4 #include "cafChildArrayFieldAccessor.h"
5 #include "cafChildArrayFieldHandle.h"
6 #include "cafFieldHandle.h"
7 
8 #include <memory>
9 
10 namespace caffa
11 {
12 class ObjectHandle;
13 
14 template <typename T>
15 class FieldJsonCap;
16 
21 template <typename DataTypePtr>
22  requires is_pointer<DataTypePtr>
24 {
25 public:
26  using DataType = typename std::remove_pointer<DataTypePtr>::type;
27 
28  using Ptr = std::shared_ptr<DataType>;
29  using ConstPtr = std::shared_ptr<const DataType>;
30  using FieldDataType = DataTypePtr;
31 
34 
36  : m_fieldDataAccessor( std::make_unique<DirectStorageAccessor>( this ) )
37  {
38  static_assert( std::is_base_of<ObjectHandle, DataType>::value &&
39  "Child Array fields can only contain ObjectHandle-derived objects" );
40  }
41  ~ChildArrayField() override;
42 
43  // Access operators
44  operator std::vector<std::shared_ptr<DataType>>() { return this->objects(); }
45  operator std::vector<std::shared_ptr<const DataType>>() const { return this->objects(); }
46 
47  size_t size() const override { return m_fieldDataAccessor->size(); }
48  void clear() override;
49  ObjectHandle::Ptr at( size_t index ) override;
50  std::vector<std::shared_ptr<DataType>> objects();
51  std::vector<std::shared_ptr<const DataType>> objects() const;
52  void setObjects( std::vector<std::shared_ptr<DataType>>& objects );
53 
54  // std::vector-like access
55 
56  std::shared_ptr<DataType> operator[]( size_t index ) const;
57 
58  void push_back( std::shared_ptr<DataType> pointer );
59  void push_back_obj( ObjectHandle::Ptr obj ) override;
60  void insert( size_t index, std::shared_ptr<DataType> pointer );
61  void insertAt( size_t index, ObjectHandle::Ptr obj ) override;
62  void erase( size_t index ) override;
63 
64  // Child objects
65  std::vector<ObjectHandle::Ptr> childObjects() override;
66  std::vector<ObjectHandle::ConstPtr> childObjects() const override;
67  void removeChildObject( ObjectHandle::ConstPtr object );
68 
69  std::string dataType() const override { return PortableDataType<std::vector<DataType>>::name(); }
70 
71  void setAccessor( std::unique_ptr<ChildArrayFieldAccessor> accessor ) override
72  {
73  m_fieldDataAccessor = std::move( accessor );
74  }
75 
76  virtual std::string childClassKeyword() const override { return std::string( DataType::classKeywordStatic() ); }
77 
78 private: // To be disabled
79  ChildArrayField( const ChildArrayField& ) = delete;
80  ChildArrayField& operator=( const ChildArrayField& ) = delete;
81 
82 private:
83  friend class FieldJsonCap<ChildArrayField<DataType*>>;
84  std::unique_ptr<DataAccessor> m_fieldDataAccessor;
85 };
86 
87 } // End of namespace caffa
88 
89 #include "cafChildArrayField.inl"
Definition: cafChildArrayFieldAccessor.h:35
Definition: cafChildArrayFieldAccessor.h:58
A non-templated base interface for ChildArrayField<DataType*> Used so we can have pointers to any Chi...
Definition: cafChildArrayFieldHandle.h:18
Field class to handle a collection of Object derived pointers The ChildArrayField will take over owne...
Definition: cafChildArrayField.h:24
~ChildArrayField() override
Implementation of ChildArrayField<>
Definition: cafChildArrayField.inl:14
void setAccessor(std::unique_ptr< ChildArrayFieldAccessor > accessor) override
Set a new accessor.
Definition: cafChildArrayField.h:71
void setObjects(std::vector< std::shared_ptr< DataType >> &objects)
Assign objects to the field, replacing the current child objects.
Definition: cafChildArrayField.inl:114
void insertAt(size_t index, ObjectHandle::Ptr obj) override
Insert an object at a particular index. Ownership will be taken.
Definition: cafChildArrayField.inl:74
void erase(size_t index) override
Removes the pointer at index from the container and deletes the object pointed to.
Definition: cafChildArrayField.inl:103
void removeChildObject(ObjectHandle::ConstPtr object)
Removes all instances of object pointer from the container without deleting the object.
Definition: cafChildArrayField.inl:130
size_t size() const override
Get the number of child objects.
Definition: cafChildArrayField.h:47
void push_back(std::shared_ptr< DataType > pointer)
Assign a shared pointer.
Definition: cafChildArrayField.inl:34
virtual std::string childClassKeyword() const override
Get the class keyword of the contained child(ren)
Definition: cafChildArrayField.h:76
ObjectHandle::Ptr at(size_t index) override
Get a raw pointer to the object at a particular index.
Definition: cafChildArrayField.inl:206
void clear() override
Clears the container.
Definition: cafChildArrayField.inl:91
void insert(size_t index, std::shared_ptr< DataType > pointer)
Definition: cafChildArrayField.inl:62
void push_back_obj(ObjectHandle::Ptr obj) override
Assign a shared pointer.
Definition: cafChildArrayField.inl:45
Definition: cafFieldJsonCapabilitySpecializations.h:19
Main Caffa namespace.
Definition: __init__.py:1
Definition: cafPortableDataType.h:35