rapidyaml  0.7.0
parse and emit YAML, and do it fast
c4::yml::EventHandlerStack< HandlerImpl, HandlerState > Struct Template Reference

Use this class a base of implementations of event handler to simplify the stack logic. More...

#include <event_handler_stack.hpp>

Public Types

using state = HandlerState
 
using pfn_relocate_arena = detail::pfn_relocate_arena
 

Public Member Functions

void check_trailing_doc_token () const
 Check whether the current parse tokens are trailing on the previous doc, and raise an error if they are. More...
 

Public Attributes

detail::stack< statem_stack
 
statem_curr
 current stack level: top of the stack. cached here for easier access. More...
 
statem_parent
 parent of the current stack level. More...
 
pfn_relocate_arena m_relocate_arena
 callback when the arena gets relocated More...
 
void * m_relocate_arena_data
 

Protected Member Functions

 EventHandlerStack ()
 
 EventHandlerStack (Callbacks const &cb)
 
void _stack_start_parse (const char *filename, pfn_relocate_arena relocate_arena, void *relocate_arena_data)
 
void _stack_finish_parse ()
 
void _stack_reset_root ()
 
void _stack_reset_non_root ()
 
void _stack_push ()
 
void _stack_pop ()
 
bool _stack_should_push_on_begin_doc () const
 
bool _stack_should_pop_on_end_doc () const
 
void _stack_relocate_to_new_arena (csubstr prev, substr curr)
 
substr _stack_relocate_to_new_arena (csubstr s, csubstr prev, substr curr)
 

Detailed Description

template<class HandlerImpl, class HandlerState>
struct c4::yml::EventHandlerStack< HandlerImpl, HandlerState >

Use this class a base of implementations of event handler to simplify the stack logic.

Definition at line 35 of file event_handler_stack.hpp.

Member Typedef Documentation

◆ state

template<class HandlerImpl , class HandlerState >
using c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::state = HandlerState

Definition at line 40 of file event_handler_stack.hpp.

◆ pfn_relocate_arena

template<class HandlerImpl , class HandlerState >
using c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::pfn_relocate_arena = detail::pfn_relocate_arena

Definition at line 41 of file event_handler_stack.hpp.

Constructor & Destructor Documentation

◆ EventHandlerStack() [1/2]

template<class HandlerImpl , class HandlerState >
c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::EventHandlerStack ( )
inlineprotected

Definition at line 53 of file event_handler_stack.hpp.

state * m_curr
current stack level: top of the stack. cached here for easier access.
pfn_relocate_arena m_relocate_arena
callback when the arena gets relocated
detail::stack< state > m_stack
state * m_parent
parent of the current stack level.

◆ EventHandlerStack() [2/2]

template<class HandlerImpl , class HandlerState >
c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::EventHandlerStack ( Callbacks const &  cb)
inlineprotected

Definition at line 54 of file event_handler_stack.hpp.

Member Function Documentation

◆ _stack_start_parse()

template<class HandlerImpl , class HandlerState >
void c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_start_parse ( const char *  filename,
pfn_relocate_arena  relocate_arena,
void *  relocate_arena_data 
)
inlineprotected

Definition at line 58 of file event_handler_stack.hpp.

59  {
60  _RYML_CB_ASSERT(m_stack.m_callbacks, m_curr != nullptr);
61  _RYML_CB_ASSERT(m_stack.m_callbacks, relocate_arena != nullptr);
62  _RYML_CB_ASSERT(m_stack.m_callbacks, relocate_arena_data != nullptr);
63  m_curr->start_parse(filename, m_curr->node_id);
64  m_relocate_arena = relocate_arena;
65  m_relocate_arena_data = relocate_arena_data;
66  }

References c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_curr, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_relocate_arena, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_relocate_arena_data, and c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack.

◆ _stack_finish_parse()

template<class HandlerImpl , class HandlerState >
void c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_finish_parse ( )
inlineprotected

Definition at line 68 of file event_handler_stack.hpp.

69  {
70  }

◆ _stack_reset_root()

template<class HandlerImpl , class HandlerState >
void c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_reset_root ( )
inlineprotected

◆ _stack_reset_non_root()

template<class HandlerImpl , class HandlerState >
void c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_reset_non_root ( )
inlineprotected

◆ _stack_push()

template<class HandlerImpl , class HandlerState >
void c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_push ( )
inlineprotected

Definition at line 91 of file event_handler_stack.hpp.

92  {
93  m_stack.push_top();
94  m_parent = &m_stack.top(1); // don't use m_curr. watch out for relocations inside the prev push
95  m_curr = &m_stack.top();
96  m_curr->reset_after_push();
97  }

References c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_curr, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_parent, and c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack.

◆ _stack_pop()

template<class HandlerImpl , class HandlerState >
void c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_pop ( )
inlineprotected

Definition at line 99 of file event_handler_stack.hpp.

