00001 #ifndef parens_SERIALIZER_H_INCLUDED
00002 #define parens_SERIALIZER_H_INCLUDED 1
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "data_node_format.h"
00012 #define PARENS_VERSION "$Revision: 1.1.1.1 $"
00013 #define MAGIC_COOKIE_PARENS "(s11n::parens)"
00014 #define TAB(LEVEL,ECHO) indent = ""; for( size_t i = 0; i < depth + LEVEL; i++ ) { indent += '\t'; if(ECHO) dest << '\t'; }
00015
00016 namespace s11n {
00017 namespace io {
00018
00019 namespace sharing {
00020
00021
00022
00023 struct parens_sharing_context {};
00024 }
00025
00026
00027
00028
00029
00030 entity_translation_map & parens_serializer_translations();
00031
00032
00033
00034
00035 template <typename NodeType>
00036 class parens_serializer : public tree_builder_lexer<NodeType,sharing::parens_sharing_context>
00037 {
00038 public:
00039 typedef NodeType node_type;
00040
00041 typedef parens_serializer<node_type> this_type;
00042 typedef tree_builder_lexer<node_type,sharing::parens_sharing_context> parent_type;
00043
00044 parens_serializer() : parent_type( "parens_data_nodeFlexLexer" ),
00045 m_depth(0)
00046 {
00047 this->magic_cookie( MAGIC_COOKIE_PARENS );
00048 }
00049
00050 virtual ~parens_serializer() {}
00051
00052 typedef entity_translation_map translation_map;
00053
00054
00055
00056
00057
00058 virtual const translation_map & entity_translations() const
00059 {
00060 return parens_serializer_translations();
00061 }
00062
00063
00064
00065
00066
00067 virtual bool serialize( const node_type & src, std::ostream & dest )
00068 {
00069 size_t depth = this->m_depth++;
00070 if( 0 == depth )
00071 {
00072 node_type & meta = this->metadata();
00073 dest << this->magic_cookie() << '\n';
00074 meta.set( "serializer_revision", PARENS_VERSION );
00075 meta.set( "serializer_class", ::classname<this_type>() );
00076
00077 }
00078
00079
00080 std::string indent;
00081
00082
00083
00084 std::string quote =
00085 (std::string::npos != src.impl_class().find('<'))
00086 ? "\""
00087 : "";
00088 dest << src.name() << "=" << this->m_open
00089 << quote << src.impl_class() << quote;
00090
00091 bool gotp = (src.begin() != src.end());
00092
00093 if( gotp )
00094 {
00095
00096 std::for_each(src.begin(),
00097 src.end(),
00098 key_value_serializer<node_type>(
00099 &(this->entity_translations()),
00100 dest,
00101 ' ' + this->m_open ,
00102 " ",
00103 this->m_close + ' ' )
00104 );
00105 }
00106 bool gotch = (src.children().begin() != src.children().end());
00107 if( gotch )
00108 {
00109 dest << '\n';
00110 TAB(1,0);
00111 std::for_each( src.children().begin(),
00112 src.children().end(),
00113 node_child_simple_formatter<this_type>(
00114 *this,
00115 dest,
00116 indent,
00117 "" )
00118 );
00119 TAB(0,1);
00120 }
00121
00122 dest << this->m_close << '\n';
00123
00124 if( 0 == depth )
00125 {
00126 dest.flush();
00127 }
00128 --this->m_depth;
00129 return true;
00130 }
00131
00132
00133
00134 private:
00135 size_t m_depth;
00136 static const std::string m_open;
00137 static const std::string m_close;
00138 };
00139 template <typename NodeType>
00140 const std::string parens_serializer<NodeType>::m_open = "(";
00141 template <typename NodeType>
00142 const std::string parens_serializer<NodeType>::m_close = ")";
00143
00144 }
00145 }
00146
00147 #undef TAB
00148
00149 #endif // parens_SERIALIZER_H_INCLUDED