// Generate struct or table methods. static void GenStruct(const StructDef &struct_def, std::string *code_ptr, StructDef *root_struct_def) { if (struct_def.generated) return; Comment(struct_def.doc_comment, code_ptr); BeginClass(struct_def, code_ptr); if (&struct_def == root_struct_def) { // Generate a special accessor for the table that has been declared as // the root type. NewRootTypeFromBuffer(struct_def, code_ptr); } // Generate the Init method that sets the field in a pre-existing // accessor object. This is to allow object reuse. InitializeExisting(struct_def, code_ptr); for (auto it = struct_def.fields.vec.begin(); it != struct_def.fields.vec.end(); ++it) { auto &field = **it; if (field.deprecated) continue; GenStructAccessor(struct_def, field, code_ptr); } if (struct_def.fixed) { // create a struct constructor function GenStructBuilder(struct_def, code_ptr); } else { // Create a set of functions that allow table construction. GenTableBuilders(struct_def, code_ptr); } }
void CObjectOStream::WriteClass(const CClassTypeInfo* classType, TConstObjectPtr classPtr) { BEGIN_OBJECT_FRAME2(eFrameClass, classType); BeginClass(classType); for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) { classType->GetMemberInfo(*i)->WriteMember(*this, classPtr); } EndClass(); END_OBJECT_FRAME(); }
void CObjectOStream::CopyClassRandom(const CClassTypeInfo* classType, CObjectStreamCopier& copier) { BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameClass, classType); copier.In().BeginClass(classType); BeginClass(classType); vector<Uint1> read(classType->GetMembers().LastIndex() + 1); BEGIN_OBJECT_2FRAMES_OF(copier, eFrameClassMember); TMemberIndex index; while ( (index = copier.In().BeginClassMember(classType)) != kInvalidMember ) { const CMemberInfo* memberInfo = classType->GetMemberInfo(index); copier.In().SetTopMemberId(memberInfo->GetId()); SetTopMemberId(memberInfo->GetId()); copier.SetPathHooks(*this, true); if ( read[index] ) { copier.In().DuplicatedMember(memberInfo); } else { read[index] = true; BeginClassMember(memberInfo->GetId()); memberInfo->CopyMember(copier); EndClassMember(); } copier.SetPathHooks(*this, false); copier.In().EndClassMember(); } END_OBJECT_2FRAMES_OF(copier); // init all absent members for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) { if ( !read[*i] ) { classType->GetMemberInfo(*i)->CopyMissingMember(copier); } } EndClass(); copier.In().EndClass(); END_OBJECT_2FRAMES_OF(copier); }
void CObjectOStream::CopyClassSequential(const CClassTypeInfo* classType, CObjectStreamCopier& copier) { BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameClass, classType); copier.In().BeginClass(classType); BeginClass(classType); CClassTypeInfo::CIterator pos(classType); BEGIN_OBJECT_2FRAMES_OF(copier, eFrameClassMember); TMemberIndex index; while ( (index = copier.In().BeginClassMember(classType, *pos)) != kInvalidMember ) { const CMemberInfo* memberInfo = classType->GetMemberInfo(index); copier.In().SetTopMemberId(memberInfo->GetId()); SetTopMemberId(memberInfo->GetId()); copier.SetPathHooks(*this, true); for ( TMemberIndex i = *pos; i < index; ++i ) { // init missing member classType->GetMemberInfo(i)->CopyMissingMember(copier); } BeginClassMember(memberInfo->GetId()); memberInfo->CopyMember(copier); pos.SetIndex(index + 1); EndClassMember(); copier.SetPathHooks(*this, false); copier.In().EndClassMember(); } END_OBJECT_2FRAMES_OF(copier); // init all absent members for ( ; pos.Valid(); ++pos ) { classType->GetMemberInfo(*pos)->CopyMissingMember(copier); } EndClass(); copier.In().EndClass(); END_OBJECT_2FRAMES_OF(copier); }