Example #1
0
        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);
                }
            }
        }
Example #2
0
        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;
            }
        }
Example #3
0
        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;
            }
        }
Example #4
0
        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);
        }
Example #5
0
        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();
            }
        }