mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-09 12:41:17 +00:00

* Add compilation flags: -Wshadow -Weffc++ -pedantic -pedantic-errors * Delete implicit copy & move constructors & assignment operators in classes with pointer data members. * An exception to the above: Add default copy & move constructors & assignment operators for the Binary class. * Convert boolean RegEx operators to binary operators. * Initialize all members in all classes in ctors. * Let default ctor delegate to the converting ctor in Binary and RegEx * Don't change any tests except regex_test (as a result of the change to binary operators). Note: https://bugzilla.redhat.com/show_bug.cgi?id=1544675 makes -Weffc++ report a false positive in "include/yaml-cpp/node/impl.h".
121 lines
2.8 KiB
C++
121 lines
2.8 KiB
C++
#include <cassert>
|
|
#include <sstream>
|
|
|
|
#include "yaml-cpp/emitfromevents.h"
|
|
#include "yaml-cpp/emitter.h"
|
|
#include "yaml-cpp/emittermanip.h"
|
|
#include "yaml-cpp/null.h"
|
|
|
|
namespace YAML {
|
|
struct Mark;
|
|
} // namespace YAML
|
|
|
|
namespace {
|
|
std::string ToString(YAML::anchor_t anchor) {
|
|
std::stringstream stream;
|
|
stream << anchor;
|
|
return stream.str();
|
|
}
|
|
} // namespace
|
|
|
|
namespace YAML {
|
|
EmitFromEvents::EmitFromEvents(Emitter& emitter)
|
|
: m_emitter(emitter), m_stateStack{} {}
|
|
|
|
void EmitFromEvents::OnDocumentStart(const Mark&) {}
|
|
|
|
void EmitFromEvents::OnDocumentEnd() {}
|
|
|
|
void EmitFromEvents::OnNull(const Mark&, anchor_t anchor) {
|
|
BeginNode();
|
|
EmitProps("", anchor);
|
|
m_emitter << Null;
|
|
}
|
|
|
|
void EmitFromEvents::OnAlias(const Mark&, anchor_t anchor) {
|
|
BeginNode();
|
|
m_emitter << Alias(ToString(anchor));
|
|
}
|
|
|
|
void EmitFromEvents::OnScalar(const Mark&, const std::string& tag,
|
|
anchor_t anchor, const std::string& value) {
|
|
BeginNode();
|
|
EmitProps(tag, anchor);
|
|
m_emitter << value;
|
|
}
|
|
|
|
void EmitFromEvents::OnSequenceStart(const Mark&, const std::string& tag,
|
|
anchor_t anchor,
|
|
EmitterStyle::value style) {
|
|
BeginNode();
|
|
EmitProps(tag, anchor);
|
|
switch (style) {
|
|
case EmitterStyle::Block:
|
|
m_emitter << Block;
|
|
break;
|
|
case EmitterStyle::Flow:
|
|
m_emitter << Flow;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
m_emitter << BeginSeq;
|
|
m_stateStack.push(State::WaitingForSequenceEntry);
|
|
}
|
|
|
|
void EmitFromEvents::OnSequenceEnd() {
|
|
m_emitter << EndSeq;
|
|
assert(m_stateStack.top() == State::WaitingForSequenceEntry);
|
|
m_stateStack.pop();
|
|
}
|
|
|
|
void EmitFromEvents::OnMapStart(const Mark&, const std::string& tag,
|
|
anchor_t anchor, EmitterStyle::value style) {
|
|
BeginNode();
|
|
EmitProps(tag, anchor);
|
|
switch (style) {
|
|
case EmitterStyle::Block:
|
|
m_emitter << Block;
|
|
break;
|
|
case EmitterStyle::Flow:
|
|
m_emitter << Flow;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
m_emitter << BeginMap;
|
|
m_stateStack.push(State::WaitingForKey);
|
|
}
|
|
|
|
void EmitFromEvents::OnMapEnd() {
|
|
m_emitter << EndMap;
|
|
assert(m_stateStack.top() == State::WaitingForKey);
|
|
m_stateStack.pop();
|
|
}
|
|
|
|
void EmitFromEvents::BeginNode() {
|
|
if (m_stateStack.empty())
|
|
return;
|
|
|
|
switch (m_stateStack.top()) {
|
|
case State::WaitingForKey:
|
|
m_emitter << Key;
|
|
m_stateStack.top() = State::WaitingForValue;
|
|
break;
|
|
case State::WaitingForValue:
|
|
m_emitter << Value;
|
|
m_stateStack.top() = State::WaitingForKey;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void EmitFromEvents::EmitProps(const std::string& tag, anchor_t anchor) {
|
|
if (!tag.empty() && tag != "?" && tag != "!")
|
|
m_emitter << VerbatimTag(tag);
|
|
if (anchor)
|
|
m_emitter << Anchor(ToString(anchor));
|
|
}
|
|
} // namespace YAML
|