69 if (relevantClasses.empty()) {
74 os <<
"namespace ReflectiveRapidJSON {\n"
75 "namespace JsonReflector {\n\n";
88 bool pushPrivateMembers =
false, pullPrivateMembers =
false;
89 for (
const clang::FriendDecl *
const friendDecl : relevantClass.record->friends()) {
91 const clang::NamedDecl *
const actualFriendDecl = friendDecl->getFriendDecl();
92 if (!actualFriendDecl || actualFriendDecl->getKind() != clang::Decl::Kind::Function) {
96 const string friendName(actualFriendDecl->getQualifiedNameAsString());
97 if (friendName ==
"ReflectiveRapidJSON::JsonReflector::push") {
98 pushPrivateMembers =
true;
100 if (friendName ==
"ReflectiveRapidJSON::JsonReflector::pull") {
101 pullPrivateMembers =
true;
103 if (pushPrivateMembers && pullPrivateMembers) {
112 os <<
"// define code for (de)serializing " << relevantClass.qualifiedName <<
" objects\n";
115 os <<
"template <> " << visibility <<
" void push<::" << relevantClass.qualifiedName <<
">(const ::" << relevantClass.qualifiedName
116 <<
" &reflectable, ::RAPIDJSON_NAMESPACE::Value::Object &value, ::RAPIDJSON_NAMESPACE::Document::AllocatorType &allocator)\n{\n"
117 " // push base classes\n";
119 os <<
" push(static_cast<const ::" << baseClass->qualifiedName <<
" &>(reflectable), value, allocator);\n";
121 os <<
" // push members\n";
122 auto pushWritten =
false;
123 for (
const clang::FieldDecl *field : relevantClass.record->fields()) {
124 if (pushPrivateMembers || field->getAccess() == clang::AS_public) {
125 os <<
" push(reflectable." << field->getName() <<
", \"" << field->getName() <<
"\", value, allocator);\n";
129 if (relevantBases.empty() && !pushWritten) {
130 os <<
" (void)reflectable;\n (void)value;\n (void)allocator;\n";
135 if (!relevantClass.record->hasDefaultConstructor()) {
140 os <<
"template <> " << visibility <<
" void pull<::" << relevantClass.qualifiedName <<
">(::" << relevantClass.qualifiedName
141 <<
" &reflectable, const ::RAPIDJSON_NAMESPACE::GenericValue<::RAPIDJSON_NAMESPACE::UTF8<char>>::ConstObject &value, "
142 "JsonDeserializationErrors "
144 " // pull base classes\n";
146 os <<
" pull(static_cast<::" << baseClass->qualifiedName <<
" &>(reflectable), value, errors);\n";
148 os <<
" // set error context for current record\n"
149 " const char *previousRecord = nullptr;\n"
151 " previousRecord = errors->currentRecord;\n"
152 " errors->currentRecord = \""
153 << relevantClass.qualifiedName
156 " // pull members\n";
157 auto pullWritten =
false;
158 for (
const clang::FieldDecl *field : relevantClass.record->fields()) {
160 if (field->getType().isConstant(field->getASTContext())) {
163 if (pullPrivateMembers || field->getAccess() == clang::AS_public) {
164 os <<
" pull(reflectable." << field->getName() <<
", \"" << field->getName() <<
"\", value, errors);\n";
168 if (relevantBases.empty() && !pullWritten) {
169 os <<
" (void)reflectable;\n (void)value;\n";
171 os <<
" // restore error context for previous record\n"
173 " errors->currentRecord = previousRecord;\n"
179 os <<
"} // namespace JsonReflector\n"
180 "} // namespace ReflectiveRapidJSON\n";