User Guide
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 
42  auto kinetic_blocks = collect_nodes(node, {nmodl::ast::AstNodeType::KINETIC_BLOCK});
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
nmodl::visitor::make_statement_block
static std::shared_ptr< ast::StatementBlock > make_statement_block(ast::KineticBlock &kinetic_block, nmodl::ast::AstNodeType node_type)
Definition: longitudinal_diffusion_visitor.cpp:19
nmodl::ast::AstNodeType::KINETIC_BLOCK
@ KINETIC_BLOCK
type of ast::KineticBlock
nmodl::ast::AstNodeType::COMPARTMENT
@ COMPARTMENT
type of ast::Compartment
nmodl::ast::StatementVector
std::vector< std::shared_ptr< Statement > > StatementVector
Definition: ast_decl.hpp:302
ast_decl.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
nmodl::ast::AstNodeType::LON_DIFFUSE
@ LON_DIFFUSE
type of ast::LonDiffuse
name.hpp
Auto generated AST classes declaration.
nmodl::ast::KineticBlock::get_node_name
std::string get_node_name() const override
Return name of the node.
Definition: ast.cpp:5137
nmodl::visitor::create_block
static std::shared_ptr< ast::LongitudinalDiffusionBlock > create_block(ast::KineticBlock &node)
Definition: longitudinal_diffusion_visitor.cpp:34
nmodl::ast::AstNodeType
AstNodeType
Enum type for every AST node type.
Definition: ast_decl.hpp:166
statement.hpp
Auto generated AST classes declaration.
string.hpp
Auto generated AST classes declaration.
visitor_utils.hpp
Utility functions for visitors implementation.
program.hpp
Auto generated AST classes declaration.
statement_block.hpp
Auto generated AST classes declaration.
longitudinal_diffusion_visitor.hpp
nmodl::visitor::CreateLongitudinalDiffusionBlocks::visit_program
void visit_program(ast::Program &node) override
visit node of type ast::Program
Definition: longitudinal_diffusion_visitor.cpp:41
longitudinal_diffusion_block.hpp
Auto generated AST classes declaration.
nmodl::ast::KineticBlock
TODO.
Definition: kinetic_block.hpp:39
nmodl::collect_nodes
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
Definition: visitor_utils.cpp:206
kinetic_block.hpp
Auto generated AST classes declaration.
nmodl::ast::Program
Represents top level AST node for whole NMODL input.
Definition: program.hpp:39
nmodl::ast::Program::emplace_back_node
void emplace_back_node(Node *n)
Add member to blocks by raw pointer.
Definition: ast.cpp:12821