1 #ifndef EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 2 #define EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 4 #if defined(_MSC_VER) || \ 5 (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \ 6 (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 16 #include <type_traits> 18 #include "yaml-cpp/binary.h" 19 #include "yaml-cpp/dll.h" 20 #include "yaml-cpp/emitterdef.h" 21 #include "yaml-cpp/emittermanip.h" 22 #include "yaml-cpp/null.h" 23 #include "yaml-cpp/ostream_wrapper.h" 33 class YAML_CPP_API Emitter {
36 explicit Emitter(std::ostream& stream);
37 Emitter(
const Emitter&) =
delete;
38 Emitter& operator=(
const Emitter&) =
delete;
42 const char* c_str()
const;
43 std::size_t size()
const;
47 const std::string GetLastError()
const;
50 bool SetOutputCharset(EMITTER_MANIP value);
51 bool SetStringFormat(EMITTER_MANIP value);
52 bool SetBoolFormat(EMITTER_MANIP value);
53 bool SetNullFormat(EMITTER_MANIP value);
54 bool SetIntBase(EMITTER_MANIP value);
55 bool SetSeqFormat(EMITTER_MANIP value);
56 bool SetMapFormat(EMITTER_MANIP value);
57 bool SetIndent(std::size_t n);
58 bool SetPreCommentIndent(std::size_t n);
59 bool SetPostCommentIndent(std::size_t n);
60 bool SetFloatPrecision(std::size_t n);
61 bool SetDoublePrecision(std::size_t n);
62 void RestoreGlobalModifiedSettings();
65 Emitter& SetLocalValue(EMITTER_MANIP value);
66 Emitter& SetLocalIndent(
const _Indent& indent);
67 Emitter& SetLocalPrecision(
const _Precision& precision);
70 Emitter& Write(
const std::string& str);
71 Emitter& Write(
bool b);
72 Emitter& Write(
char ch);
73 Emitter& Write(
const _Alias& alias);
74 Emitter& Write(
const _Anchor& anchor);
75 Emitter& Write(
const _Tag& tag);
76 Emitter& Write(
const _Comment& comment);
77 Emitter& Write(
const _Null& n);
78 Emitter& Write(
const Binary& binary);
81 Emitter& WriteIntegralType(T value);
84 Emitter& WriteStreamable(T value);
88 void SetStreamablePrecision(std::stringstream&) {}
89 std::size_t GetFloatPrecision()
const;
90 std::size_t GetDoublePrecision()
const;
92 void PrepareIntegralStream(std::stringstream& stream)
const;
104 void EmitTag(
bool verbatim,
const _Tag& tag);
106 void PrepareNode(EmitterNodeType::value child);
107 void PrepareTopNode(EmitterNodeType::value child);
108 void FlowSeqPrepareNode(EmitterNodeType::value child);
109 void BlockSeqPrepareNode(EmitterNodeType::value child);
111 void FlowMapPrepareNode(EmitterNodeType::value child);
113 void FlowMapPrepareLongKey(EmitterNodeType::value child);
114 void FlowMapPrepareLongKeyValue(EmitterNodeType::value child);
115 void FlowMapPrepareSimpleKey(EmitterNodeType::value child);
116 void FlowMapPrepareSimpleKeyValue(EmitterNodeType::value child);
118 void BlockMapPrepareNode(EmitterNodeType::value child);
120 void BlockMapPrepareLongKey(EmitterNodeType::value child);
121 void BlockMapPrepareLongKeyValue(EmitterNodeType::value child);
122 void BlockMapPrepareSimpleKey(EmitterNodeType::value child);
123 void BlockMapPrepareSimpleKeyValue(EmitterNodeType::value child);
125 void SpaceOrIndentTo(
bool requireSpace, std::size_t indent);
127 const char* ComputeFullBoolName(
bool b)
const;
128 const char* ComputeNullName()
const;
129 bool CanEmitNewline()
const;
132 std::unique_ptr<EmitterState> m_pState;
133 ostream_wrapper m_stream;
136 template <
typename T>
137 inline Emitter& Emitter::WriteIntegralType(T value) {
141 PrepareNode(EmitterNodeType::Scalar);
143 std::stringstream stream;
144 PrepareIntegralStream(stream);
146 m_stream << stream.str();
153 template <
typename T>
154 inline Emitter& Emitter::WriteStreamable(T value) {
158 PrepareNode(EmitterNodeType::Scalar);
160 std::stringstream stream;
161 SetStreamablePrecision<T>(stream);
163 bool special =
false;
164 if (std::is_floating_point<T>::value) {
165 if ((std::numeric_limits<T>::has_quiet_NaN ||
166 std::numeric_limits<T>::has_signaling_NaN) &&
170 }
else if (std::numeric_limits<T>::has_infinity && std::isinf(value)) {
172 if (std::signbit(value)) {
183 m_stream << stream.str();
191 inline void Emitter::SetStreamablePrecision<float>(std::stringstream& stream) {
192 stream.precision(static_cast<std::streamsize>(GetFloatPrecision()));
196 inline void Emitter::SetStreamablePrecision<double>(std::stringstream& stream) {
197 stream.precision(static_cast<std::streamsize>(GetDoublePrecision()));
201 inline Emitter&
operator<<(Emitter& emitter,
const std::string& v) {
202 return emitter.Write(v);
204 inline Emitter&
operator<<(Emitter& emitter,
bool v) {
205 return emitter.Write(v);
207 inline Emitter&
operator<<(Emitter& emitter,
char v) {
208 return emitter.Write(v);
210 inline Emitter&
operator<<(Emitter& emitter,
unsigned char v) {
211 return emitter.Write(static_cast<char>(v));
213 inline Emitter&
operator<<(Emitter& emitter,
const _Alias& v) {
214 return emitter.Write(v);
216 inline Emitter&
operator<<(Emitter& emitter,
const _Anchor& v) {
217 return emitter.Write(v);
219 inline Emitter&
operator<<(Emitter& emitter,
const _Tag& v) {
220 return emitter.Write(v);
222 inline Emitter&
operator<<(Emitter& emitter,
const _Comment& v) {
223 return emitter.Write(v);
225 inline Emitter&
operator<<(Emitter& emitter,
const _Null& v) {
226 return emitter.Write(v);
228 inline Emitter&
operator<<(Emitter& emitter,
const Binary& b) {
229 return emitter.Write(b);
232 inline Emitter&
operator<<(Emitter& emitter,
const char* v) {
233 return emitter.Write(std::string(v));
236 inline Emitter&
operator<<(Emitter& emitter,
int v) {
237 return emitter.WriteIntegralType(v);
239 inline Emitter&
operator<<(Emitter& emitter,
unsigned int v) {
240 return emitter.WriteIntegralType(v);
242 inline Emitter&
operator<<(Emitter& emitter,
short v) {
243 return emitter.WriteIntegralType(v);
245 inline Emitter&
operator<<(Emitter& emitter,
unsigned short v) {
246 return emitter.WriteIntegralType(v);
248 inline Emitter&
operator<<(Emitter& emitter,
long v) {
249 return emitter.WriteIntegralType(v);
251 inline Emitter&
operator<<(Emitter& emitter,
unsigned long v) {
252 return emitter.WriteIntegralType(v);
254 inline Emitter&
operator<<(Emitter& emitter,
long long v) {
255 return emitter.WriteIntegralType(v);
257 inline Emitter&
operator<<(Emitter& emitter,
unsigned long long v) {
258 return emitter.WriteIntegralType(v);
261 inline Emitter&
operator<<(Emitter& emitter,
float v) {
262 return emitter.WriteStreamable(v);
264 inline Emitter&
operator<<(Emitter& emitter,
double v) {
265 return emitter.WriteStreamable(v);
268 inline Emitter&
operator<<(Emitter& emitter, EMITTER_MANIP value) {
269 return emitter.SetLocalValue(value);
272 inline Emitter&
operator<<(Emitter& emitter, _Indent indent) {
273 return emitter.SetLocalIndent(indent);
276 inline Emitter&
operator<<(Emitter& emitter, _Precision precision) {
277 return emitter.SetLocalPrecision(precision);
281 #endif // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 JSON_API OStream & operator<<(OStream &, const Value &root)
Output using the StyledStreamWriter.