00001
#ifndef compact_SERIALIZER_H_INCLUDED
00002
#define compact_SERIALIZER_H_INCLUDED 1
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include "data_node_format.h"
00012
00013
#define MAGIC_COOKIE_COMPACT "51191011"
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 compact_sharing_context {};
00024 }
00025
00026
00027
00028
00029
template <
typename NodeType>
00030 class compact_serializer :
public tree_builder_lexer<NodeType,sharing::compact_sharing_context>
00031 {
00032
public:
00033
typedef NodeType node_type;
00034
00035
typedef compact_serializer<node_type> this_type;
00036
typedef tree_builder_lexer<node_type,sharing::compact_sharing_context> parent_type;
00037
00038
compact_serializer() :
parent_type(
"compact_data_nodeFlexLexer" ),
00039 m_depth(0)
00040 {
00041 this->
magic_cookie( MAGIC_COOKIE_COMPACT );
00042 }
00043
00044
virtual ~
compact_serializer() {}
00045
00046
typedef entity_translation_map translation_map;
00047
00048
00049
00050
00051
00052 virtual bool serialize(
const node_type & src, std::ostream & dest )
00053 {
00054
static const int ctrlwidth = 2;
00055
static const int size2b = 2;
00056
static const int size4b = 4;
00057
static const int cookiewidth = 8;
00058
00059
static const unsigned long Magic_Cookie_4B = 0x51191011;
00060
static const unsigned long Node_Open = 0xf1;
00061
static const unsigned long Node_Close = 0xf0;
00062
static const unsigned long Prop_Open = 0xe1;
00063
static const unsigned long Data_End = 0x51190000;
00064
00065
00066
00067 std::string nname = src.name();
00068 std::string impl = src.impl_class();
00069
00070 std::string::size_type sizE = 0;
00071 std::string::size_type ins;
00072
00073
#define OS_INT(C,W) dest.width(W);dest<<std::hex<<std::right<<(unsigned int)(C);
00074
#define INSERT(vaR,WIDTH) sizE = vaR.size(); OS_INT(sizE,WIDTH); \
00075
for( ins = 0; ins < sizE; ins++ ) {\
00076
\
00077 dest << (unsigned char) vaR[ins]; \
00078 };
00079 size_t depth = this->m_depth++;
00080
00081
if ( 0 == depth )
00082 {
00083 dest.setf( std::ios_base::hex );
00084 dest.fill(
'0');
00085 dest.setf(std::ios_base::right, std::ios_base::adjustfield);
00086 OS_INT(Magic_Cookie_4B,cookiewidth);
00087 dest <<
'\n';
00088 }
00089
00090 OS_INT(Node_Open,ctrlwidth);
00091 INSERT(nname,size2b);
00092 INSERT(impl,size2b);
00093
typedef typename node_type::const_iterator CIT;
00094 CIT it = src.begin();
00095 CIT et = src.end();
00096 std::string propval;
00097 std::string propname;
00098
for ( ; it != et; ++it )
00099 {
00100 OS_INT(Prop_Open,ctrlwidth);
00101 propname = ( *it ).first;
00102 INSERT(propname,size2b);
00103 propval = ( *it ).second;
00104 INSERT(propval,size4b);
00105
00106 }
00107
00108 std::for_each( src.children().begin(),
00109 src.children().end(),
00110
node_child_simple_formatter<this_type>( *
this, dest,
"",
"" )
00111 );
00112
00113 OS_INT(Node_Close,ctrlwidth);
00114 dest <<
'\n';
00115
if( 0 == depth )
00116 {
00117 OS_INT(Data_End,cookiewidth);
00118 dest << std::endl;
00119
00120 }
00121 --this->m_depth;
00122
return true;
00123 }
00124
#undef OS_INT
00125
#undef INSERT
00126
00127
00128
00129
private:
00130 size_t m_depth;
00131
static const std::string m_open;
00132
static const std::string m_close;
00133 };
00134
template <
typename NodeType>
00135
const std::string compact_serializer<NodeType>::m_open =
"(";
00136
template <
typename NodeType>
00137
const std::string compact_serializer<NodeType>::m_close =
")";
00138
00139 }
00140 }
00141
00142
#undef TAB
00143
00144
#endif // compact_SERIALIZER_H_INCLUDED