private void EmitConversion(BaseClassMapping converter, MemberSpec destObject, MemberSpec destMember, MemberSpec sourceObject, MemberSpec sourceMember) { if (converter == null) { EmitSimpleConvert(destObject, destMember, sourceObject, sourceMember); } else { if (ForeignScaling != 1) throw new NotSupportedException("can't do scaling on complex converts"); if (Invert) throw new NotSupportedException("Can't do complex converts and invert them"); if (string.IsNullOrEmpty(destMember.Name)) { EmitPopulateThis(converter, destObject, destMember, sourceObject, sourceMember); } else if (string.IsNullOrEmpty(sourceMember.Name)) { EmitBuildFromThis(converter, destObject, destMember, sourceObject, sourceMember); } else if (Collection) { if (destMember.Type.Modifier == TypeSpec.Modifiers.pointer) { m_currentFile.FormatLine("for (int i=0; i<{0}->Count; i++)", BuildBit(sourceObject, sourceMember)); } else { m_currentFile.FormatLine("for (unsigned int i=0; i<{0}.size(); i++)", BuildBit(sourceObject, sourceMember)); } m_currentFile.WriteLine("{"); EmitListComplexConvert(converter, destObject, destMember, sourceObject, sourceMember); m_currentFile.WriteLine("}"); } else { EmitComplexConvert(converter, destObject, destMember, sourceObject, sourceMember); } } }
private void EmitBuildFromThis(BaseClassMapping converter, MemberSpec destObject, MemberSpec destMember, MemberSpec sourceObject, MemberSpec sourceMember) { string dest = BuildBit(destObject, destMember); switch (destMember.Type.Modifier) { case TypeSpec.Modifiers.managedReference: m_currentFile.FormatLine("_ASSERT({0} == nullptr);", dest); m_currentFile.FormatLine("{0} = {2}::Construct({1});", dest, sourceObject.Name, converter); break; case TypeSpec.Modifiers.pointer: m_currentFile.FormatLine("_ASSERT({0} == NULL);", dest); m_currentFile.FormatLine("{0} = {2}::Construct({1}, destination->GetFileContext());", dest, sourceObject.Name, converter); break; case TypeSpec.Modifiers.reference: throw new NotImplementedException(); case TypeSpec.Modifiers.value: m_currentFile.FormatLine("{2}::Populate({0}, {1});", dest, sourceObject.Name, converter); break; } }
private void EmitComplexConvert(BaseClassMapping converter, MemberSpec destObject, MemberSpec destMember, MemberSpec sourceObject, MemberSpec sourceMember) { string source = BuildBit(sourceObject, sourceMember); if (converter.ForeignType != null && sourceMember.Type.Name == converter.ForeignType.Name) { if ((sourceMember.Type.Modifier == TypeSpec.Modifiers.value) && (converter.ForeignType.Modifier == TypeSpec.Modifiers.pointer)) source = "&" + source; } string dest = BuildBit(destObject, destMember); if (converter.ForeignType != null && destMember.Type.Name == converter.ForeignType.Name) { if ((destMember.Type.Modifier == TypeSpec.Modifiers.value) && (converter.ForeignType.Modifier == TypeSpec.Modifiers.pointer)) dest = "&" + dest; } if (converter is EnumerationMapping || converter is ManualMapping) { m_currentFile.FormatLine("{0} = {2}::Convert({1});", dest, source, converter); return; } switch (destMember.Type.Modifier) { case TypeSpec.Modifiers.managedReference: m_currentFile.FormatLine("_ASSERT({0} == nullptr);", dest); m_currentFile.FormatLine("{0} = {2}::Construct({1});", dest, source, converter); break; case TypeSpec.Modifiers.pointer: m_currentFile.FormatLine("_ASSERT({0} == NULL);", dest); m_currentFile.FormatLine("{0} = {2}::Construct({1},destination->GetFileContext());", dest, source, converter); break; case TypeSpec.Modifiers.reference: throw new NotImplementedException(); case TypeSpec.Modifiers.value: m_currentFile.FormatLine("{2}::Populate({0}, {1});", dest, source, converter); break; } }
private void EmitPopulateThis(BaseClassMapping converter, MemberSpec destObject, MemberSpec destMember, MemberSpec sourceObject, MemberSpec sourceMember) { string source = BuildBit(sourceObject, sourceMember); m_currentFile.FormatLine("{0}::Populate({1}, {2});", converter, destObject.Name, source); }
private void EmitListComplexConvert(BaseClassMapping converter, MemberSpec destObject, MemberSpec destMember, MemberSpec sourceObject, MemberSpec sourceMember) { string source = BuildBit(sourceObject, sourceMember); string dest = BuildBit(destObject, destMember); if (converter is EnumerationMapping || converter is ManualMapping) { throw new Exception("not handled yet"); } switch (destMember.Type.Modifier) { case TypeSpec.Modifiers.managedReference: m_currentFile.FormatLine("{0}->Add({2}::Construct({1}[i]));", dest, source, converter); break; case TypeSpec.Modifiers.pointer: m_currentFile.FormatLine("{0}.push_back({2}::Construct({1}[i], destination->GetFileContext()));", dest, source, converter); break; case TypeSpec.Modifiers.reference: throw new NotImplementedException(); case TypeSpec.Modifiers.value: throw new NotImplementedException(); } }