rapidyaml  0.11.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
 
csubstr m_src
 

Protected Member Functions

 EventHandlerStack ()
 
 EventHandlerStack (Callbacks const &cb)
 
void _stack_start_parse (const char *filename, csubstr ymlsrc, 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 60 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 61 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,
csubstr  ymlsrc,
pfn_relocate_arena  relocate_arena,
void *  relocate_arena_data 
)
inlineprotected

Definition at line 65 of file event_handler_stack.hpp.

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

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, c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_src, 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 76 of file event_handler_stack.hpp.

77  {
78  m_src = {};
79  }

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

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

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

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

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

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

130  {
131  const bool is_root = (m_stack.size() == 1u);
132  return is_root && (_has_any_(DOC|VAL|MAP|SEQ) || m_curr->has_children);
133  }
#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 135 of file event_handler_stack.hpp.

136  {
137  const bool is_root = (m_stack.size() == 1u);
138  return !is_root && _has_any_(DOC);
139  }

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

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

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

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

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

template<class HandlerImpl , class HandlerState >
detail::stack<state> c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_stack

Definition at line 51 of file event_handler_stack.hpp.

◆ m_curr

template<class HandlerImpl , class HandlerState >
state* c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_curr

current stack level: top of the stack. cached here for easier access.

Definition at line 52 of file event_handler_stack.hpp.

◆ m_parent

template<class HandlerImpl , class HandlerState >
state* c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_parent

parent of the current stack level.

Definition at line 53 of file event_handler_stack.hpp.

◆ m_relocate_arena

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

callback when the arena gets relocated

Definition at line 54 of file event_handler_stack.hpp.

◆ m_relocate_arena_data

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

Definition at line 55 of file event_handler_stack.hpp.

◆ m_src

template<class HandlerImpl , class HandlerState >
csubstr c4::yml::EventHandlerStack< HandlerImpl, HandlerState >::m_src

Definition at line 56 of file event_handler_stack.hpp.


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