rapidyaml  0.10.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 41 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 46 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 47 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 59 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 60 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 64 of file event_handler_stack.hpp.

65  {
66  _RYML_CB_ASSERT(m_stack.m_callbacks, m_curr != nullptr);
67  _RYML_CB_ASSERT(m_stack.m_callbacks, relocate_arena != nullptr);
68  _RYML_CB_ASSERT(m_stack.m_callbacks, relocate_arena_data != nullptr);
69  m_curr->start_parse(filename, m_curr->node_id);
70  m_relocate_arena = relocate_arena;
71  m_relocate_arena_data = relocate_arena_data;
72  }

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 74 of file event_handler_stack.hpp.

75  {
76  }

◆ _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 97 of file event_handler_stack.hpp.

98  {
99  m_stack.push_top();
100  m_parent = &m_stack.top(1); // don't use m_curr. watch out for relocations inside the prev push
101  m_curr = &m_stack.top();
102  m_curr->reset_after_push();
103  }

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 105 of file event_handler_stack.hpp.

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

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 126 of file event_handler_stack.hpp.

127  {
128  const bool is_root = (m_stack.size() == 1u);
129  return is_root && (_has_any_(DOC|VAL|MAP|SEQ) || m_curr->has_children);
130  }
#define _has_any_(bits)
@ MAP
a map: a parent of KEYVAL/KEYSEQ/KEYMAP nodes
Definition: node_type.hpp:38
@ 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:37
@ SEQ
a seq: a parent of VAL/SEQ/MAP nodes
Definition: node_type.hpp:39
@ DOC
a document
Definition: node_type.hpp:40

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 132 of file event_handler_stack.hpp.

133  {
134  const bool is_root = (m_stack.size() == 1u);
135  return !is_root && _has_any_(DOC);
136  }

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 140 of file event_handler_stack.hpp.

141  {
142  for(state &st : m_stack)
143  {
144  if(st.line_contents.rem.is_sub(prev))
145  st.line_contents.rem = _stack_relocate_to_new_arena(st.line_contents.rem, prev, curr);
146  if(st.line_contents.full.is_sub(prev))
147  st.line_contents.full = _stack_relocate_to_new_arena(st.line_contents.full, prev, curr);
148  if(st.line_contents.stripped.is_sub(prev))
149  st.line_contents.stripped = _stack_relocate_to_new_arena(st.line_contents.stripped, prev, curr);
150  }
151  _RYML_CB_ASSERT(m_stack.m_callbacks, m_relocate_arena != nullptr);
152  _RYML_CB_ASSERT(m_stack.m_callbacks, m_relocate_arena_data != nullptr);
154  }
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 156 of file event_handler_stack.hpp.

157  {
158  _RYML_CB_ASSERT(m_stack.m_callbacks, prev.is_super(s));
159  auto pos = s.str - prev.str;
160  substr out = {curr.str + pos, s.len};
161  _RYML_CB_ASSERT(m_stack.m_callbacks, curr.is_super(out));
162  return out;
163  }

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 171 of file event_handler_stack.hpp.

172  {
173  const bool is_root = (m_stack.size() == 1u);
174  const bool isndoc = (m_curr->flags & NDOC) != 0;
175  const bool suspicious = _has_any_(MAP|SEQ|VAL);
176  _c4dbgpf("target={} isroot={} suspicious={} ndoc={}", m_curr->node_id, is_root, suspicious, isndoc);
177  if((is_root || _has_any_(DOC)) && suspicious && !isndoc)
178  _RYML_CB_ERR_(m_stack.m_callbacks, "parse error", m_curr->pos);
179  }
@ 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: