The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.Qil \ QilList

  1. //------------------------------------------------------------------------------
  2. // <copyright file="QilList.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Diagnostics;
  18. namespace System.Xml.Xsl.Qil
  19. {
  20.    
  21.     /// <summary>
  22.     /// View over a Qil operator having N children.
  23.     /// </summary>
  24.     /// <remarks>
  25.     /// Don't construct QIL nodes directly; instead, use the <see cref="QilFactory">QilFactory</see>.
  26.     /// </remarks>
  27.     internal class QilList : QilNode
  28.     {
  29.         private int count;
  30.         private QilNode[] members;
  31.        
  32.        
  33.         //-----------------------------------------------
  34.         // Constructor
  35.         //-----------------------------------------------
  36.        
  37.         /// <summary>
  38.         /// Construct a new (empty) QilList
  39.         /// </summary>
  40.         public QilList(QilNodeType nodeType) : base(nodeType)
  41.         {
  42.             this.members = new QilNode[4];
  43.             this.xmlType = null;
  44.         }
  45.        
  46.        
  47.         //-----------------------------------------------
  48.         // QilNode methods
  49.         //-----------------------------------------------
  50.        
  51.         /// <summary>
  52.         /// Lazily create the XmlQueryType.
  53.         /// </summary>
  54.         public override XmlQueryType XmlType {
  55.             get {
  56.                 if (this.xmlType == null) {
  57.                     XmlQueryType xt = XmlQueryTypeFactory.Empty;
  58.                    
  59.                     if (this.count > 0) {
  60.                         if (this.nodeType == QilNodeType.Sequence) {
  61.                             for (int i = 0; i < this.count; i++)
  62.                                 xt = XmlQueryTypeFactory.Sequence(xt, this.members[i].XmlType);
  63.                            
  64.                             // Sequences do not preserve DocOrderDistinct
  65.                             if (xt.IsDod)
  66.                                 xt = XmlQueryTypeFactory.PrimeProduct(XmlQueryTypeFactory.NodeNotRtfS, xt.Cardinality);
  67.                         }
  68.                         else if (this.nodeType == QilNodeType.BranchList) {
  69.                             xt = this.members[0].XmlType;
  70.                             for (int i = 1; i < this.count; i++)
  71.                                 xt = XmlQueryTypeFactory.Choice(xt, this.members[i].XmlType);
  72.                         }
  73.                     }
  74.                    
  75.                     this.xmlType = xt;
  76.                 }
  77.                
  78.                 return this.xmlType;
  79.             }
  80.         }
  81.        
  82.         /// <summary>
  83.         /// Override in order to clone the "members" array.
  84.         /// </summary>
  85.         public override QilNode ShallowClone(QilFactory f)
  86.         {
  87.             QilList n = (QilList)MemberwiseClone();
  88.             n.members = (QilNode[])this.members.Clone();
  89.             f.TraceNode(n);
  90.             return n;
  91.         }
  92.        
  93.        
  94.         //-----------------------------------------------
  95.         // IList<QilNode> methods -- override
  96.         //-----------------------------------------------
  97.        
  98.         public override int Count {
  99.             get { return this.count; }
  100.         }
  101.        
  102.         public override QilNode this[int index]
  103.         {
  104.             get {
  105.                 if (index >= 0 && index < this.count)
  106.                     return this.members[index];
  107.                
  108.                 throw new IndexOutOfRangeException();
  109.             }
  110.             set {
  111.                 if (index >= 0 && index < this.count)
  112.                     this.members[index] = value;
  113.                 else
  114.                     throw new IndexOutOfRangeException();
  115.                
  116.                 // Invalidate XmlType
  117.                 this.xmlType = null;
  118.             }
  119.         }
  120.        
  121.         public override void Insert(int index, QilNode node)
  122.         {
  123.             if (index < 0 || index > this.count)
  124.                 throw new IndexOutOfRangeException();
  125.            
  126.             if (this.count == this.members.Length) {
  127.                 QilNode[] membersNew = new QilNode[this.count * 2];
  128.                 Array.Copy(this.members, membersNew, this.count);
  129.                 this.members = membersNew;
  130.             }
  131.            
  132.             if (index < this.count)
  133.                 Array.Copy(this.members, index, this.members, index + 1, this.count - index);
  134.            
  135.             this.count++;
  136.             this.members[index] = node;
  137.            
  138.             // Invalidate XmlType
  139.             this.xmlType = null;
  140.         }
  141.        
  142.         public override void RemoveAt(int index)
  143.         {
  144.             if (index < 0 || index >= this.count)
  145.                 throw new IndexOutOfRangeException();
  146.            
  147.             this.count--;
  148.             if (index < this.count)
  149.                 Array.Copy(this.members, index + 1, this.members, index, this.count - index);
  150.            
  151.             this.members[this.count] = null;
  152.            
  153.             // Invalidate XmlType
  154.             this.xmlType = null;
  155.         }
  156.     }
  157. }

Developer Fusion