Пример #1
0
        public static Expression BuildPopulationLoop <TLoopData>(
            this TLoopData loopData,
            EnumerablePopulationBuilder builder,
            IObjectMappingData mappingData,
            Func <TLoopData, IObjectMappingData, Expression> elementPopulationFactory)
            where TLoopData : IPopulationLoopData
        {
            // TODO: Not all enumerable mappings require the Counter
            var breakLoop = Expression.Break(Expression.Label(typeof(void), "Break"));

            var elementPopulation = elementPopulationFactory.Invoke(loopData, mappingData);

            var loopBody = GetLoopBody(loopData, builder, breakLoop, elementPopulation);

            var populationLoop = loopData.NeedsContinueTarget
                ? Expression.Loop(loopBody, breakLoop.Target, loopData.ContinueLoopTarget)
                : Expression.Loop(loopBody, breakLoop.Target);

            var adaptedLoop = loopData.Adapt(populationLoop);

            var population = Expression.Block(
                new[] { builder.Counter },
                builder.Counter.AssignTo(ToNumericConverter <int> .Zero),
                adaptedLoop);

            return(population);
        }
Пример #2
0
        private static BlockExpression GetLoopBody(
            IPopulationLoopData loopData,
            EnumerablePopulationBuilder builder,
            Expression breakLoop,
            Expression elementPopulation)
        {
            var ifExitCheckBreakLoop = Expression.IfThen(loopData.LoopExitCheck, breakLoop);
            var counterIncrement     = builder.GetCounterIncrement();

            if (elementPopulation.NodeType != ExpressionType.Block)
            {
                return(Expression.Block(ifExitCheckBreakLoop, elementPopulation, counterIncrement));
            }

            var elementPopulationBlock = (BlockExpression)elementPopulation;

            var loopExpressions = new Expression[elementPopulationBlock.Expressions.Count + 2];

            loopExpressions[0] = ifExitCheckBreakLoop;
            loopExpressions.CopyFrom(elementPopulationBlock.Expressions, startIndex: 1);
            loopExpressions[loopExpressions.Length - 1] = counterIncrement;

            return(elementPopulationBlock.Variables.Any()
                ? Expression.Block(elementPopulationBlock.Variables, loopExpressions)
                : Expression.Block(loopExpressions));
        }
        private static Expression ApplySourceFilterIfAppropriate(
            Expression elementPopulation,
            IPopulationLoopData loopData,
            EnumerablePopulationBuilder builder)
        {
            if (!builder.MapperData.MapperContext.UserConfigurations.HasSourceValueFilters)
            {
                return(elementPopulation);
            }

            var sourceElement = loopData.GetSourceElementValue();

            var sourceValueFilters = builder.MapperData
                                     .GetSourceValueFilters(sourceElement.Type);

            if (sourceValueFilters.None())
            {
                return(elementPopulation);
            }

            var sourceFilterConditions = sourceValueFilters
                                         .GetFilterConditionsOrNull(sourceElement, builder.MapperData);

            return((sourceFilterConditions != null)
                ? Expression.IfThen(sourceFilterConditions, elementPopulation)
                : elementPopulation);
        }
        public static Expression Create(
            EnumerablePopulationBuilder builder,
            IObjectMappingData enumerableMappingData)
        {
            if (builder.TargetElementsAreSimple)
            {
                builder.AssignSourceVariableTo(s => s.SourceItemsProjectedToTargetType().ExcludingTargetItems());
                builder.AssignTargetVariable();
                builder.AddNewItemsToTargetVariable(enumerableMappingData);

                return(builder);
            }

            if (builder.ElementsAreIdentifiable)
            {
                builder.CreateCollectionData();
                builder.MapIntersection(enumerableMappingData);
                builder.AssignSourceVariableTo(s => s.CollectionDataNewSourceItems());
                builder.AssignTargetVariable();
                builder.AddNewItemsToTargetVariable(enumerableMappingData);

                return(builder);
            }

            builder.AssignSourceVariableToSourceObject();
            builder.AssignTargetVariable();
            builder.AddNewItemsToTargetVariable(enumerableMappingData);

            return(builder);
        }
        public static Expression Create(EnumerablePopulationBuilder builder, IObjectMappingData enumerableMappingData)
        {
            builder.AssignSourceVariableFromSourceObject();
            builder.AssignTargetVariable();
            builder.AddNewItemsToTargetVariable(enumerableMappingData);

            return(builder);
        }
        public Expression GetPopulation(
            EnumerablePopulationBuilder builder,
            IObjectMappingData enumerableMappingData)
        {
            builder.PopulateTargetVariableFromSourceObjectOnly(enumerableMappingData);

            return(builder);
        }
        public EnumerableSourcePopulationLoopData(
            EnumerablePopulationBuilder builder,
            Type elementType,
            Expression enumerableSubject)
        {
            Builder            = builder;
            _enumerableSubject = enumerableSubject;

            _getEnumeratorMethod = typeof(IEnumerable <>).MakeGenericType(elementType).GetPublicInstanceMethod("GetEnumerator");
            _enumerator          = Expression.Variable(_getEnumeratorMethod.ReturnType, "enumerator");

            ContinueLoopTarget = Expression.Label(typeof(void), "Continue");
            LoopExitCheck      = Expression.Not(Expression.Call(_enumerator, typeof(IEnumerator).GetPublicInstanceMethod("MoveNext")));
            SourceElement      = Expression.Property(_enumerator, "Current");
        }
