Exemple #1
0
        public bool Sync()
        {
            IsChanged = FAutoValidate ? FNodeIn.PinIsChanged : FNodeIn.Validate();
            if (IsChanged)
            {
                object usI;
                FNodeIn.GetUpstreamInterface(out usI);

                FNodeIn.GetUpStreamSlices(out FLength, out FUpStreamSlices);
                // Check fastest way first: TUpstream == T
                var wrapper = usI as DynamicTypeWrapper;
                if (wrapper != null)
                {
                    usI = wrapper.Value;
                }

                FUpstreamStream = usI as MemoryIOStream <T>;
                if (FUpstreamStream == null)
                {
                    // TUpstream is a subtype of T
                    // Copy the upstream stream through the covariant IEnumerable interface
                    var enumerable = usI as IEnumerable <T>;
                    if (enumerable != null)
                    {
                        FUpstreamStream = enumerable.ToStream();
                    }
                    if (FUpstreamStream == null)
                    {
                        // TUpstream to T needs explicit cast
                        // For example TUpstream is a value type and T is a reference type
                        var objects = usI as IEnumerable;
                        if (objects != null)
                        {
                            FUpstreamStream = objects.Cast <T>().ToStream();
                        }
                        else
                        {
                            // Not connected
                            FUpstreamStream        = FNullStream;
                            FUpstreamStream.Length = FLength;
                            using (var writer = FUpstreamStream.GetWriter())
                                while (!writer.Eos)
                                {
                                    writer.Write(FDefaultValue);
                                }
                        }
                    }
                }
            }
            return(IsChanged);
        }
Exemple #2
0
 public bool Sync()
 {
     IsChanged = FAutoValidate ? FNodeIn.PinIsChanged : FNodeIn.Validate();
     if (IsChanged)
     {
         object usI;
         FNodeIn.GetUpstreamInterface(out usI);
         // Check fastest way first: TUpstream == T
         FUpstreamStream = usI as MemoryIOStream <T>;
         if (FUpstreamStream != null)
         {
             FNodeIn.GetUpStreamSlices(out FLength, out FUpStreamSlices);
         }
         else
         {
             FLength = FNodeIn.SliceCount;
             // TUpstream is a subtype of T
             var enumerable = usI as IEnumerable <T>;
             if (enumerable != null)
             {
                 FUpstreamStream        = new MemoryIOStream <T>(FLength);
                 FUpstreamStream.Length = FLength;
                 using (var writer = FUpstreamStream.GetWriter())
                     foreach (var item in enumerable)
                     {
                         writer.Write(item);
                     }
             }
             else
             {
                 // Not connected
                 FUpstreamStream        = FNullStream;
                 FUpstreamStream.Length = FLength;
             }
         }
     }
     return(IsChanged);
 }