8 #ifndef PSYLLID_NODE_BUILDER_HH_ 9 #define PSYLLID_NODE_BUILDER_HH_ 13 #include "member_variables.hh" 51 virtual void apply_config( midge::node* a_node,
const scarab::param_node& a_config )
const = 0;
54 virtual void dump_config(
const midge::node* a_node, scarab::param_node& a_config )
const = 0;
58 virtual bool run_command( midge::node* a_node,
const std::string& a_cmd,
const scarab::param_node& a_args )
const = 0;
67 template<
class x_node_type,
class x_binding_type >
79 virtual void apply_config( midge::node* a_node,
const scarab::param_node& a_config )
const;
80 virtual void dump_config(
const midge::node* a_node, scarab::param_node& a_config )
const;
82 virtual bool run_command( midge::node* a_node,
const std::string& a_cmd,
const scarab::param_node& a_args )
const;
85 virtual void do_apply_config( x_node_type* a_node,
const scarab::param_node& a_config )
const = 0;
86 virtual void do_dump_config(
const x_node_type* a_node, scarab::param_node& a_config )
const = 0;
89 virtual bool do_run_command( x_node_type* a_node,
const std::string& a_cmd,
const scarab::param_node& a_args )
const;
121 virtual midge::node* build() = 0;
123 void configure_builder(
const scarab::param_node& a_config );
124 void replace_builder_config(
const scarab::param_node& a_config );
125 void dump_builder_config( scarab::param_node& a_config );
130 mv_referrable( std::string, name );
133 virtual void apply_config( midge::node* a_node,
const scarab::param_node& a_config )
const;
134 virtual void dump_config(
const midge::node* a_node, scarab::param_node& a_config )
const;
136 virtual bool run_command( midge::node* a_node,
const std::string& a_cmd,
const scarab::param_node& a_args )
const;
145 template<
class x_node_type,
class x_binding_type >
159 virtual midge::node* build();
175 template<
class x_node_type,
class x_node_binding >
180 template<
class x_node_type,
class x_node_binding >
184 template<
class x_node_type,
class x_node_binding >
187 this->node_binding::operator=( a_rhs );
191 template<
class x_node_type,
class x_node_binding >
194 x_node_binding* t_new_binding =
new x_node_binding();
195 t_new_binding->operator=( *
static_cast< const x_node_binding*
>(
this) );
196 return t_new_binding;
199 template<
class x_node_type,
class x_node_binding >
202 x_node_type* t_derived_node =
dynamic_cast< x_node_type*
>( a_node );
203 if( t_derived_node ==
nullptr )
205 throw error() <<
"Node type does not match builder type (apply_config(node*))";
209 do_apply_config( t_derived_node, a_config );
211 catch( std::exception& e )
218 template<
class x_node_type,
class x_node_binding >
221 const x_node_type* t_derived_node =
dynamic_cast< const x_node_type*
>( a_node );
222 if( t_derived_node ==
nullptr )
224 throw error() <<
"Node type does not match builder type (extract_config(node*, param_node&))";
228 do_dump_config( t_derived_node, a_config );
230 catch( std::exception& e )
237 template<
class x_node_type,
class x_node_binding >
240 x_node_type* t_derived_node =
dynamic_cast< x_node_type*
>( a_node );
241 if( t_derived_node ==
nullptr )
243 throw error() <<
"Node type does not match builder type (extract_config(node*, param_node&))";
247 return do_run_command( t_derived_node, a_cmd, a_args );
249 catch( std::exception& e )
255 template<
class x_node_type,
class x_node_binding >
271 inline void node_builder::configure_builder(
const scarab::param_node& a_config )
273 f_config.merge( a_config );
277 inline void node_builder::replace_builder_config(
const scarab::param_node& a_config )
280 f_config.merge( a_config );
284 inline void node_builder::dump_builder_config( scarab::param_node& a_config )
287 a_config.merge( f_config );
291 inline void node_builder::apply_config( midge::node* a_node,
const scarab::param_node& a_config )
const 297 inline void node_builder::dump_config(
const midge::node* a_node, scarab::param_node& a_config )
const 299 f_binding->dump_config( a_node, a_config );
303 inline bool node_builder::run_command( midge::node* a_node,
const std::string& a_cmd,
const scarab::param_node& a_args )
const 305 return f_binding->run_command( a_node, a_cmd, a_args );
313 template<
class x_node_type,
class x_binding_type >
318 template<
class x_node_type,
class x_binding_type >
323 template<
class x_node_type,
class x_binding_type >
327 template<
class x_node_type,
class x_binding_type >
334 template<
class x_node_type,
class x_binding_type >
338 t_new_builder->operator=( *this );
339 return t_new_builder;
342 template<
class x_node_type,
class x_binding_type >
345 x_node_type* t_node =
new x_node_type();
348 scarab::param_node t_temp_config(
f_config );
354 t_node->set_name( f_name );
361 #define REGISTER_NODE_AND_BUILDER( node_class, node_name, node_binding ) \ 362 static ::scarab::registrar< ::midge::node, node_class > s_node_##node_class##_registrar( node_name ); \ 363 static ::scarab::registrar< ::psyllid::node_builder, _node_builder< node_class, node_binding > > s_node_builder_##node_class##_registrar( node_name ); node_binding * clone() const
virtual void apply_config(midge::node *a_node, const scarab::param_node &a_config) const
const char * what() const
scarab::param_node f_config
Holds node configuration and can be used to create node classes and node binding classes.
_node_builder< x_node_type, x_binding_type > & operator=(const _node_builder< x_node_type, x_binding_type > &a_rhs)
virtual midge::node * build()
Builds a new node and applies the builder's configuration information.
node_builder & operator=(const node_builder &)
virtual void dump_config(const midge::node *a_node, scarab::param_node &a_config) const
virtual void apply_config(midge::node *a_node, const scarab::param_node &a_config) const =0
Allows access to midge nodes.