Caffa  1.1.0
C++ Application Framework for Embedded Systems with introspection
cafObjectPerformer.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 "cafObjectHandle.h"
23 #include "cafVisitor.h"
24 
25 #include <list>
26 
27 namespace caffa
28 {
32 template <typename ObjectType = ObjectHandle>
33 class ObjectPerformer : public Editor
34 {
35 public:
36  using Callback = std::function<void( ObjectType* )>;
37  using Selector = std::function<bool( const ObjectType* )>;
38 
39  ObjectPerformer( Callback callback, Selector selector = nullptr )
40  : m_selector( selector )
41  , m_callback( callback )
42  {
43  }
44 
45  void visitObject( ObjectHandle* object ) override
46  {
47  auto typedObject = dynamic_cast<ObjectType*>( object );
48  if ( typedObject && ( !m_selector || m_selector( typedObject ) ) )
49  {
50  m_callback( typedObject );
51  }
52 
53  for ( auto field : object->fields() )
54  {
55  field->accept( this );
56  }
57  }
58 
59  void visitField( FieldHandle* field ) override {}
60 
61  void visitChildField( ChildFieldBaseHandle* childField ) override
62  {
63  for ( auto object : childField->childObjects() )
64  {
65  object->accept( this );
66  }
67  }
68 
69 private:
70  Selector m_selector;
71  Callback m_callback;
72 };
73 } // namespace caffa
Definition: cafChildFieldHandle.h:35
Definition: cafVisitor.h:43
Base class for all fields, making it possible to handle them generically.
Definition: cafFieldHandle.h:23
Definition: cafObjectHandle.h:55
std::list< FieldHandle * > fields() const
Definition: cafObjectHandle.cpp:51
Definition: cafObjectPerformer.h:34
Main Caffa namespace.
Definition: __init__.py:1