Caffa  1.1.0
C++ Application Framework for Embedded Systems with introspection
cafObjectCollector.h
1 // ##################################################################################################
2 //
3 // Copyright (C) 2023- Kontur AS
4 //
5 // GNU Lesser General Public License Usage
6 // This library is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU Lesser General Public License as published by
8 // the Free Software Foundation; either version 2.1 of the License, or
9 // (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful, but WITHOUT ANY
12 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 // FITNESS FOR A PARTICULAR PURPOSE.
14 //
15 // See the GNU Lesser General Public License at <<http://www.gnu.org/licenses/lgpl-2.1.html>>
16 // for more details.
17 //
18 // ##################################################################################################
19 #pragma once
20 
21 #include "cafChildFieldHandle.h"
22 #include "cafVisitor.h"
23 
24 #include <list>
25 
26 namespace caffa
27 {
28 class ObjectHandle;
29 
33 template <typename ObjectType = ObjectHandle>
35 {
36 public:
37  using Selector = std::function<bool( const ObjectType* )>;
38 
39  ConstObjectCollector( Selector selector = nullptr )
40  : m_selector( selector )
41  {
42  }
43 
44  void visitObject( const ObjectHandle* object ) override
45  {
46  CAFFA_ASSERT( object );
47  CAFFA_TRACE( "Visiting OBJECT " << object->uuid() );
48  auto typedObject = dynamic_cast<const ObjectType*>( object );
49  if ( typedObject && ( !m_selector || m_selector( typedObject ) ) )
50  {
51  m_objects.push_back( typedObject );
52  }
53  }
54 
55  void visitField( const FieldHandle* field ) override {}
56 
57  const std::list<const ObjectType*>& objects() const { return m_objects; }
58 
59 private:
60  Selector m_selector;
61  std::list<const ObjectType*> m_objects;
62 };
63 
67 template <typename ObjectType = ObjectHandle>
68 class ObjectCollector : public Editor
69 {
70 public:
71  using Selector = std::function<bool( const ObjectType* )>;
72 
73  ObjectCollector( Selector selector = nullptr )
74  : m_selector( selector )
75  {
76  }
77  const std::list<ObjectType*>& objects() { return m_objects; }
78 
79 private:
80  void visitObject( ObjectHandle* object ) override
81  {
82  auto typedObject = dynamic_cast<ObjectType*>( object );
83  if ( typedObject && ( !m_selector || m_selector( typedObject ) ) )
84  {
85  m_objects.push_back( typedObject );
86  }
87  }
88 
89  void visitField( FieldHandle* field ) override {}
90 
91 private:
92  Selector m_selector;
93  std::list<ObjectType*> m_objects;
94 };
95 } // namespace caffa
Definition: cafObjectCollector.h:34
Definition: cafVisitor.h:49
Definition: cafObjectHandle.h:47
Base class for all fields, making it possible to handle them generically.
Definition: cafFieldHandle.h:19
Definition: cafObjectCollector.h:68
Definition: cafVisitor.h:32
Main Caffa namespace.
Definition: cafApplication.h:30