NEURON
longitudinal_diffusion_visitor.cpp
Go to the documentation of this file.
2 
3 #include "ast/ast_decl.hpp"
4 #include "ast/kinetic_block.hpp"
6 #include "ast/name.hpp"
7 #include "ast/program.hpp"
8 #include "ast/statement.hpp"
10 #include "ast/string.hpp"
11 #include "visitor_utils.hpp"
12 
13 #include <memory>
14 
15 
16 namespace nmodl {
17 namespace visitor {
18 
19 static std::shared_ptr<ast::StatementBlock> make_statement_block(
20  ast::KineticBlock& kinetic_block,
21  nmodl::ast::AstNodeType node_type) {
22  auto nodes = collect_nodes(kinetic_block, {node_type});
23 
24  ast::StatementVector statements;
25  statements.reserve(nodes.size());
26  for (auto& node: nodes) {
27  statements.push_back(std::dynamic_pointer_cast<ast::Statement>(node));
28  }
29 
30  return std::make_shared<ast::StatementBlock>(std::move(statements));
31 }
32 
33 
34 static std::shared_ptr<ast::LongitudinalDiffusionBlock> create_block(ast::KineticBlock& node) {
35  return std::make_shared<ast::LongitudinalDiffusionBlock>(
36  std::make_shared<ast::Name>(std::make_shared<ast::String>("ld_" + node.get_node_name())),
39 }
40 
43 
44  for (const auto& ast_node: kinetic_blocks) {
45  auto kinetic_block = std::dynamic_pointer_cast<ast::KineticBlock>(ast_node);
46  node.emplace_back_node(create_block(*kinetic_block));
47  }
48 }
49 
50 } // namespace visitor
51 } // namespace nmodl
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
Represents top level AST node for whole NMODL input.
Definition: program.hpp:39
void visit_program(ast::Program &node) override
visit node of type ast::Program
virtual std::string get_node_name() const
Return name of of the node.
Definition: ast.cpp:28
AstNodeType
Enum type for every AST node type.
Definition: ast_decl.hpp:166
@ KINETIC_BLOCK
type of ast::KineticBlock
@ LON_DIFFUSE
type of ast::LonDiffuse
@ COMPARTMENT
type of ast::Compartment
std::vector< std::shared_ptr< Statement > > StatementVector
Definition: ast_decl.hpp:302
Auto generated AST classes declaration.
Auto generated AST classes declaration.
void move(Item *q1, Item *q2, Item *q3)
Definition: list.cpp:200
Auto generated AST classes declaration.
static std::shared_ptr< ast::StatementBlock > make_statement_block(ast::KineticBlock &kinetic_block, nmodl::ast::AstNodeType node_type)
static std::shared_ptr< ast::LongitudinalDiffusionBlock > create_block(ast::KineticBlock &node)
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
std::vector< std::shared_ptr< const ast::Ast > > collect_nodes(const ast::Ast &node, const std::vector< ast::AstNodeType > &types)
traverse node recursively and collect nodes of given types
static Node * node(Object *)
Definition: netcvode.cpp:291
Auto generated AST classes declaration.
Auto generated AST classes declaration.
Auto generated AST classes declaration.
Auto generated AST classes declaration.
Utility functions for visitors implementation.