100  {
101  _RYML_CB_ASSERT(m_stack.m_callbacks, m_parent);
102  _RYML_CB_ASSERT(m_stack.m_callbacks, m_stack.size() > 1);
103  m_parent->reset_before_pop(*m_curr);
104  m_stack.pop();
105  m_parent = m_stack.size() > 1 ? &m_stack.top(1) : nullptr;
106  m_curr = &m_stack.top();
107  #ifdef RYML_DBG
108  if(m_parent)
109  _c4dbgpf("popped! top is now node={} (parent={})", m_curr->node_id, m_parent->node_id);
110  else
111  _c4dbgpf("popped! top is now node={} @ ROOT", m_curr->node_id);
112  #endif
113  }

References c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_curr, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_parent, and c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack.

◆ _stack_should_push_on_begin_doc()

template<class HandlerImpl , class HandlerState >
bool c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_should_push_on_begin_doc ( ) const
inlineprotected

Definition at line 120 of file event_handler_stack.hpp.

121  {
122  const bool is_root = (m_stack.size() == 1u);
123  return is_root && (_has_any_(DOC|VAL|MAP|SEQ) || m_curr->has_children);
124  }
#define _has_any_(bits)
@ MAP
a map: a parent of KEYVAL/KEYSEQ/KEYMAP nodes
Definition: node_type.hpp:35
@ VAL
a scalar: has a scalar (ie string) value, possibly empty. must be a leaf node, and cannot be MAP or S...
Definition: node_type.hpp:34
@ SEQ
a seq: a parent of VAL/SEQ/MAP nodes
Definition: node_type.hpp:36
@ DOC
a document
Definition: node_type.hpp:37

References _has_any_, c4::yml::DOC, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_curr, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack, c4::yml::MAP, c4::yml::SEQ, and c4::yml::VAL.

◆ _stack_should_pop_on_end_doc()

template<class HandlerImpl , class HandlerState >
bool c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_should_pop_on_end_doc ( ) const
inlineprotected

Definition at line 126 of file event_handler_stack.hpp.

127  {
128  const bool is_root = (m_stack.size() == 1u);
129  return !is_root && _has_any_(DOC);
130  }

References _has_any_, c4::yml::DOC, and c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack.

◆ _stack_relocate_to_new_arena() [1/2]

template<class HandlerImpl , class HandlerState >
void c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_relocate_to_new_arena ( csubstr  prev,
substr  curr 
)
inlineprotected

Definition at line 134 of file event_handler_stack.hpp.

135  {
136  for(state &st : m_stack)
137  {
138  if(st.line_contents.rem.is_sub(prev))
139  st.line_contents.rem = _stack_relocate_to_new_arena(st.line_contents.rem, prev, curr);
140  if(st.line_contents.full.is_sub(prev))
141  st.line_contents.full = _stack_relocate_to_new_arena(st.line_contents.full, prev, curr);
142  if(st.line_contents.stripped.is_sub(prev))
143  st.line_contents.stripped = _stack_relocate_to_new_arena(st.line_contents.stripped, prev, curr);
144  }
145  _RYML_CB_ASSERT(m_stack.m_callbacks, m_relocate_arena != nullptr);
146  _RYML_CB_ASSERT(m_stack.m_callbacks, m_relocate_arena_data != nullptr);
148  }
void _stack_relocate_to_new_arena(csubstr prev, substr curr)

References c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_relocate_arena, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_relocate_arena_data, and c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack.

◆ _stack_relocate_to_new_arena() [2/2]

template<class HandlerImpl , class HandlerState >
substr c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::_stack_relocate_to_new_arena ( csubstr  s,
csubstr  prev,
substr  curr 
)
inlineprotected

Definition at line 150 of file event_handler_stack.hpp.

151  {
152  _RYML_CB_ASSERT(m_stack.m_callbacks, prev.is_super(s));
153  auto pos = s.str - prev.str;
154  substr out = {curr.str + pos, s.len};
155  _RYML_CB_ASSERT(m_stack.m_callbacks, curr.is_super(out));
156  return out;
157  }

References c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack.

◆ check_trailing_doc_token()

template<class HandlerImpl , class HandlerState >
void c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::check_trailing_doc_token ( ) const
inline

Check whether the current parse tokens are trailing on the previous doc, and raise an error if they are.

This function is called by the parse engine (not the event handler) before a doc is started.

Definition at line 165 of file event_handler_stack.hpp.

166  {
167  const bool is_root = (m_stack.size() == 1u);
168  const bool isndoc = (m_curr->flags & NDOC) != 0;
169  const bool suspicious = _has_any_(MAP|SEQ|VAL);
170  _c4dbgpf("target={} isroot={} suspicious={} ndoc={}", m_curr->node_id, is_root, suspicious, isndoc);
171  if((is_root || _has_any_(DOC)) && suspicious && !isndoc)
172  _RYML_CB_ERR_(m_stack.m_callbacks, "parse error", m_curr->pos);
173  }
@ NDOC
no document mode. a document has ended and another has not started yet.

References _has_any_, c4::yml::DOC, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_curr, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack, c4::yml::MAP, c4::yml::NDOC, c4::yml::SEQ, and c4::yml::VAL.

Member Data Documentation

◆ m_stack

◆ m_curr

◆ m_parent

◆ m_relocate_arena

template<class HandlerImpl , class HandlerState >
pfn_relocate_arena c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_relocate_arena

◆ m_relocate_arena_data

template<class HandlerImpl , class HandlerState >
void* c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_relocate_arena_data

The documentation for this struct was generated from the following file: