282 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			282 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#ifndef EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
							 | 
						||
| 
								 | 
							
								#define EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(_MSC_VER) ||                                            \
							 | 
						||
| 
								 | 
							
								    (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
							 | 
						||
| 
								 | 
							
								     (__GNUC__ >= 4))  // GCC supports "pragma once" correctly since 3.4
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <cmath>
							 | 
						||
| 
								 | 
							
								#include <cstddef>
							 | 
						||
| 
								 | 
							
								#include <limits>
							 | 
						||
| 
								 | 
							
								#include <memory>
							 | 
						||
| 
								 | 
							
								#include <sstream>
							 | 
						||
| 
								 | 
							
								#include <string>
							 | 
						||
| 
								 | 
							
								#include <type_traits>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "yaml-cpp/binary.h"
							 | 
						||
| 
								 | 
							
								#include "yaml-cpp/dll.h"
							 | 
						||
| 
								 | 
							
								#include "yaml-cpp/emitterdef.h"
							 | 
						||
| 
								 | 
							
								#include "yaml-cpp/emittermanip.h"
							 | 
						||
| 
								 | 
							
								#include "yaml-cpp/null.h"
							 | 
						||
| 
								 | 
							
								#include "yaml-cpp/ostream_wrapper.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace YAML {
							 | 
						||
| 
								 | 
							
								class Binary;
							 | 
						||
| 
								 | 
							
								struct _Null;
							 | 
						||
