9#ifndef CLASSDESC_STRINGKEYMAP_H
10#define CLASSDESC_STRINGKEYMAP_H
14#include "json_pack_base.h"
17#include "xsd_generate_base.h"
36 void convert(StringKeyMap<T>& map,
const json_pack_t& j)
37 {
if (j.type()!=RESTProcessType::null) j>>map;}
44 json5_parser::mValue& parent=
json_find(j,head(d));
45 if (parent.type()!=json5_parser::obj_type)
46 throw json_pack_error(
"attempt to pack an array member into a non-object");
49 typename StringKeyMap<T>::const_iterator i=a.begin();
50 for (; i!=a.end(); ++i)
56 if (j.throw_on_error)
throw;
65 const json5_parser::mValue& val=
json_find(j,d);
68 case json5_parser::obj_type:
70 const json5_parser::mObject& arr=val.get_obj();
72 for (json5_parser::mObject::const_iterator i=arr.begin(); i!=arr.end(); ++i)
73 json_unpack(j,d+
"."+i->first,a[i->first]);
76 case json5_parser::null_type:
85 if (j.throw_on_error)
throw;
92 std::ostringstream os;
94 string eName=typeName<T>().c_str();
95 eName=eName.substr(0,eName.find(
'<'));
97 const char *el=eName.c_str()+eName.length();
98 while (el!=eName.c_str() && *(el-1)!=
' ' && *(el-1)!=
':') el--;
101 os <<
" <xs:complexType name=\"" << type <<
"\">\n";
102 os <<
" <xs:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">\n";
106 os <<
" <xs:any processContents=\"lax\"/>\n";
107 os <<
" </xs:sequence>\n";
108 os <<
" </xs:complexType>\n";
110 g.defineType(type, os.str());
111 g.addDependency(type, xsd_typeName<T>());
113 xsd_generate(g,
"",
T());
118using classdesc::xsd_generate;
128 void operator()(cd::json_pack_t& j,
const cd::string& d,U& x)
129 {json_pack_stringKeyMap(j,d,x);}
135 void operator()(cd::json_unpack_t& j,
const cd::string& d,cd::StringKeyMap<T>& x)
136 {json_unpack_stringKeyMap(j,d,x);}
137 void operator()(cd::json_unpack_t& j,
const cd::string& d,
const cd::StringKeyMap<T>& x)
145 void operator()(cd::xml_pack_t& x,
const cd::string& d,U& arg)
147 cd::xml_pack_t::Tag tag(x,d);
148 for (
typename cd::StringKeyMap<T>::const_iterator i=arg.begin();
150 ::xml_pack(x,d+
"."+i->first,i->second);
158 void operator()(cd::xml_unpack_t& x,
const cd::string& d,U& arg)
160 for (cd::xml_unpack_t::ContentMap::const_iterator i=x.firstToken(d);
161 i!=x.endToken(d); ++i)
163 std::string key=i->first;
164 size_t p=i->first.rfind(
'.');
165 if (p!=std::string::npos) key=key.substr(p);
166 ::xml_unpack(x,i->first,arg[key]);
175#pragma omit json_pack classdesc::StringKeyMap
176#pragma omit json_unpack classdesc::StringKeyMap
177#pragma omit xml_pack classdesc::StringKeyMap
178#pragma omit xml_unpack classdesc::StringKeyMap
179#pragma omit xsd_generate classdesc::StringKeyMap
Definition json_pack_base.h:35
Definition json_pack_base.h:99
Definition xsd_generate_base.h:22
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition classdesc_access.h:20
Contains definitions related to classdesc functionality.
json5_parser::mValue & json_find(json5_parser::mValue &x, std::string name)
find an object named by name within the json object x
Definition json_pack_base.h:228
void json_pack(json_pack_t &o, const string &d, T &a)
forward declare generic json operations
Definition json_pack_epilogue.h:61
Definition stringKeyMap.h:24
determines if T is a standard associative container
Definition classdesc.h:321
true_type if T is a StringKeyMap
Definition classdesc.h:364
Definition json_pack_epilogue.h:92
Definition json_pack_epilogue.h:104
Definition classdesc_access.h:23
Definition classdesc_access.h:24
XML serialisation descriptor.
XML deserialisation descriptor.