|
Video Processing Framework
|
00001 #ifndef EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 00002 #define EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 00003 00004 #if !defined(__GNUC__) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4) // GCC supports "pragma once" correctly since 3.4 00005 #pragma once 00006 #endif 00007 00008 00009 #include "yaml-cpp/dll.h" 00010 #include "yaml-cpp/emittermanip.h" 00011 #include "yaml-cpp/ostream.h" 00012 #include "yaml-cpp/noncopyable.h" 00013 #include "yaml-cpp/null.h" 00014 #include <memory> 00015 #include <string> 00016 #include <sstream> 00017 00018 namespace YAML 00019 { 00020 class EmitterState; 00021 00022 class YAML_CPP_API Emitter: private noncopyable 00023 { 00024 public: 00025 Emitter(); 00026 ~Emitter(); 00027 00028 // output 00029 const char *c_str() const; 00030 unsigned size() const; 00031 00032 // state checking 00033 bool good() const; 00034 const std::string GetLastError() const; 00035 00036 // global setters 00037 bool SetOutputCharset(EMITTER_MANIP value); 00038 bool SetStringFormat(EMITTER_MANIP value); 00039 bool SetBoolFormat(EMITTER_MANIP value); 00040 bool SetIntBase(EMITTER_MANIP value); 00041 bool SetSeqFormat(EMITTER_MANIP value); 00042 bool SetMapFormat(EMITTER_MANIP value); 00043 bool SetIndent(unsigned n); 00044 bool SetPreCommentIndent(unsigned n); 00045 bool SetPostCommentIndent(unsigned n); 00046 00047 // local setters 00048 Emitter& SetLocalValue(EMITTER_MANIP value); 00049 Emitter& SetLocalIndent(const _Indent& indent); 00050 00051 // overloads of write 00052 Emitter& Write(const std::string& str); 00053 Emitter& Write(bool b); 00054 Emitter& Write(const _Alias& alias); 00055 Emitter& Write(const _Anchor& anchor); 00056 Emitter& Write(const _Tag& tag); 00057 Emitter& Write(const _Comment& comment); 00058 Emitter& Write(const _Null& null); 00059 Emitter& Write(const _Binary& binary); 00060 00061 template <typename T> 00062 Emitter& WriteIntegralType(T value); 00063 00064 template <typename T> 00065 Emitter& WriteStreamable(T value); 00066 00067 private: 00068 void PreWriteIntegralType(std::stringstream& str); 00069 void PreWriteStreamable(std::stringstream& str); 00070 void PostWriteIntegralType(const std::stringstream& str); 00071 void PostWriteStreamable(const std::stringstream& str); 00072 00073 private: 00074 enum ATOMIC_TYPE { AT_SCALAR, AT_SEQ, AT_BLOCK_SEQ, AT_FLOW_SEQ, AT_MAP, AT_BLOCK_MAP, AT_FLOW_MAP }; 00075 00076 void PreAtomicWrite(); 00077 bool GotoNextPreAtomicState(); 00078 void PostAtomicWrite(); 00079 void EmitSeparationIfNecessary(); 00080 00081 void EmitBeginDoc(); 00082 void EmitEndDoc(); 00083 void EmitBeginSeq(); 00084 void EmitEndSeq(); 00085 void EmitBeginMap(); 00086 void EmitEndMap(); 00087 void EmitKey(); 00088 void EmitValue(); 00089 void EmitNewline(); 00090 void EmitKindTag(); 00091 void EmitTag(bool verbatim, const _Tag& tag); 00092 00093 const char *ComputeFullBoolName(bool b) const; 00094 bool CanEmitNewline() const; 00095 00096 private: 00097 ostream m_stream; 00098 std::auto_ptr <EmitterState> m_pState; 00099 }; 00100 00101 template <typename T> 00102 inline Emitter& Emitter::WriteIntegralType(T value) 00103 { 00104 if(!good()) 00105 return *this; 00106 00107 std::stringstream str; 00108 PreWriteIntegralType(str); 00109 str << value; 00110 PostWriteIntegralType(str); 00111 return *this; 00112 } 00113 00114 template <typename T> 00115 inline Emitter& Emitter::WriteStreamable(T value) 00116 { 00117 if(!good()) 00118 return *this; 00119 00120 std::stringstream str; 00121 PreWriteStreamable(str); 00122 str << value; 00123 PostWriteStreamable(str); 00124 return *this; 00125 } 00126 00127 // overloads of insertion 00128 inline Emitter& operator << (Emitter& emitter, const std::string& v) { return emitter.Write(v); } 00129 inline Emitter& operator << (Emitter& emitter, bool v) { return emitter.Write(v); } 00130 inline Emitter& operator << (Emitter& emitter, const _Alias& v) { return emitter.Write(v); } 00131 inline Emitter& operator << (Emitter& emitter, const _Anchor& v) { return emitter.Write(v); } 00132 inline Emitter& operator << (Emitter& emitter, const _Tag& v) { return emitter.Write(v); } 00133 inline Emitter& operator << (Emitter& emitter, const _Comment& v) { return emitter.Write(v); } 00134 inline Emitter& operator << (Emitter& emitter, const _Null& v) { return emitter.Write(v); } 00135 inline Emitter& operator << (Emitter& emitter, const _Binary& b) { return emitter.Write(b); } 00136 00137 inline Emitter& operator << (Emitter& emitter, const char *v) { return emitter.Write(std::string(v)); } 00138 00139 inline Emitter& operator << (Emitter& emitter, int v) { return emitter.WriteIntegralType(v); } 00140 inline Emitter& operator << (Emitter& emitter, unsigned int v) { return emitter.WriteIntegralType(v); } 00141 inline Emitter& operator << (Emitter& emitter, short v) { return emitter.WriteIntegralType(v); } 00142 inline Emitter& operator << (Emitter& emitter, unsigned short v) { return emitter.WriteIntegralType(v); } 00143 inline Emitter& operator << (Emitter& emitter, long v) { return emitter.WriteIntegralType(v); } 00144 inline Emitter& operator << (Emitter& emitter, unsigned long v) { return emitter.WriteIntegralType(v); } 00145 inline Emitter& operator << (Emitter& emitter, long long v) { return emitter.WriteIntegralType(v); } 00146 inline Emitter& operator << (Emitter& emitter, unsigned long long v) { return emitter.WriteIntegralType(v); } 00147 00148 inline Emitter& operator << (Emitter& emitter, float v) { return emitter.WriteStreamable(v); } 00149 inline Emitter& operator << (Emitter& emitter, double v) { return emitter.WriteStreamable(v); } 00150 00151 inline Emitter& operator << (Emitter& emitter, EMITTER_MANIP value) { 00152 return emitter.SetLocalValue(value); 00153 } 00154 00155 inline Emitter& operator << (Emitter& emitter, _Indent indent) { 00156 return emitter.SetLocalIndent(indent); 00157 } 00158 } 00159 00160 #endif // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66