| 
								 | 
							
								}  // namespace YAML
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace YAML {
							 | 
						||
| 
								 | 
							
								class EmitterState;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class YAML_CPP_API Emitter {
							 | 
						||
| 
								 | 
							
								 public:
							 | 
						||
| 
								 | 
							
								  Emitter();
							 | 
						||
| 
								 | 
							
								  explicit Emitter(std::ostream& stream);
							 | 
						||
| 
								 | 
							
								  Emitter(const Emitter&) = delete;
							 | 
						||
| 
								 | 
							
								  Emitter& operator=(const Emitter&) = delete;
							 | 
						||
| 
								 | 
							
								  ~Emitter();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // output
							 | 
						||
| 
								 | 
							
								  const char* c_str() const;
							 | 
						||
| 
								 | 
							
								  std::size_t size() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // state checking
							 | 
						||
| 
								 | 
							
								  bool good() const;
							 | 
						||
| 
								 | 
							
								  const std::string GetLastError() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // global setters
							 | 
						||
| 
								 | 
							
								  bool SetOutputCharset(EMITTER_MANIP value);
							 | 
						||
| 
								 | 
							
								  bool SetStringFormat(EMITTER_MANIP value);
							 | 
						||
| 
								 | 
							
								  bool SetBoolFormat(EMITTER_MANIP value);
							 | 
						||
| 
								 | 
							
								  bool SetNullFormat(EMITTER_MANIP value);
							 | 
						||
| 
								 | 
							
								  bool SetIntBase(EMITTER_MANIP value);
							 | 
						||
| 
								 | 
							
								  bool SetSeqFormat(EMITTER_MANIP value);
							 | 
						||
| 
								 | 
							
								  bool SetMapFormat(EMITTER_MANIP value);
							 | 
						||
| 
								 | 
							
								  bool SetIndent(std::size_t n);
							 | 
						||
| 
								 | 
							
								  bool SetPreCommentIndent(std::size_t n);
							 | 
						||
| 
								 | 
							
								  bool SetPostCommentIndent(std::size_t n);
							 | 
						||
| 
								 | 
							
								  bool SetFloatPrecision(std::size_t n);
							 | 
						||
| 
								 | 
							
								  bool SetDoublePrecision(std::size_t n);
							 | 
						||
| 
								 | 
							
								  void RestoreGlobalModifiedSettings();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // local setters
							 | 
						||
| 
								 | 
							
								  Emitter& SetLocalValue(EMITTER_MANIP value);
							 | 
						||
| 
								 | 
							
								  Emitter& SetLocalIndent(const _Indent& indent);
							 | 
						||
| 
								 | 
							
								  Emitter& SetLocalPrecision(const _Precision& precision);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // overloads of write
							 | 
						||
| 
								 | 
							
								  Emitter& Write(const std::string& str);
							 | 
						||
| 
								 | 
							
								  Emitter& Write(bool b);
							 | 
						||
| 
								 | 
							
								  Emitter& Write(char ch);
							 | 
						||
| 
								 | 
							
								  Emitter& Write(const _Alias& alias);
							 | 
						||
| 
								 | 
							
								  Emitter& Write(const _Anchor& anchor);
							 | 
						||
| 
								 | 
							
								  Emitter& Write(const _Tag& tag);
							 | 
						||
| 
								 | 
							
								  Emitter& Write(const _Comment& comment);
							 | 
						||
| 
								 | 
							
								  Emitter& Write(const _Null& n);
							 | 
						||
| 
								 | 
							
								  Emitter& Write(const Binary& binary);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template <typename T>
							 | 
						||
| 
								 | 
							
								  Emitter& WriteIntegralType(T value);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template <typename T>
							 | 
						||
| 
								 | 
							
								  Emitter& WriteStreamable(T value);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								  template <typename T>
							 | 
						||
| 
								 | 
							
								  void SetStreamablePrecision(std::stringstream&) {}
							 | 
						||
| 
								 | 
							
								  std::size_t GetFloatPrecision() const;
							 | 
						||
| 
								 | 
							
								  std::size_t GetDoublePrecision() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void PrepareIntegralStream(std::stringstream& stream) const;
							 | 
						||
| 
								 | 
							
								  void StartedScalar();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								  void EmitBeginDoc();
							 | 
						||
| 
								 | 
							
								  void EmitEndDoc();
							 | 
						||
| 
								 | 
							
								  void EmitBeginSeq();
							 | 
						||
| 
								 | 
							
								  void EmitEndSeq();
							 | 
						||
| 
								 | 
							
								  void EmitBeginMap();
							 | 
						||
| 
								 | 
							
								  void EmitEndMap();
							 | 
						||
| 
								 | 
							
								  void EmitNewline();
							 | 
						||
| 
								 | 
							
								  void EmitKindTag();
							 | 
						||
| 
								 | 
							
								  void EmitTag(bool verbatim, const _Tag& tag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void PrepareNode(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void PrepareTopNode(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void FlowSeqPrepareNode(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void BlockSeqPrepareNode(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void FlowMapPrepareNode(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void FlowMapPrepareLongKey(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void FlowMapPrepareLongKeyValue(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void FlowMapPrepareSimpleKey(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void FlowMapPrepareSimpleKeyValue(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void BlockMapPrepareNode(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void BlockMapPrepareLongKey(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void BlockMapPrepareLongKeyValue(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void BlockMapPrepareSimpleKey(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								  void BlockMapPrepareSimpleKeyValue(EmitterNodeType::value child);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void SpaceOrIndentTo(bool requireSpace, std::size_t indent);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const char* ComputeFullBoolName(bool b) const;
							 | 
						||
| 
								 | 
							
								  const char* ComputeNullName() const;
							 | 
						||
| 
								 | 
							
								  bool CanEmitNewline() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								  std::unique_ptr<EmitterState> m_pState;
							 | 
						||
| 
								 | 
							
								  ostream_wrapper m_stream;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								inline Emitter& Emitter::WriteIntegralType(T value) {
							 | 
						||
| 
								 | 
							
								  if (!good())
							 | 
						||
| 
								 | 
							
								    return *this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  PrepareNode(EmitterNodeType::Scalar);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  std::stringstream stream;
							 | 
						||
| 
								 | 
							
								  PrepareIntegralStream(stream);
							 | 
						||
| 
								 | 
							
								  stream << value;
							 | 
						||
| 
								 | 
							
								  m_stream << stream.str();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  StartedScalar();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return *this;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename T>
							 | 
						||
| 
								 | 
							
								inline Emitter& Emitter::WriteStreamable(T value) {
							 | 
						||
| 
								 | 
							
								  if (!good())
							 | 
						||
| 
								 | 
							
								    return *this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  PrepareNode(EmitterNodeType::Scalar);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  std::stringstream stream;
							 | 
						||
| 
								 | 
							
								  SetStreamablePrecision<T>(stream);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  bool special = false;
							 | 
						||
| 
								 | 
							
								  if (std::is_floating_point<T>::value) {
							 | 
						||
| 
								 | 
							
								    if ((std::numeric_limits<T>::has_quiet_NaN ||
							 | 
						||
| 
								 | 
							
								         std::numeric_limits<T>::has_signaling_NaN) &&
							 | 
						||
| 
								 | 
							
								        std::isnan(value)) {
							 | 
						||
| 
								 | 
							
								      special = true;
							 | 
						||
| 
								 | 
							
								      stream << ".nan";
							 | 
						||
| 
								 | 
							
								    } else if (std::numeric_limits<T>::has_infinity && std::isinf(value)) {
							 | 
						||
| 
								 | 
							
								      special = true;
							 | 
						||
| 
								 | 
							
								      if (std::signbit(value)) {
							 | 
						||
| 
								 | 
							
								        stream << "-.inf";
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        stream << ".inf";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!special) {
							 | 
						||
| 
								 | 
							
								    stream << value;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  m_stream << stream.str();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  StartedScalar();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return *this;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <>
							 | 
						||
| 
								 | 
							
								inline void Emitter::SetStreamablePrecision<float>(std::stringstream& stream) {
							 | 
						||
| 
								 | 
							
								  stream.precision(static_cast<std::streamsize>(GetFloatPrecision()));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <>
							 | 
						||
| 
								 | 
							
								inline void Emitter::SetStreamablePrecision<double>(std::stringstream& stream) {
							 | 
						||
| 
								 | 
							
								  stream.precision(static_cast<std::streamsize>(GetDoublePrecision()));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// overloads of insertion
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, const std::string& v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, bool v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, char v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, unsigned char v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(static_cast<char>(v));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, const _Alias& v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, const _Anchor& v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, const _Tag& v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, const _Comment& v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, const _Null& v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, const Binary& b) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(b);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, const char* v) {
							 | 
						||
| 
								 | 
							
								  return emitter.Write(std::string(v));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, int v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteIntegralType(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, unsigned int v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteIntegralType(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, short v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteIntegralType(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, unsigned short v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteIntegralType(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, long v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteIntegralType(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, unsigned long v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteIntegralType(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, long long v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteIntegralType(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, unsigned long long v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteIntegralType(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, float v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteStreamable(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, double v) {
							 | 
						||
| 
								 | 
							
								  return emitter.WriteStreamable(v);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, EMITTER_MANIP value) {
							 | 
						||
| 
								 | 
							
								  return emitter.SetLocalValue(value);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, _Indent indent) {
							 | 
						||
| 
								 | 
							
								  return emitter.SetLocalIndent(indent);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								inline Emitter& operator<<(Emitter& emitter, _Precision precision) {
							 | 
						||
| 
								 | 
							
								  return emitter.SetLocalPrecision(precision);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								}  // namespace YAML
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif  // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
							 |