Пример #8
0
        public IndexedSourcePopulationLoopData(EnumerablePopulationBuilder builder)
        {
            _builder           = builder;
            ContinueLoopTarget = Expression.Label(typeof(void), "Continue");
            LoopExitCheck      = Expression.Equal(builder.Counter, builder.GetSourceCountAccess());

            _indexedSourceAccess = builder.GetSourceIndexAccess();

            _useDirectValueAccess =
                builder.ElementTypesAreSimple ||
                builder.SourceTypeHelper.ElementType.RuntimeTypeNeeded() ||
                builder.TargetTypeHelper.ElementType.RuntimeTypeNeeded();

            _sourceElement = _useDirectValueAccess
                ? _indexedSourceAccess
                : builder.Context.GetSourceParameterFor(builder.SourceTypeHelper.ElementType);
        }
        public Expression GetPopulation(
            EnumerablePopulationBuilder builder,
            IObjectMappingData enumerableMappingData)
        {
            if (builder.ElementTypesAreSimple)
            {
                if (builder.TargetTypeHelper.IsReadOnly)
                {
                    builder.PopulateTargetVariableFromSourceObjectOnly();
                    return(builder);
                }

                builder.AssignSourceVariableFrom(s => s.SourceItemsProjectedToTargetType());
                builder.AssignTargetVariable();
                builder.RemoveAllTargetItems();
                builder.AddNewItemsToTargetVariable(enumerableMappingData);

                return(builder);
            }

            if (builder.ElementsAreIdentifiable)
            {
                builder.CreateCollectionData();
                builder.MapIntersection(enumerableMappingData);
                builder.AssignSourceVariableFrom(s => s.CollectionDataNewSourceItems());
                builder.AssignTargetVariable();
                builder.RemoveTargetItemsById();
                builder.AddNewItemsToTargetVariable(enumerableMappingData);

                return(builder);
            }

            builder.AssignSourceVariableFromSourceObject();
            builder.AssignTargetVariable();
            builder.RemoveAllTargetItems();
            builder.AddNewItemsToTargetVariable(enumerableMappingData);

            return(builder);
        }
Пример #10
0
        public static ISourceEnumerableAdapter GetAdapterFor(EnumerablePopulationBuilder builder)
        {
            var dictionarySourceMember = builder.MapperData.GetDictionarySourceMemberOrNull();

            if (dictionarySourceMember != null)
            {
                if (!builder.MapperData.IsRoot)
                {
                    if (dictionarySourceMember.HasObjectEntries)
                    {
                        return(new SourceObjectDictionaryAdapter(dictionarySourceMember, builder));
                    }

                    if (dictionarySourceMember.CouldContainSourceInstance)
                    {
                        return(new SourceInstanceDictionaryAdapter(dictionarySourceMember, builder));
                    }
                }

                return(new SourceElementsDictionaryAdapter(dictionarySourceMember, builder));
            }

            return(new DefaultSourceEnumerableAdapter(builder));
        }
 protected SourceEnumerableAdapterBase(EnumerablePopulationBuilder builder)
 {
     Builder = builder;
 }
 public DefaultSourceEnumerableAdapter(EnumerablePopulationBuilder builder)
     : base(builder)
 {
 }
 public EnumerableSourcePopulationLoopData(EnumerablePopulationBuilder builder)
     : this(builder, builder.SourceTypeHelper.ElementType, builder.SourceValue)
 {
 }