#pragma once #ifndef EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #include "emittermanip.h" #include "ostream.h" #include "null.h" #include #include #include namespace YAML { class EmitterState; class Emitter { public: Emitter(); ~Emitter(); // output const char *c_str() const; unsigned 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 SetIntBase(EMITTER_MANIP value); bool SetSeqFormat(EMITTER_MANIP value); bool SetMapFormat(EMITTER_MANIP value); bool SetIndent(unsigned n); bool SetPreCommentIndent(unsigned n); bool SetPostCommentIndent(unsigned n); // local setters Emitter& SetLocalValue(EMITTER_MANIP value); Emitter& SetLocalIndent(const _Indent& indent); // overloads of write Emitter& Write(const std::string& str); Emitter& Write(bool b); Emitter& Write(const _Alias& alias); Emitter& Write(const _Anchor& anchor); Emitter& Write(const _Tag& tag); Emitter& Write(const _Comment& comment); Emitter& Write(const _Null& null); template Emitter& WriteIntegralType(T value); template Emitter& WriteStreamable(T value); private: void PreWriteIntegralType(std::stringstream& str); void PostWriteIntegralType(const std::stringstream& str); private: enum ATOMIC_TYPE { AT_SCALAR, AT_SEQ, AT_BLOCK_SEQ, AT_FLOW_SEQ, AT_MAP, AT_BLOCK_MAP, AT_FLOW_MAP }; void PreAtomicWrite(); bool GotoNextPreAtomicState(); void PostAtomicWrite(); void EmitSeparationIfNecessary(); void EmitBeginSeq(); void EmitEndSeq(); void EmitBeginMap(); void EmitEndMap(); void EmitKey(); void EmitValue(); private: ostream m_stream; std::auto_ptr m_pState; }; template inline Emitter& Emitter::WriteIntegralType(T value) { if(!good()) return *this; std::stringstream str; PreWriteIntegralType(str); str << value; PostWriteIntegralType(str); return *this; } template inline Emitter& Emitter::WriteStreamable(T value) { if(!good()) return *this; PreAtomicWrite(); EmitSeparationIfNecessary(); std::stringstream str; str << value; m_stream << str.str(); PostAtomicWrite(); return *this; } // 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, 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 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, 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); } } #endif // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66