Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Baulig <martin@novell.com>2006-02-16 17:01:14 +0300
committerMartin Baulig <martin@novell.com>2006-02-16 17:01:14 +0300
commit20e991683a82bd8752bf0a22fd9b4a891afd6492 (patch)
tree0fafa2f956dfad49c304192e92203032f0d4a38e /mcs/class/Mono.C5
parent5236d7998dc0a814bf81402c22707da2dadc4781 (diff)
Bringing C5 1.0 into the main branch.
svn path=/trunk/mcs/; revision=56932
Diffstat (limited to 'mcs/class/Mono.C5')
-rw-r--r--mcs/class/Mono.C5/doc/AssemblyInfo.cs79
-rw-r--r--mcs/class/Mono.C5/doc/Test.cs137
-rw-r--r--mcs/class/Mono.C5/doc/Timer.cs84
-rw-r--r--mcs/class/Mono.C5/doc/docNet.csproj83
-rw-r--r--mcs/class/Mono.C5/doc/docbuild/banner.htm13
-rw-r--r--mcs/class/Mono.C5/doc/docbuild/docnet.css131
-rw-r--r--mcs/class/Mono.C5/doc/docbuild/frames.htm12
-rw-r--r--mcs/class/Mono.C5/doc/docbuild/litterature.htm61
-rw-r--r--mcs/class/Mono.C5/doc/docbuild/userguide.htm2519
-rw-r--r--mcs/class/Mono.C5/doc/docnet.cs772
-rw-r--r--mcs/class/Mono.C5/doc/dodoc.cmd2
-rw-r--r--mcs/class/Mono.C5/doc/mkcurrent.cmd10
-rw-r--r--mcs/class/Mono.C5/doc/overview.xslt65
-rw-r--r--mcs/class/Mono.C5/doc/tolatex.xslt43
-rw-r--r--mcs/class/Mono.C5/doc/trans.xslt591
15 files changed, 4602 insertions, 0 deletions
diff --git a/mcs/class/Mono.C5/doc/AssemblyInfo.cs b/mcs/class/Mono.C5/doc/AssemblyInfo.cs
new file mode 100644
index 00000000000..5a12cf79079
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/AssemblyInfo.cs
@@ -0,0 +1,79 @@
+/*
+ Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/mcs/class/Mono.C5/doc/Test.cs b/mcs/class/Mono.C5/doc/Test.cs
new file mode 100644
index 00000000000..c30c6b6fab2
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/Test.cs
@@ -0,0 +1,137 @@
+/*
+ Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+
+using System;
+using MSG = System.Collections.Generic;
+
+namespace Try
+{
+/*
+ /// <summary>
+ /// Affenpinscher
+ /// </summary>
+ public class SSS<T,U>
+ {
+ /// <summary>
+ /// GGGGGGG <cell>tidlig <seealso cref="T:Try.Foo!3"/> <b alk="foo">bonny</b> namse</cell> efter
+ /// </summary>
+ /// <param name="u">zeU</param>
+ /// <param name="cell">zeI</param>
+ /// <param name="t">zeT</param>
+ /// <returns>zeReturn</returns>
+ public static T g(out U u, ref int cell, T t) { u = default(U); return default(T); }
+
+ /// <summary>
+ /// Nested klasse
+ /// </summary>
+ public class Inner<K>
+ {
+ /// <summary>
+ /// IIIIIIIIII
+ /// </summary>
+ /// <param name="t">TTTTTTTTTT</param>
+ /// <param name="k">KKKKKKK</param>
+ /// <returns>RRRRRRRRRRR</returns>
+ public U indre(T t, K k) { return default(U); }
+ }
+ /// <summary>
+ /// Jaj ja
+ /// </summary>
+ public class NongenNested
+ {
+ /// <summary>
+ /// Det er et y
+ /// </summary>
+ public int y;
+ }
+ /// <summary>
+ /// Lolololola
+ /// </summary>
+ public U lefield;
+ /// <summary>
+ /// Cococococola
+ /// </summary>
+ public static Foo<T,U,U> gramse;
+ /// <summary>
+ /// zesum
+ /// </summary>
+ /// <value>zeval</value>
+ public SSS<T,T> leprop { get { return default(SSS<T,T>); } }
+ /// <summary>
+ /// Sju
+ /// </summary>
+ /// <param name="f">ffffffff</param>
+ /// <param name="johndoe">ffffffff</param>
+ public string s<V,X,Y,Z>(Foo<T,Y,SSS<Z,T>> f, int johndoe) { return "7"; }
+ /// <summary>
+ /// intuism
+ /// </summary>
+ /// <param name="tudse">froe</param>
+ /// <param name="frank">sin</param>
+ public SSS(T[] tudse, double frank) { }
+ }
+
+ /// <summary>
+ /// ooh
+ /// </summary>
+
+ public class HHH
+ {
+ /// <summary>
+ /// MusseKom
+ /// </summary>
+ public class Musse { }
+ }
+
+
+
+ /// <summary>
+ /// Hejsa
+ /// </summary>
+ public class Foo<K,L,M> { }
+
+*/
+ /// <summary>
+ /// Hejsa
+ /// </summary>
+ public delegate void Mapper<T,U>(T t);
+
+
+
+ /// <summary>
+ /// Los accoutables
+ /// </summary>
+ public interface IEnumerable<T>
+ {
+ // <summary>
+ // getegetegeteg
+ // </summary>
+ // <returns>leturn</returns>
+ //MSG.IEnumerator<T> GetEnumerator();
+
+
+ /// <summary>
+ /// Apply a delegate to all items of this collection.
+ /// </summary>
+ /// <param name="a">The delegate to apply</param>
+ void Map<U>(Mapper<T,U> a);
+ }
+}
diff --git a/mcs/class/Mono.C5/doc/Timer.cs b/mcs/class/Mono.C5/doc/Timer.cs
new file mode 100644
index 00000000000..67751a5b489
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/Timer.cs
@@ -0,0 +1,84 @@
+/*
+ Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+using System.Diagnostics;
+
+namespace DocNet
+{
+ class Timer
+ {
+ static System.Diagnostics.Process p;
+
+ static long sws;
+
+ static long svm;
+
+ static double stt;
+
+ static DateTime swc;
+
+ public long ws;
+
+ public long vm;
+
+ public double tt;
+
+ public DateTime wc;
+
+ public double deltat;
+
+ public double deltac;
+
+
+ public Timer()
+ {
+ if (p == null)
+ {
+ p = System.Diagnostics.Process.GetCurrentProcess();
+ stt = p.TotalProcessorTime.TotalMilliseconds;
+ sws = p.WorkingSet64;
+ svm = p.VirtualMemorySize64;
+ swc = DateTime.Now;
+ }
+ }
+
+
+ public double snap()
+ {
+ double oldt = tt;
+ DateTime oldc = wc; p.Refresh();
+ tt = p.TotalProcessorTime.TotalMilliseconds - stt;
+ deltat = tt - oldt;
+ ws = p.WorkingSet64 - sws;
+ vm = p.VirtualMemorySize64 - svm;
+ wc = DateTime.Now;
+
+ TimeSpan x = oldc.Subtract(wc);
+
+ deltac = -x.TotalMilliseconds;
+ return deltac;
+ }
+ }
+} \ No newline at end of file
diff --git a/mcs/class/Mono.C5/doc/docNet.csproj b/mcs/class/Mono.C5/doc/docNet.csproj
new file mode 100644
index 00000000000..e417f7689b0
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/docNet.csproj
@@ -0,0 +1,83 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <ProductVersion>8.0.40607</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{42811A81-6A99-4C7A-A6DA-DF104C767B72}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <StartupObject>
+ </StartupObject>
+ <RootNamespace>docNet</RootNamespace>
+ <NoStandardLibraries>false</NoStandardLibraries>
+ <AssemblyName>docNet</AssemblyName>
+ <FileUpgradeFlags>
+ </FileUpgradeFlags>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+ <DebugSymbols>true</DebugSymbols>
+ <Optimize>false</Optimize>
+ <OutputPath>.\bin\Debug\</OutputPath>
+ <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
+ <DefineConstants>DEBUG</DefineConstants>
+ <WarningLevel>4</WarningLevel>
+ <IncrementalBuild>false</IncrementalBuild>
+ <DocumentationFile>docnet.xml</DocumentationFile>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+ <DebugSymbols>false</DebugSymbols>
+ <Optimize>true</Optimize>
+ <OutputPath>.\bin\Release\</OutputPath>
+ <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
+ <DefineConstants>TRACE</DefineConstants>
+ <WarningLevel>4</WarningLevel>
+ <IncrementalBuild>false</IncrementalBuild>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Xml">
+ <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.2.30703\System.XML.dll</HintPath>
+ <Name>System.XML</Name>
+ </Reference>
+ <ProjectReference Include="..\C5\C5.csproj">
+ <Project>{D70489CD-ABDA-48FF-BD1E-BE3F7495BE71}</Project>
+ <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+ <Name>C5</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="AssemblyInfo.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="docnet.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Content Include="docbuild\banner.htm" />
+ <Content Include="docbuild\docnet.css" />
+ <Content Include="docbuild\frames.htm" />
+ <Content Include="docbuild\litterature.htm" />
+ <Content Include="docbuild\userguide.htm" />
+ <Content Include="overview.xslt" />
+ <Compile Include="Test.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Timer.cs" />
+ <Content Include="trans.xslt" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="dodoc.cmd" />
+ <None Include="mkcurrent.cmd" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+ <PropertyGroup>
+ <PreBuildEvent>
+ </PreBuildEvent>
+ <PostBuildEvent>
+ </PostBuildEvent>
+ <ApplicationIcon>
+ </ApplicationIcon>
+ </PropertyGroup>
+ <ProjectExtensions>
+ <VisualStudio>
+ </VisualStudio>
+ </ProjectExtensions>
+</Project> \ No newline at end of file
diff --git a/mcs/class/Mono.C5/doc/docbuild/banner.htm b/mcs/class/Mono.C5/doc/docbuild/banner.htm
new file mode 100644
index 00000000000..41cbc5f6120
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/docbuild/banner.htm
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html >
+<head>
+ <link rel="stylesheet" type="text/css" href="docnet.css">
+</head>
+<body>
+ <p>
+ <font size="6"><b>C5 documentation</b></font> Legend: <code class="greenbg">A</code>:
+ abstract, <code class="greenbg">F</code>: final, <code class="greenbg">N</code>:
+ non-virtual, <code class="greenbg">P</code>: protected, <code class="greenbg">S</code>:
+ static. &nbsp;<a href="userguide.htm" target="_blank">User's Guide</a></p>
+</body>
+</html>
diff --git a/mcs/class/Mono.C5/doc/docbuild/docnet.css b/mcs/class/Mono.C5/doc/docbuild/docnet.css
new file mode 100644
index 00000000000..b47b0693ba5
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/docbuild/docnet.css
@@ -0,0 +1,131 @@
+BODY
+{
+ FONT-FAMILY: "Verdana", sans-serif;
+ FONT-SIZE: x-small;
+}
+CODE
+{
+ FONT-SIZE: x-small;
+}
+A:link
+{
+ COLOR: #4e4887
+}
+A:visited
+{
+ COLOR: #8080c8
+}
+A:active
+{
+ COLOR: #f16043
+}
+A:hover
+{
+ COLOR: #f16043
+}
+P
+{
+ MARGIN-BOTTOM: 0.5em;
+ MARGIN-TOP: 0.5em
+}
+.greenbg
+{
+ BACKGROUND-COLOR: #00ff00;
+ font-weight:bold
+}
+TABLE
+{
+ BORDER-BOTTOM: medium none;
+ BORDER-LEFT: medium none;
+ BORDER-RIGHT: medium none;
+ BORDER-TOP: medium none;
+}
+TD
+{
+ BACKGROUND-COLOR: #bedfff;
+ BORDER-BOTTOM: medium none;
+ BORDER-LEFT: medium none;
+ BORDER-RIGHT: medium none;
+ BORDER-TOP: medium none;
+ FONT-SIZE:x-small;
+ MARGIN: 2px;
+ PADDING-BOTTOM: 2px;
+ PADDING-LEFT: 2px;
+ PADDING-RIGHT: 2px;
+ PADDING-TOP: 2px;
+ TEXT-ALIGN: left
+}
+TH
+{
+ BACKGROUND-COLOR: #ffdfbe;
+ BORDER-BOTTOM: medium none;
+ BORDER-LEFT: medium none;
+ BORDER-RIGHT: medium none;
+ BORDER-TOP: medium none;
+ FONT-SIZE: x-small;
+ MARGIN: 2px;
+ PADDING-BOTTOM: 2px;
+ PADDING-LEFT: 2px;
+ PADDING-RIGHT: 2px;
+ PADDING-TOP: 2px;
+ TEXT-ALIGN: left
+}
+TH
+{
+ BACKGROUND-COLOR: #ffaa57
+}
+UL
+{
+ MARGIN-TOP: 0.5em
+}
+OL
+{
+ MARGIN-TOP: 0.5em
+}
+H1
+{
+ COLOR: #336699;
+ FONT-SIZE: x-large;
+ MARGIN-BOTTOM: 0.5em;
+ MARGIN-TOP: 1em;
+ PADDING-LEFT: 4px
+}
+H2
+{
+ BORDER-LEFT: #4e4887 8px solid;
+ BORDER-TOP: #4e4887 1px solid;
+ COLOR: #4e4887;
+ FONT-SIZE: medium;
+ MARGIN-BOTTOM: 0.5em;
+ MARGIN-TOP: 1em;
+ PADDING-LEFT: 4px
+}
+H3
+{
+ BORDER-LEFT: #4e4887 4px solid;
+ BORDER-TOP: #4e4887 1px solid;
+ COLOR: #4e4887;
+ FONT-SIZE: small;
+ MARGIN-BOTTOM: 0.5em;
+ MARGIN-TOP: 1em;
+ PADDING-LEFT: 4px
+}
+H4
+{
+ COLOR: #4e4887;
+ FONT-SIZE: small;
+ MARGIN-BOTTOM: 0.5em
+}
+H5
+{
+ COLOR: #4e4887;
+ FONT-SIZE: x-small;
+ MARGIN-BOTTOM: 0.5em
+}
+H6
+{
+ COLOR: #4e4887;
+ FONT-SIZE: x-small;
+ FONT-STYLE: italic;
+ MARGIN-BOTTOM: 0.5em
+}
diff --git a/mcs/class/Mono.C5/doc/docbuild/frames.htm b/mcs/class/Mono.C5/doc/docbuild/frames.htm
new file mode 100644
index 00000000000..d903905392e
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/docbuild/frames.htm
@@ -0,0 +1,12 @@
+<html>
+<frameset rows="84,*">
+ <frame name="banner" scrolling="no" noresize src="banner.htm">
+ <frameset cols="200,*">
+ <frame name="contents" src="contents.htm">
+ <frame name="main" >
+ </frameset>
+ <noframes>
+ <p>This page requires frames, but your browser does not support them.</p>
+ </noframes>
+</frameset>
+</html>
diff --git a/mcs/class/Mono.C5/doc/docbuild/litterature.htm b/mcs/class/Mono.C5/doc/docbuild/litterature.htm
new file mode 100644
index 00000000000..9e969e669e8
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/docbuild/litterature.htm
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<title>C5 collection classes - litterature references</title>
+<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
+<meta name=ProgId content=VisualStudio.HTML>
+<meta name=Originator content="Microsoft Visual Studio.NET 7.0">
+</head>
+<body>
+<h1>C5 collection classes - litterature references</h1>
+<table border="1" cellspacing="0">
+ <tr>
+ <td>
+ <a name="CLRS">CLRS</a></td>
+ <td>Cormen, Leiserson, Rivest, Shamir: ...</td>
+ </tr>
+ <tr>
+ <td>
+ <a name="DSST">DSST</a></td>
+ <td>D, Sarnak, Sleator, Tarjan, ...</td>
+ </tr>
+ <tr>
+ <td>
+ <a name="Tarjan1">Tarjan1</a>Tarjan: (the booklet)</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <a name=""></a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <a name=""></a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <a name=""></a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <a name=""></a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <a name=""></a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+ <a name=""></a></td>
+ <td></td>
+ </tr>
+</table>
+
+
+</body>
+</html>
diff --git a/mcs/class/Mono.C5/doc/docbuild/userguide.htm b/mcs/class/Mono.C5/doc/docbuild/userguide.htm
new file mode 100644
index 00000000000..cea0e026e0e
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/docbuild/userguide.htm
@@ -0,0 +1,2519 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+ <title>C5 User's Guide</title>
+ <style>
+<!--
+.revvid { color: #FFFFFF; background-color: #00AA00; font-weight: bold }
+-->
+ </style>
+</head>
+<body>
+<h1><a class="mozTocH1" name="mozTocId905770"></a>C5 User's guide for
+prerelease version 0.5</h1>
+<h2><a class="mozTocH2" name="mozTocId507311"></a>Table of contents</h2>
+<ul class="readonly" id="mozToc">
+<!--mozToc h1 1 h2 2 h3 3 h4 4 h5 5 h6 6--><li><a href="#mozTocId905770">C5
+User's guide for prerelease version 0.5</a>
+ <ul>
+ <li><a href="#mozTocId507311">Table of contents</a></li>
+ </ul>
+ </li>
+ <li><a href="#mozTocId564527">Overview</a></li>
+ <li><a href="#mozTocId86956">Interfaces</a>
+ <ul>
+ <li><a href="#mozTocId21725">"Proper" collection interfaces</a></li>
+ <li><a href="#mozTocId721827">Dictionary interfaces</a></li>
+ <li><a href="#mozTocId908053">Query result interfaces</a></li>
+ </ul>
+ </li>
+ <li><a href="#mozTocId110895">To construct a collection</a>
+ <ul>
+ <li><a href="#mozTocId850165">To use an external equalityComparer</a></li>
+ <li><a href="#mozTocId162938">To use an external comparer</a></li>
+ <li><a href="#mozTocId957374">To make collections of collections</a></li>
+ </ul>
+ </li>
+ <li><a href="#mozTocId486186">Special topics</a>
+ <ul>
+ <li><a href="#mozTocId48263">To choose a set or bag collection</a></li>
+ <li><a href="#mozTocId929755">To work on part of a list: list
+views</a></li>
+ <li><a href="#mozTocId650306">To work with persistent red-black
+trees</a></li>
+ <li><a href="#mozTocId553609">To implement new collection classes
+or subclass an existing one</a></li>
+ <li><a href="#mozTocId753674">To present a read only view of a
+collection</a></li>
+ </ul>
+ </li>
+ <li><a href="#mozTocId6619">Collection classes by data structure/class</a></li>
+ <li><a href="#mozTocId393559">Planned architecture or interface
+changes for first release</a></li>
+ <li><a href="#mozTocId336849">Performance details for proper
+collection classes</a></li>
+ <li><a href="#mozTocId712409">Performance details for dictionary
+classes</a></li>
+</ul>
+<h1><a class="mozTocH1" name="mozTocId564527"></a>Overview<br>
+</h1>
+<p>C5 is a comprehensive library of collection classes for the <a
+ href="http://www.ecma-international.org/publications/standards/Ecma-335.htm">Common
+Language Infrastructure</a> (CLI). This guide describes prerelease
+version 0.5 of&nbsp; C5. <br>
+</p>
+<p>C5 is a
+refactoring and extension of the <a
+ href="http://www.dina.kvl.dk/%7Esestoft/gcsharp/index.html#collection">generic
+collection classes</a> developed by Peter Sestoft while visiting
+Microsoft
+Research in Cambridge.</p>
+<p> Unless stated otherwise types mentioned below will belong to the
+"C5"
+namespace; and all code examples assume a "using C5;" clause (and no
+"using System.Collection.Generics;" clause)..&nbsp;</p>
+<p>The goals in the development of the library has been</p>
+<ul>
+ <li>
+ <p class="MsoNormal"><span style="" lang="EN-US">To create a
+library of collection classes for the CLI that can assist expert and
+non-expert programmers on the platform to develop correct and efficient
+applications.</span> </p>
+ </li>
+ <li>
+ <p class="MsoNormal"><span style="" lang="EN-US">The library should
+at least fill the gaps in the standard &#8220;System.Collections.Generics&#8221;
+namespace compared to standard collection class libraries for related
+object oriented languages like Java, and utilize the new facilities for
+generic </span><span style="" lang="EN-US">programming. Microsoft
+recently (mid 2004) seems to have changed their minds and ntend to
+bridge that gap in the beta2 version of VS 2005 due at the end of 2004.</span>
+ </p>
+ </li>
+</ul>
+<p>In order to fulfill the efficiency goal, the library utilizes
+first-class <a href="#datastructures">data structures</a>
+inside its collection classes. The library has been constructed with
+the modern
+object oriented programming principle of&nbsp; "<a href="#Interfaces">code
+to interfaces, not to implementations</a>" in mind, while the interface
+architecture has been carefully crafted to reflect the efficient data
+structures
+actually existence.</p>
+<p>A collection in the sense of this library is a plain "collection of
+items of a single type". A collection does not impose any other logical
+structure on its items than perhaps uniqueness or sequence ordering.</p>
+<p>The main division line among the collection classes of this library
+is the
+distinction between <a href="#Proper%20collection%20interfaces">"proper"
+collections</a> and <a href="#Dictionary%20interfaces">dictionaries</a>.
+A
+dictionary is a class that defines a partial function (or map) from one
+item
+type (the keys) to another one (the values). A dictionary can be viewed
+as a
+collection of (key,value) pairs having the property of defining a
+partial
+function.</p>
+<p>The item type for the collection classes are always given by generic
+parameters. For a proper collection, there will be a single parameter,
+customarily called T, as in HashSet&lt;T&gt;. For a dictionary there
+will be two - the key and value types -
+as in HashDictionary&lt;K,V&gt;.</p>
+<p>A collection class, or rather the data structure inside, can be
+either
+equality based or comparison based. An equality based collection will
+have an
+associated so-called equalityComparer of type <a href="main.htm#T:C5.IEqualityComparer%601">IEqualityComparer&lt;T&gt;</a>,
+where T is the item type of the collection. A comparison based
+collection has an
+associated comparer of type <a href="main.htm#T:C5.IComparer%601">IComparer&lt;T&gt;</a>.
+The section below on <a href="#Constructing">creation</a> of
+collection classes
+explains how the equalityComparers and comparers are chosen. NB: this design will
+be modified soon, cf. <a href="#planned">Planned changes</a>.<br>
+</p>
+<p>Collection classes in the library have either set or bag semantics.
+A set
+collection can at most contain one copy of an item, while bag
+collections may
+contain several. One can programmatically see at runtime if an editable
+collection class has set or bag semantics by checking the <a
+ href="main.htm#P:C5.IExtensible%601.AllowsDuplicates">
+AllowsDuplicates</a>
+property. At compile time, refer to the <a href="#set%20or%20bag">set
+or bag table</a>
+below for an overview. <br>
+</p>
+<h1><a class="mozTocH1" name="mozTocId86956"></a><a name="Interfaces">Interfaces</a></h1>
+<p>The C5 library is designed to make it easy to program to interfaces
+instead
+of implementations. In particular, all public properties and methods of
+the
+collection classes belong to their implemented interfaces (except for
+the odd
+special diagnostic method and the odd mistake to be weeded out before
+release). The typical programming style
+would be</p>
+<blockquote>
+ <p><code>IList&lt;int&gt; lst = new LinkedList&lt;int&gt;();<br>
+lst.Add(7);</code></p>
+</blockquote>
+<p>instead of&nbsp;</p>
+<blockquote>
+ <p><code> LinkedList&lt;int&gt; lst = new LinkedList&lt;int&gt;();<br>
+lst.Add(7);</code></p>
+</blockquote>
+<p>Note that with this programming style, the Add call will be compiled
+to an
+interface call instead of a (virtual) method call, but interface calls
+on the
+CLR (at least the Microsoft implementation) are at most very slightly
+slower
+than virtual calls, so one should not shun the interface style for
+performance
+reasons.</p>
+<p>We will discuss the collection classes available in C5 structured
+according
+to the main functional interfaces of the <a
+ href="#Proper%20collection%20interfaces">proper
+collections</a>, the <a href="#Dictionary%20interfaces">dictionaries</a>
+and the
+interfaces of <a href="#Query%20result%20interfaces">query results</a>.</p>
+<h2><a class="mozTocH2" name="mozTocId21725"></a><a
+ name="Proper collection interfaces">"Proper" collection interfaces</a></h2>
+<p>The following diagam shows the type hierarchy of the proper
+collection classes:</p>
+<p><img alt="Interface hierarchy" src="ClsdiagWork.png"
+ style="width: 757px; height: 498px;"><br>
+The&nbsp;most important interfaces - those that are directly
+implemented by
+collection classes - are listed to the left in this table with a short
+description in the middle and all implementing classes to the
+right.&nbsp;</p>
+<p>Please see also the <a href="#PerformanceProper">complete
+complexity table</a>
+for more comprehensive guidance.</p>
+<p>To identify which classes are equalityComparer or comparer based and which
+classes
+implement set or bag we use the following symbols:</p>
+<table border="1" width="471">
+ <tbody>
+ <tr>
+ <td width="116">set: <code class="revvid">S</code> </td>
+ <td width="117"> bag: <code class="revvid">B</code> </td>
+ <td width="117"> equalityComparer: <code class="revvid">H</code> </td>
+ <td width="117"> comparer: <code class="revvid">C</code> </td>
+ </tr>
+ </tbody>
+</table>
+<table border="1" width="100%">
+ <tbody>
+ <tr>
+ <th width="19%">Interface</th>
+ <th width="52%">Short description</th>
+ <th width="29%">Implementing classes</th>
+ </tr>
+ <tr>
+ <td valign="top" width="19%"><a
+ href="main.htm#T:C5.ICollection%601">ICollection&lt;T&gt;</a>&nbsp;</td>
+ <td valign="top" width="52%">This is the fundamental&nbsp;type
+of&nbsp; updateable collections. It has operations for searching for
+items, for adding, updating and removing one or a bunch of items, for
+clearing the collection and transforming the collection to an
+array.&nbsp;
+ <p>If one only needs these operations, the hash set and hash bag
+classes are fastest for if we have a equalityComparer for the items and the
+red-black tree classes are fastest if we must use a comparer.</p>
+ </td>
+ <td valign="top" width="29%"><code class="revvid">SH</code> <a
+ href="main.htm#T:C5.HashSet%601">HashSet&lt;T&gt;</a><br>
+ <code class="revvid">BH</code> <a
+ href="main.htm#T:C5.HashBag%601">HashBag&lt;T&gt;</a><br>
+ <code class="revvid">BH</code> <a
+ href="main.htm#T:C5.LinkedList%601">LinkedList&lt;T&gt;</a><br>
+ <code class="revvid">SH</code> <a
+ href="main.htm#T:C5.HashedLinkedList%601">HashedLinkedList&lt;T&gt;</a><br>
+ <code class="revvid">BH</code> <a
+ href="main.htm#T:C5.ArrayList%601">ArrayList&lt;T&gt;</a><br>
+ <code class="revvid">SH</code> <a
+ href="main.htm#T:C5.HashedArrayList%601"> HashedArrayList&lt;T&gt;<br>
+ </a> <code class="revvid">SC</code> <a
+ href="main.htm#T:C5.SortedArray%601"> SortedArray&lt;T&gt;</a><br>
+ <code class="revvid">SC</code> <a
+ href="main.htm#T:C5.TreeSet%601"> TreeSet&lt;T&gt;</a><br>
+ <code class="revvid">BC</code> <a
+ href="main.htm#T:C5.TreeBag%601"> TreeBag&lt;T&gt;</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="19%"><a
+ href="main.htm#T:C5.IPriorityQueue%601">IPriorityQueue&lt;T&gt;</a>&nbsp;</td>
+ <td valign="top" width="52%">This is a special case in the
+library, being the only type of updateable collection interface that
+does not implement IEditableCollection&lt;T&gt;. The reason for its
+presence is the specialized "heap" data structures for priority queues
+that only support these operations.
+ <p>If one only needs these the priority queue operations and is
+satisfied with bag semantics, then IntervalHeap&lt;P&gt;&nbsp; is the
+fastest choice. </p>
+ </td>
+ <td valign="top" width="29%"> <code class="revvid">BC</code> <a
+ href="main.htm#T:C5.IntervalHeap%601">IntervalHeap&lt;T&gt;</a><br>
+ <code class="revvid">SC</code> <a
+ href="main.htm#T:C5.TreeSet%601"> TreeSet&lt;T&gt;</a><br>
+ <code class="revvid">BC</code> <a
+ href="main.htm#T:C5.TreeBag%601"> TreeBag&lt;T&gt;</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="19%"><a href="main.htm#T:C5.IList%601">IList&lt;T&gt;</a>&nbsp;</td>
+ <td valign="top" width="52%">This is an updateable collection
+with sequence order imposed on the items by the user at insertion time
+or by later rearrangements.&nbsp;
+ <p>There are two main base data structures: dynamic arrays and
+doubly linked lists with very different complexity profile.&nbsp;The
+plain linked list is fast for operations at the end points only, while
+the plain array list have very fast lookups by index, but update
+operations are only fast at the right end point.&nbsp;</p>
+ <p>The Hashed- variants employ an index based on a hash table.
+This speeds up lookups by item considerably and for the linked list
+variant also insertions before or after specific items. The index
+changes the classes from bags to sets.&nbsp;</p>
+ <p>The hashed variants more than double the time of otherwise
+fast update operations, and should only be used when really
+needed.&nbsp;</p>
+ </td>
+ <td valign="top" width="29%"> <code class="revvid">BH</code> <a
+ href="main.htm#T:C5.LinkedList%601"> LinkedList&lt;T&gt;</a><br>
+ <code class="revvid">SH</code> <a
+ href="main.htm#T:C5.HashedLinkedList%601"> HashedLinkedList&lt;T&gt;</a><br>
+ <code class="revvid">BH</code> <a
+ href="main.htm#T:C5.ArrayList%601"> ArrayList&lt;T&gt;</a><br>
+ <code class="revvid">SH</code> <a
+ href="main.htm#T:C5.HashedArrayList%601"> HashedArrayList&lt;T&gt;</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="19%"><a
+ href="main.htm#T:C5.IIndexedSorted%601">IIndexedSorted&lt;T&gt;</a>&nbsp;</td>
+ <td valign="top" width="52%">This is an updateable collection
+with sequence order given by a comparer.&nbsp;
+ <p>There are two main data structures inside the implementations:
+red-black search trees and a dynamic array kept sorted at all times.</p>
+ <p>The differences are chiefly that the trees have much faster
+update operations, while the sorted array is somewhat faster at index
+lookups. In fact, the sorted array should only be used for static
+operation, where the collection is created and populated and then not
+changed again. </p>
+ </td>
+ <td valign="top" width="29%"> <code class="revvid">SC</code> <a
+ href="main.htm#T:C5.SortedArray%601"> SortedArray&lt;T&gt;</a><br>
+ <code class="revvid">SC</code> <a
+ href="main.htm#T:C5.TreeSet%601"> TreeSet&lt;T&gt;</a><br>
+ <code class="revvid">BC</code> <a
+ href="main.htm#T:C5.TreeBag%601"> TreeBag&lt;T&gt;</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="19%"><a
+ href="main.htm#T:C5.IPersistentSorted%601">IPersistentSorted&lt;T&gt;</a>&nbsp;</td>
+ <td valign="top" width="52%">This is a sorted collection that
+support very fast clones that themselves are sorted. The only
+implementation is the tree implementation with set and bag variants. </td>
+ <td valign="top" width="29%"> <code class="revvid">SC</code> <a
+ href="main.htm#T:C5.TreeSet%601"> TreeSet&lt;T&gt;</a><br>
+ <code class="revvid">BC</code> <a
+ href="main.htm#T:C5.TreeBag%601"> TreeBag&lt;T&gt;</a></td>
+ </tr>
+ </tbody>
+</table>
+<h2><a class="mozTocH2" name="mozTocId721827"></a><a
+ name="Dictionary interfaces">Dictionary interfaces</a></h2>
+<p>There are two dictionary interfaces:</p>
+<table border="1" width="100%">
+ <tbody>
+ <tr>
+ <th valign="top" width="19%">Interface</th>
+ <th width="56%">Short description</th>
+ <th width="25%">Implementing classes</th>
+ </tr>
+ <tr>
+ <td valign="top" width="19%"><a
+ href="main.htm#T:C5.IDictionary%602">IDictionary&lt;K,V&gt;</a> </td>
+ <td width="56%">This is the base dictionary interface.&nbsp;
+ <p>The choice is that one should use the hash dictionary unless
+one only has a comparer for the items, in which case the tree
+dictionary can be used.&nbsp; </p>
+ </td>
+ <td width="25%"><a href="main.htm#T:C5.HashDictionary%602">HashDictionary&lt;K,V&gt;</a><br>
+ <a href="main.htm#T:C5.TreeDictionary%602">TreeDictionary&lt;K,V&gt;</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="19%"><a
+ href="main.htm#T:C5.ISortedDictionary%602">ISortedDictionary&lt;K,V&gt;</a>
+ </td>
+ <td width="56%">This is a dictionary based on a comparer for the
+keys. There is only the tree implementation.&nbsp; </td>
+ <td width="25%"><a href="main.htm#T:C5.TreeDictionary%602">TreeDictionary&lt;K,V&gt;</a></td>
+ </tr>
+ </tbody>
+</table>
+<h2><a class="mozTocH2" name="mozTocId908053"></a><a
+ name="Query result interfaces">Query result interfaces</a></h2>
+<p>Some of the most basic collection interfaces have an important usage
+as the
+types of results of queries to collections, although these interfaces
+also
+appear at the base of the other collection interfaces and even as the
+types of
+synthetic collections. The interfaces in question are the standard
+System.Collections.Generics.IEnumerable&lt;T&gt;,
+<a href="main.htm#T:C5.ICollectionValue%601">ICollectionValue&lt;T&gt;</a>,
+<a href="main.htm#T:C5.IDirectedEnumerable%601">IDirectedEnumerable&lt;T&gt;</a>
+and <a href="main.htm#T:C5.IDirectedCollectionValue%601">IDirectedCollectionValue&lt;T&gt;</a>.</p>
+<p>The differences between the "Enumerable" and "Collection"
+variants are that the "Enumerable" variant only knows how to
+enumerate through its items, the "Collection" variants also knows how
+many items it has (without having to walk through an enumeration). The
+"Directed" variants are used for results of queries to sequenced
+collections (implementing <a href="main.htm#T:C5.ISequenced%601">ISequenced&lt;T&gt;</a>)
+and therefore have a non-implementation dependent enumeration order.
+The
+"Directed" variants supports two operations, <a
+ href="main.htm#M:C5.IDirectedCollectionValue%601.Backwards">Backwards()</a>
+to enable enumeration in the opposite direction and <a
+ href="main.htm#P:C5.IDirectedEnumerable%601.Direction">Direction</a>
+to tell if the enumeration order is forwards or backwards with respect
+to the
+original collection.</p>
+<p>Note: operations on an enumerator created by the GetEnumerator()
+method on System.Collections.Generics.IEnumerable&lt;T&gt; cannot be
+interleaved with update
+operations on
+the underlying collection.</p>
+<p>Note: for all enumerators in the library the operations have O(1)
+amortized
+complexity.</p>
+<h1><a class="mozTocH1" name="mozTocId110895"></a>To <a
+ name="Constructing">construct</a> a collection</h1>
+<p>All collections classes in C5 have (zero parameter) default
+constructors. So
+if we want to make a linked list of items of some type, <code>TheType</code>,
+and add an item to the list we will do</p>
+<p><code>&nbsp;&nbsp;&nbsp; IList&lt;TheType&gt; lst = new
+LinkedList&lt;TheType&gt;();<br>
+&nbsp;&nbsp;&nbsp; TheType t = ...;<br>
+&nbsp;&nbsp;&nbsp; lst.Add(t);</code></p>
+<p>The collection classes have no constructors that will take an array
+or a
+collection as parameter for prepopulating the collection, use the <a
+ href="file:///C:/home/kokholm/c5/vs/C5/main.htm#M:C5.ISink%601.AddAll%28C5.IEnumerable%7B%210%7D%29">
+AddAll</a> method
+instead. NB: in the released version, expect constructors with an
+enumerable as argument and constructors with a variable number of
+arguments ("params") for the initialization of the collection, see the <a
+ href="#planned">planned changes</a> section.<br>
+</p>
+<p>Some collection classes are governed by internal parameters that one
+can give
+non-default values at creation time (<code>fill</code> in <a
+ href="main.htm#T:C5.HashSet%601">HashSet&lt;T&gt;</a>,&nbsp;
+<a href="main.htm#T:C5.HashBag%601">HashBag&lt;T&gt;</a>, <a
+ href="main.htm#T:C5.HashDictionary%602">HashDictionary&lt;K,V&gt;</a>)
+or use internal tables that one can expand in advance if one has
+expectations of
+how large the collection will grow (HashSet&lt;T&gt;,&nbsp;
+HashBag&lt;T&gt;, HashDictionary&lt;K,V&gt;, <a
+ href="main.htm#T:C5.ArrayList%601">ArrayList&lt;T&gt;</a>,
+<a href="main.htm#T:C5.HashedArrayList%601"> HashedArrayList&lt;T&gt;</a>,
+<a href="main.htm#T:C5.SortedArray%601">SortedArray&lt;T&gt;</a>,
+<a href="main.htm#T:C5.IntervalHeap%601">IntervalHeap&lt;T&gt;</a>).</p>
+<p>For equality-based collection classes, these constructors will use a
+default
+equalityComparer to define equality of items according to the following table:</p>
+<table border="1">
+ <tbody>
+ <tr>
+ <th>T</th>
+ <th>default equalityComparer (implements IEqualityComparer&lt;T&gt;)</th>
+ <th>Equality and hash code by</th>
+ </tr>
+ <tr>
+ <td>int</td>
+ <td><a href="main.htm#T:C5.IntEqualityComparer">IntEqualityComparer</a></td>
+ <td>Equals and hash code of integer</td>
+ </tr>
+ <tr>
+ <td>other value type</td>
+ <td><a href="main.htm#T:C5.DefaultValueTypeEqualityComparer%601">DefaultValueTypeEqualityComparer&lt;T&gt;</a></td>
+ <td>methods inherited from object</td>
+ </tr>
+ <tr>
+ <td>IEditableCollection&lt;S&gt;</td>
+ <td><a href="main.htm#T:C5.EqualityComparerBuilder.UnsequencedEqualityComparer%602">EqualityComparerBuilder.UnsequencedEqualityComparer&lt;S,IEditableCollection&lt;S&gt;&gt;</a></td>
+ <td>contents without regards to sequence</td>
+ </tr>
+ <tr>
+ <td>ISequenced&lt;S&gt;</td>
+ <td><a href="main.htm#T:C5.EqualityComparerBuilder.SequencedEqualityComparer%602">EqualityComparerBuilder.SequencedEqualityComparer&lt;S,IEditableCollection&lt;S&gt;&gt;</a></td>
+ <td>contents with regards to sequence</td>
+ </tr>
+ <tr>
+ <td>other reference type</td>
+ <td><a href="main.htm#T:C5.DefaultReferenceTypeEqualityComparer%601">DefaultReferenceTypeEqualityComparer&lt;T&gt;</a></td>
+ <td>methods inherited from object</td>
+ </tr>
+ </tbody>
+</table>
+<p>For comparison-based collection classes, these constructors will use
+a
+default comparer:</p>
+<table border="1">
+ <tbody>
+ <tr>
+ <th>T</th>
+ <th>default comparer&nbsp;<br>
+(implements IComparer&lt;T&gt;)</th>
+ <th>Comparison by</th>
+ </tr>
+ <tr>
+ <td>int</td>
+ <td>IC</td>
+ <td>Standard integer comparison</td>
+ </tr>
+ <tr>
+ <td>implementing IComparable&lt;T&gt;</td>
+ <td><a href="main.htm#T:C5.NaturalComparer%601">NaturalComparer&lt;T&gt;</a></td>
+ <td>The CompareTo(T o)&nbsp; instance method</td>
+ </tr>
+ <tr>
+ <td>other implementing System.IComparable</td>
+ <td><a href="main.htm#T:C5.NaturalComparerO%601">NaturalComparerO&lt;T&gt;</a></td>
+ <td>The CompareTo(object o) instance method</td>
+ </tr>
+ <tr>
+ <td>other</td>
+ <td>-</td>
+ <td><i>collection class constructor throws an exception</i></td>
+ </tr>
+ </tbody>
+</table>
+<p>Sometimes, the default equalityComparer or comparer is not the right one for
+the
+problem at hand. In that case one must get hold on a equalityComparer or comparer
+of the
+right kind and supply it to one of the constructors of the collection
+classes
+that supports such a parameter. The procedure is demonstrated in the
+sections
+below on <a href="#external%20equalityComparer">external equalityComparers</a>, <a
+ href="#external%20comparer">external
+comparers</a> and <a href="#collections%20of%20collections">collections
+as items</a>.<br>
+</p>
+<p>NB: in the released version, expect the equalityComparers and comparers to be
+of the System.Collections.Generics.IComparer&lt;T&gt; type, see the <a
+ href="userguide.htm#planned">planned changes</a> section.</p>
+<h2><a class="mozTocH2" name="mozTocId850165"></a>To use an <a
+ name="external equalityComparer"> external equalityComparer</a></h2>
+<p>In addition to the helper classes referenced above, the library has
+the
+helper class <a href="main.htm#T:C5.KeyValuePairEqualityComparer%602">KeyValuePairEqualityComparer&lt;K,V&gt;</a>
+to construct a equalityComparer for pairs of the type <a
+ href="main.htm#T:C5.KeyValuePair%602">KeyValuePair&lt;K,V&gt;</a>,
+the type of entry of a K to V dictionary. The constructed equalityComparer will
+only take
+the first component of the pair into account. We can use these classes
+in the
+following way to make a linked list (with hash index) of pairs of
+strings
+identified by their first components using some custom equalityComparer on
+strings:</p>
+<blockquote>
+ <p><code>IEqualityComparer&lt;string&gt; csh = ...;<br>
+IEqualityComparer&lt;KeyValuePair&lt;string,string&gt;&gt; cph =&nbsp;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+new KeyValuePairEqualityComparer&lt;string,string&gt;(csh);<br>
+IList&lt;KeyValuePair&lt;string,string&gt;&gt; lst =<br>
+ </code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>
+new HashedLinkedList&lt;KeyValuePair&lt;string,string&gt;&gt;(cph);<br>
+lst.Add(new KeyValuePair&lt;string,string&gt;("abe","kat"));</code></p>
+</blockquote>
+<p>One may, of course, program a equalityComparer oneself. This one should always
+do if
+the item type is defined as a struct (value type) that does not
+override the
+Equals and GetHashCode methods of object, since in that case the
+default equalityComparer
+will use the slow default versions of those methods supplied by the
+runtime via
+reflection.&nbsp;</p>
+<h2><a class="mozTocH2" name="mozTocId162938"></a>To use an <a
+ name="external comparer"> external comparer</a></h2>
+<p>There is a helper class for comparer of pairs: <a
+ href="main.htm#T:C5.KeyValuePairEqualityComparer%602">KeyValuePairComparer&lt;K,V&gt;</a>.
+We will show an example of a custom comparer. Imagine wanting to
+compare double
+precision floating point numbers with a tolerance. The following code
+snippet
+shows how one could make a tree set out of such numbers:</p>
+<blockquote>
+ <p><code>class DC : IComparer&lt;double&gt; {<br>
+&nbsp;&nbsp; const double eps = 1E-10;<br>
+&nbsp;&nbsp; int Compare(double a, double b)&nbsp;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {return a &gt; b + eps ? 1 : a &lt; b -
+eps ? -1 : 0;}<br>
+}<br>
+ <br>
+void dowork() {<br>
+&nbsp;&nbsp; IComparer&lt;double&gt; dc = new DC();<br>
+&nbsp;&nbsp; ISorted&lt;double&gt; tree = new TreeSet&lt;double&gt;(dc);<br>
+&nbsp;&nbsp; tree.Add(3.45);<br>
+&nbsp;&nbsp; ...<br>
+}</code></p>
+</blockquote>
+<p>In this particular case, one would have to make sure, that two
+different
+floating point numbers are only identified by the comparer if they
+really should
+represent the same value and not by coincidence.</p>
+<h2><a class="mozTocH2" name="mozTocId957374"></a>To make <a
+ name="collections of collections"> collections of collections</a></h2>
+<p>When one wants to use a collection whose items itself are of
+collection type,
+one usually wants the interior collections to be identified by contents
+- either
+according to or irrespective of sequence order. An example could be
+transformations of <a
+ href="http://www.dina.kvl.dk/%7Esestoft/gcsharp/index.html#regexp">Finite
+Automatons</a>. The default equalityComparers and the EqualityComparerBuilder classes
+mentioned
+above may help to construct such collections of collections as in the
+examples
+that follow:</p>
+<p>To make an array list of sequenced collections identified by
+contents in
+sequenced fashion one would simply do:</p>
+<blockquote>
+ <p><code>ArrayList&lt;ISequenced&lt;int&gt;&gt; lst = new
+ArrayList&lt;ISequenced&lt;int&gt;&gt;();</code></p>
+</blockquote>
+<p>To make a linked list of linked lists identified by contents
+unsequenced, explicitly
+construct the collection equalityComparer:</p>
+<blockquote>
+ <p><code>IEqualityComparer&lt;LinkedList&lt;int&gt;&gt; lsth =<br>
+ </code>&nbsp;&nbsp;&nbsp;&nbsp; <code>new
+EqualityComparerBuilder.UnsequencedEqualityComparer&lt;int,LinkedList&lt;int&gt;&gt;();<br>
+LinkedList&lt;LinkedList&lt;int&gt;&gt; lst =<br>
+&nbsp;&nbsp; new LinkedList&lt;LinkedList&lt;int&gt;&gt;(lsth);</code></p>
+</blockquote>
+<p>If for some strange reason one would like to make a hash set of
+linked lists
+with the lists identified by reference equality one would simply do:</p>
+<blockquote>
+ <p><code>HashSet&lt;LinkedList&lt;int&gt;&gt; lst = new
+HashSet&lt;LinkedList&lt;int&gt;&gt;();</code></p>
+</blockquote>
+<p>If for even stranger reasons one would make a hash set of
+ISequenced&lt;int&gt; collections with the collections identified by
+reference
+equality one would do like this:</p>
+<blockquote>
+ <p><code>IEqualityComparer&lt;</code><code>ISequenced</code><code>&lt;int&gt;&gt;
+lsth =<br>
+ </code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <code>new
+DefaultReferenceTypeEqualityComparer&lt;</code><code>ISequenced</code><code>&lt;int&gt;&gt;();<br>
+HashSet&lt;</code><code>ISequenced</code><code>&lt;int&gt;&gt; lst =<br>
+&nbsp;&nbsp; new HashSet&lt;</code><code>ISequenced</code><code>&lt;int&gt;&gt;(lsth);</code></p>
+</blockquote>
+<h1><a class="mozTocH1" name="mozTocId486186"></a>Special topics</h1>
+<h2><a class="mozTocH2" name="mozTocId48263"></a>To choose a <a
+ name="set or bag"> set or bag</a> collection</h2>
+<p>The following table shows which of the collection classes have set
+semantics
+and which have bag semantics. All the implemented classes have fixed,
+compiled in semantics. <br>
+</p>
+<p>Note: when in a set collection, methods with an Add in the name will
+ignore
+attempts to add an item already there or flag the failed attempt by a
+Boolean return value; methods with an Insert in the name (only in
+lists) will throw an
+exception.</p>
+<table border="1" width="38%">
+ <tbody>
+ <tr>
+ <td valign="top" width="6%"><a href="main.htm#T:C5.HashSet%601">HashSet&lt;T&gt;</a></td>
+ <td valign="top" width="5%">set</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"> <a href="main.htm#T:C5.HashBag%601">HashBag&lt;T&gt;</a></td>
+ <td valign="top" width="5%">bag</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"> <a
+ href="main.htm#T:C5.LinkedList%601"> LinkedList&lt;T&gt;</a></td>
+ <td valign="top" width="5%">bag</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"> <a
+ href="main.htm#T:C5.HashedLinkedList%601"> HashedLinkedList&lt;T&gt;</a></td>
+ <td valign="top" width="5%">set</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"> <a
+ href="main.htm#T:C5.ArrayList%601"> ArrayList&lt;T&gt;</a></td>
+ <td valign="top" width="5%">bag</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"> <a
+ href="main.htm#T:C5.HashedArrayList%601"> HashedArrayList&lt;T&gt; </a>
+ </td>
+ <td valign="top" width="5%">set</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"> <a
+ href="main.htm#T:C5.SortedArray%601"> SortedArray&lt;T&gt;</a></td>
+ <td valign="top" width="5%">set</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"> <a href="main.htm#T:C5.TreeSet%601">TreeSet&lt;T&gt;</a></td>
+ <td valign="top" width="5%">set</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"> <a href="main.htm#T:C5.TreeBag%601">TreeBag&lt;T&gt;</a></td>
+ <td valign="top" width="5%">bag</td>
+ </tr>
+ <tr>
+ <td valign="top" width="6%"><a
+ href="main.htm#T:C5.IntervalHeap%601">IntervalHeap&lt;T&gt;</a></td>
+ <td valign="top" width="5%">bag</td>
+ </tr>
+ </tbody>
+</table>
+<h2><a class="mozTocH2" name="mozTocId929755"></a>To work on part of a
+list: list views</h2>
+<p>The IList&lt;T&gt; interface supports via the <a
+ href="main.htm#M:C5.IList%601.View%28System.Int32,System.Int32%29">
+View</a>
+method the functionality that one can zoom in on part of a list and use
+it as an
+IList&lt;T&gt; in its own right while having updates to the view passed
+through
+to the base (original) IList&lt;T&gt;. Using the <a
+ href="main.htm#M:C5.IList%601.Slide%28System.Int32%29">Slide</a>
+method calls, one may move the view around the base list. Using Slide
+repeatedly
+one can implement safe ways to iterate over a list while updating it.
+The
+IList&lt;T&gt; interface also has properties <a
+ href="main.htm#P:C5.IList%601.Underlying">Underlying</a>
+and <a href="main.htm#P:C5.IList%601.Offset">Offset</a> showing the
+base list of a
+view and the current site of a view.</p>
+<p>One can create a view on a view, but the new view will have the
+original base
+list as base. A view will be invalidated if an update operation is
+performed on
+the base list by any other means than through this particular view.</p>
+<p>The following code snippet shows a silly example of iterating over a
+list,
+doing an insertion each time certain combination of items are seen (the
+example
+iterates right to left and inserts 666 whenever two consecutive items
+have an
+odd difference):</p>
+<blockquote>
+ <p><code>IList&lt;int&gt; lst = ...;<br>
+IList&lt;int&gt; view = lst.CreateView(lst.Count-2, 2);<br>
+while (true) {<br>
+&nbsp;&nbsp;&nbsp; if ((view.Last - view.First) % 2 == 1)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view.Insert(1, 666);<br>
+&nbsp;&nbsp;&nbsp; if (view.Offset == 0)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
+&nbsp;&nbsp;&nbsp; else<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; view.Slide(-1,2);<br>
+}</code></p>
+</blockquote>
+<h2><a class="mozTocH2" name="mozTocId650306"></a>To work with
+persistent red-black trees</h2>
+<p>The search tree implementation in the library is based on node copy
+persistent red-black trees. The persistence is exposed in the <a
+ href="main.htm#M:C5.IPersistentSorted%601.Snapshot">Snapshot</a>
+method that can be considered a very fast and space-saving way of
+making a
+read-only clone of the tree. When using persistence, the space use of a
+red-black tree in this implementation is linear in the number of
+operations
+since the creation of the tree.</p>
+<p>One use of persistence could be to safely enumerate a tree
+interleaved with
+updates:</p>
+<blockquote>
+ <p><code>IPersistentSorted&lt;int&gt; tree = new TreeSet&lt;int&gt;();<br>
+tree.Add(5);<br>
+...<br>
+ISorted&lt;int&gt; snap = tree.Snapshot();<br>
+foreach (int i in snap)<br>
+&nbsp;&nbsp;&nbsp; tree.Add(i+7);</code></p>
+</blockquote>
+<p>The GUITester project of the complete library source code contains
+an
+interesting (standard) usage of persistent search trees to the
+geometric problem
+of constructing an efficient data structure for point location in a
+division of
+the plane given by a list of line segments.</p>
+<h2><a class="mozTocH2" name="mozTocId553609"></a>To implement new
+collection classes or subclass an existing one</h2>
+<p>All interface methods and properties of the collection classes
+implemented in
+the library are virtual and so it should be safe to subclass these
+classes. Some
+classes may have protected members if they are subclassed in the
+library itself.
+We refer to the detailed reference manuals and the library source for
+information on the protected members and their role in subclassing.</p>
+<p>There is a sequence of helper classes designed to be used as base
+classes of
+collection classes: <a href="main.htm#T:C5.EnumerableBase%601">EnumerableBase&lt;T&gt;</a>,
+<a href="main.htm#T:C5.CollectionValueBase%601">CollectionValueBase&lt;T&gt;</a>,
+<a href="main.htm#T:C5.CollectionBase%601">CollectionBase&lt;T&gt;</a>,
+<a href="main.htm#T:C5.SequencedBase%601">SequencedBase&lt;T&gt;</a>
+and <a href="main.htm#T:C5.ArrayBase%601">ArrayBase&lt;T&gt;</a>.
+Please see the reference manual and the library source code for
+documentation
+and examples.</p>
+<p>As for dictionaries, the DictionaryBase&lt;K,V&gt; class will
+construct a
+class implementing IDictionary&lt;K,V&gt; by simply plugging in a set
+implementation.</p>
+<h2><a class="mozTocH2" name="mozTocId753674"></a>To present a read
+only view of a collection</h2>
+<p>The library contains a long list of wrapper classes all with name
+starting
+with Guarded having the purpose of creating a read-only view of an
+existing
+collection. The wrapping is done by the constructors of the classes. If
+we want
+to give some code access to only lookup operations on a, say, list we
+can do as
+follows:</p>
+<blockquote>
+ <p><code>IList&lt;int&gt; lst;<br>
+...<br>
+IList&lt;int&gt; rolst = new GList&lt;int&gt;(lst);<br>
+OtherObject.dowork(rolst);</code></p>
+</blockquote>
+<p>Please see the reference manual for details on available wrapper
+classes.</p>
+<h1><a class="mozTocH1" name="mozTocId6619"></a><a name="datastructures">Collection
+classes by data structure/class</a></h1>
+<p>The following table&nbsp;shows the underlying data structure of the
+various collection classes.</p>
+<table border="1">
+ <tbody>
+ <tr>
+ <th>Data structure</th>
+ <th>Classes</th>
+ <th>Primary Interfaces</th>
+ </tr>
+ <tr>
+ <td>hash table</td>
+ <td>HashSet&lt;T&gt;</td>
+ <td> ICollection&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>hash table</td>
+ <td>HashBag&lt;T&gt;</td>
+ <td> ICollection&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>hash table</td>
+ <td>HashDictionary&lt;K,V&gt;</td>
+ <td>IDictionary&lt;K,V&gt;</td>
+ </tr>
+ <tr>
+ <td>linked list</td>
+ <td>LinkedList&lt;T&gt;</td>
+ <td>IList&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>linked list with hash index</td>
+ <td>HashedLinkedList&lt;T&gt;</td>
+ <td>IList&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>dynamic array</td>
+ <td>ArrayList&lt;T&gt;</td>
+ <td>IList&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>dynamic array with hash index</td>
+ <td>HashedArrayList&lt;T&gt;</td>
+ <td>IList&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>sorted dynamic array</td>
+ <td>SortedArray&lt;T&gt;</td>
+ <td>IIndexedSorted&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>heap</td>
+ <td>IntervalHeap&lt;T&gt;</td>
+ <td>IPriorityQueue&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>red-black search tree</td>
+ <td>TreeSet&lt;T&gt;</td>
+ <td>IIndexedSorted&lt;T&gt;, IPersistentSorted&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>red-black search tree</td>
+ <td>TreeBag&lt;T&gt;</td>
+ <td>IIndexedSorted&lt;T&gt;, IPersistentSorted&lt;T&gt;</td>
+ </tr>
+ <tr>
+ <td>red-black search tree</td>
+ <td>TreeDictionary&lt;K,V&gt;</td>
+ <td>ISortedDictionary&lt;K,V&gt;</td>
+ </tr>
+ </tbody>
+</table>
+<br>
+<h1><a class="mozTocH1" name="mozTocId393559"></a>&lt;&gt;<a
+ name="planned"></a>Planned<span style="font-weight: bold;"> </span>architecture
+or interface changes
+for first release<br>
+</h1>
+<ol>
+ <li>Eliminate the use of our own generic equality/comparator types,
+C5.IComparer&lt;T&gt; and C5.IEqualityComparer&lt;T&gt; and use the new design of
+VS 2005 beta1 in the form of the combined
+System.Collections.Generic.IComparer&lt;T&gt;.</li>
+ <li>Vararg (params) constructors? (And IEnum do.)</li>
+ <li>Possibly extended use of "wildcard style" operations like
+AddAll&lt;U&gt;(IEnumerable&lt;U&gt; items)?</li>
+ <li>Make all collection classes clonable and serializable.</li>
+</ol>
+<h1><a class="mozTocH1" name="mozTocId336849"></a><a
+ name="PerformanceProper">Performance</a> details for proper collection
+classes</h1>
+<p>This section overviews the complexities of cc public methods and
+property
+accesses.</p>
+<p>In the table below, for lack of space we use the following numbers
+to
+identify collection classes:</p>
+<table border="1">
+ <tbody>
+ <tr>
+ <th>Class</th>
+ <th>Column</th>
+ </tr>
+ <tr>
+ <td>HashSet&lt;T&gt;</td>
+ <td>HS</td>
+ </tr>
+ <tr>
+ <td>HashBag&lt;T&gt;</td>
+ <td>HB</td>
+ </tr>
+ <tr>
+ <td>ArrayList&lt;T&gt;</td>
+ <td>AL</td>
+ </tr>
+ <tr>
+ <td>LinkedList&lt;T&gt;</td>
+ <td>LL</td>
+ </tr>
+ <tr>
+ <td>HashedArrayList&lt;T&gt;</td>
+ <td>HAL</td>
+ </tr>
+ <tr>
+ <td>HashedLinkedList&lt;T&gt;</td>
+ <td>HLL</td>
+ </tr>
+ <tr>
+ <td>TreeSet&lt;T&gt;</td>
+ <td>RBTS</td>
+ </tr>
+ <tr>
+ <td>TreeBag&lt;T&gt;</td>
+ <td>RBTB</td>
+ </tr>
+ <tr>
+ <td>SortedArray&lt;T&gt;</td>
+ <td>SA</td>
+ </tr>
+ <tr>
+ <td>IntervalHeap&lt;T&gt;</td>
+ <td>IH</td>
+ </tr>
+ </tbody>
+</table>
+<p>And the following special symbols:&nbsp;</p>
+<p>
+n size of collection,&nbsp;<br>
+m size of argument if collection-: not supported<br>
+*: means: suboptimal complexity (library is in error)<br>
+$: special at end: the operation is much faster at the start and/or end
+(end for
+array list, both for linked list)
+</p>
+<p>Note: we do not show return type&nbsp; or parameters for methods,
+just mark
+with ()<br>
+Note: we ignore time for reclaiming of internal array space (e.g. Clear)<br>
+User supplied operations like comparers or equalityComparers are assumed to be
+O(1)</p>
+<table border="1" height="2893" width="100%">
+ <tbody>
+ <tr>
+ <th height="23" width="9%">Member</th>
+ <th height="23" width="8%">HS</th>
+ <th height="23" width="8%">HB</th>
+ <th height="23" width="8%">AL</th>
+ <th height="23" width="8%">LL</th>
+ <th height="23" width="8%">HAL</th>
+ <th height="23" width="8%">HLL</th>
+ <th height="23" width="8%">RBTS</th>
+ <th height="23" width="8%">RBTB</th>
+ <th height="23" width="9%">SA</th>
+ <th height="23" width="9%">IH</th>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">&nbsp;IEnumerable&lt;T&gt;</font></i></td>
+ <td height="22" width="8%">&nbsp;&nbsp;</td>
+ <td height="22" width="8%">&nbsp;</td>
+ <td height="22" width="8%">&nbsp;</td>
+ <td height="22" width="8%">&nbsp;</td>
+ <td height="22" width="8%">&nbsp;</td>
+ <td height="22" width="8%">&nbsp;</td>
+ <td height="22" width="8%">&nbsp;</td>
+ <td height="22" width="8%">&nbsp;</td>
+ <td height="22" width="9%">&nbsp;</td>
+ <td height="22" width="9%">&nbsp;</td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">GetEnumerator()</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">IDirectedEnumerable&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HB</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">AL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">LL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HAL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HLL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTB</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">SA</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="18%"><font size="2">Direction</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="18%"><font size="2">Backwards()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">ICollectionValue&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HB</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">AL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">LL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HAL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HLL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTB</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">SA</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Count</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="18%"><font size="2">CopyTo</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">ToArray</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Apply()</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Exists()</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">All()</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">IDirectedCollectionValue&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HB</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">AL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">LL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HAL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HLL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTB</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">SA</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="18%"><font size="2">Backwards()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="13%"><i><font color="#808080" size="2">IExtensible&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HB</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">AL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">LL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HAL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HLL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTB</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">SA</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">AllowsDuplicates</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">SyncRoot</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">IsEmpty</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Add</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">AddAll</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(mlog n)</font></td>
+ <td height="22" width="8%"><font size="2">O(mlog n)</font></td>
+ <td height="22" width="9%"><font size="2">O(mlog n)</font></td>
+ <td height="22" width="9%"><font size="2">??</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">ICollection&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HB</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">AL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">LL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HAL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HLL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTB</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">SA</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">IsReadOnly</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">ContainsSpeed</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">GetHashCode</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Equals</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Contains</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">ContainsCount</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">ContainsAll</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(mn)*</font></td>
+ <td height="22" width="8%"><font size="2">O(mn)*</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="8%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="9%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Find</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">FindOrAdd</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Update</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">UpdateOrAdd</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Remove</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveWithReturn</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveAllCopies</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveAll</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(mn)*</font></td>
+ <td height="22" width="8%"><font size="2">O(mn)*</font></td>
+ <td height="22" width="8%"><font size="2">O(m+n)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="8%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="9%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Clear</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RetainAll</font></td>
+ <td height="22" width="8%"><font size="2">O(m)?</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(mn)*</font></td>
+ <td height="22" width="8%"><font size="2">O(mn)*</font></td>
+ <td height="22" width="8%"><font size="2">O(m+n)</font></td>
+ <td height="22" width="8%"><font size="2">O(m)</font></td>
+ <td height="22" width="8%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="8%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="9%"><font size="2">O(m logn)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">ISequenced&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HB</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">AL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">LL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HAL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HLL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTB</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">SA</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">GetHashCode</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Equals</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">IIndexed&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HB</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">AL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">LL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HAL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HLL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTB</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">SA</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">this[i]</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">this[start,end]</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">IndexOf()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">LastIndexOf()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveAt</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveInterval</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n log n)*</font></td>
+ <td height="22" width="8%"><font size="2">O(n log n)*</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">IList&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HB</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">AL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">LL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HAL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">HLL</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTS</font></i></td>
+ <td align="center" height="22" width="8%"><i><font color="#808080"
+ size="2">RBTB</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">SA</font></i></td>
+ <td align="center" height="22" width="9%"><i><font color="#808080"
+ size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">First</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Last</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">FIFO</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">this[i]</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Base</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Offset</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Map()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Insert()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">InsertFirst()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">InsertLast()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">InsertBefore()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">InsertAfter()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">InsertAll()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(m+n)</font></td>
+ <td height="22" width="8%"><font size="2">O(m+n)</font></td>
+ <td height="22" width="8%"><font size="2">O(m+n)</font></td>
+ <td height="22" width="8%"><font size="2">O(m+n)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">FindAll()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Remove()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)$</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveFirst()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveLast()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">View()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Slide() (amount: d)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(d)</font></td>
+ <td height="22" width="8%"><font size="2">O(d)</font></td>
+ <td height="22" width="8%"><font size="2">O(d)</font></td>
+ <td height="22" width="8%"><font size="2">O(d)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Reverse()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">IsSorted()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Sort()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n log n)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Shuffle()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">IPriorityQueue&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HB</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">AL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">LL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HAL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HLL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">RBTS</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">RBTB</font></i></td>
+ <td height="22" width="9%"><i><font color="#808080" size="2">SA</font></i></td>
+ <td height="22" width="9%"><i><font color="#808080" size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">FindMin()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">DeleteMin()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">FindMax()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td height="30" width="9%"><font size="2">DeleteMax()</font></td>
+ <td height="30" width="8%"><font size="2">-</font></td>
+ <td height="30" width="8%"><font size="2">-</font></td>
+ <td height="30" width="8%"><font size="2">-</font></td>
+ <td height="30" width="8%"><font size="2">-</font></td>
+ <td height="30" width="8%"><font size="2">-</font></td>
+ <td height="30" width="8%"><font size="2">-</font></td>
+ <td height="30" width="8%"><font size="2">O(log n)</font></td>
+ <td height="30" width="8%"><font size="2">O(log n)</font></td>
+ <td height="30" width="9%"><font size="2">O(log n)</font></td>
+ <td height="30" width="9%"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td height="30" width="9%"> <font size="2">Comparer</font></td>
+ <td height="30" width="8%"> <font size="2">-</font></td>
+ <td height="30" width="8%"> <font size="2">-</font></td>
+ <td height="30" width="8%"> <font size="2">-</font></td>
+ <td height="30" width="8%"> <font size="2">-</font></td>
+ <td height="30" width="8%"> <font size="2">-</font></td>
+ <td height="30" width="8%"> <font size="2">-</font></td>
+ <td height="30" width="8%"> <font size="2">O(1)</font></td>
+ <td height="30" width="8%"> <font size="2">O(1)</font></td>
+ <td height="30" width="9%"> <font size="2">O(1)</font></td>
+ <td height="30" width="9%"> <font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">ISorted&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HB</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">AL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">LL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HAL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HLL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">RBTS</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">RBTB</font></i></td>
+ <td height="22" width="9%"><i><font color="#808080" size="2">SA</font></i></td>
+ <td height="22" width="9%"><i><font color="#808080" size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Predecessor</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Successor</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">WeakPredecessor</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">WeakSuccessor</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Cut</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RangeFrom</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RangeFromTo</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RangeTo</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RangeAll</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">AddSorted</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">?</font></td>
+ <td height="22" width="8%"><font size="2">?</font></td>
+ <td height="22" width="9%"><font size="2">?</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveRangeFrom</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(nlog n)*</font></td>
+ <td height="22" width="8%"><font size="2">O(nlog n)*</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveRangeFromTo</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(nlog n)*</font></td>
+ <td height="22" width="8%"><font size="2">O(nlog n)*</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RemoveRangeTo</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(nlog n)*</font></td>
+ <td height="22" width="8%"><font size="2">O(nlog n)*</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">IIndexedSorted&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HB</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">AL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">LL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HAL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HLL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">RBTS</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">RBTB</font></i></td>
+ <td height="22" width="9%"><i><font color="#808080" size="2">SA</font></i></td>
+ <td height="22" width="9%"><i><font color="#808080" size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Map</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">CountFrom</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">CountFromTo</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">CountTo</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RangeFrom</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RangeFromTo</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">RangeTo</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="8%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">O(log n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">FindAll</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="8%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">O(n)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="14%"><i><font color="#808080" size="2">IPersistentSorted&lt;T&gt;</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HS</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HB</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">AL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">LL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HAL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">HLL</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">RBTS</font></i></td>
+ <td height="22" width="8%"><i><font color="#808080" size="2">RBTB</font></i></td>
+ <td height="22" width="9%"><i><font color="#808080" size="2">SA</font></i></td>
+ <td height="22" width="9%"><i><font color="#808080" size="2">IH</font></i></td>
+ </tr>
+ <tr>
+ <td height="22" width="9%"><font size="2">Snapshot()</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">-</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="8%"><font size="2">O(1)</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ <td height="22" width="9%"><font size="2">-</font></td>
+ </tr>
+ </tbody>
+</table>
+<h1><a class="mozTocH1" name="mozTocId712409"></a><a
+ name="PerformanceDict">Performance</a> details for dictionary classes</h1>
+<table border="1" width="467">
+ <tbody>
+ <tr>
+ <th width="302">Member</th>
+ <th width="79">HashDictionary&lt;K,V&gt;</th>
+ <th width="64">TreeDictionary&lt;K,V&gt;</th>
+ </tr>
+ <tr>
+ <td width="302"><i><font color="#808080" size="2">IEnumerable&lt;KeyValuePair&lt;K,V&gt;&gt;</font></i></td>
+ <td width="79"><font color="#808080">&nbsp;</font></td>
+ <td width="64">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">GetEnumerator()</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td width="64"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><i><font color="#808080" size="2">IDictionary&lt;K,V&gt;</font></i></td>
+ <td width="79"><font color="#808080">&nbsp;</font></td>
+ <td width="64">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">this[key]</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Count</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td width="64"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">IsReadOnly</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td width="64"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">SyncRoot</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td width="64"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Keys</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td width="64"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Values</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td width="64"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Add()</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Remove()</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Clear()</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td height="22" width="64"><font size="2">O(1)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Contains()</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Find()</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">Update()</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">FindOrAdd</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><font size="2">UpdateOrAdd</font></td>
+ <td width="79"><font size="2">O(1)</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td width="302"><i><font color="#808080" size="2">ISortedDictionary&lt;K,V&gt;</font></i></td>
+ <td width="79"><font color="#808080">&nbsp;</font></td>
+ <td width="64">&nbsp;</td>
+ </tr>
+ <tr>
+ <td height="22" width="302"><font size="2">Predecessor</font></td>
+ <td width="79"><font size="2">-</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="302"><font size="2">Successor</font></td>
+ <td width="79"><font size="2">-</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="302"><font size="2">WeakPredecessor</font></td>
+ <td width="79"><font size="2">-</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ <tr>
+ <td height="22" width="302"><font size="2">WeakSuccessor</font></td>
+ <td width="79"><font size="2">-</font></td>
+ <td height="22" width="64"><font size="2">O(log n)</font></td>
+ </tr>
+ </tbody>
+</table>
+</body>
+</html>
diff --git a/mcs/class/Mono.C5/doc/docnet.cs b/mcs/class/Mono.C5/doc/docnet.cs
new file mode 100644
index 00000000000..7ca6e48dbcf
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/docnet.cs
@@ -0,0 +1,772 @@
+/*
+ Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+
+// DocNet.cs
+// Author: Antonio Cisternino
+// Version: 0.1
+// Last update: 5/12/2001
+// Modified Jan 2004 by kokholm@itu.dk
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+using System.Text;
+using System.Diagnostics;
+
+namespace DocNet
+{
+ class DocNet
+ {
+ private Assembly assembly;
+
+ //private XmlDocument xml;
+
+ private string defaultNamespace;
+
+ private string assemblyName;
+
+ private static C5.HashDictionary<string, string> longtype2short;
+
+ private static C5.HashDictionary<string, XmlNode> cachedDocComments;
+
+ static DocNet()
+ {
+ longtype2short = new C5.HashDictionary<string, string>();
+ cachedDocComments = new C5.HashDictionary<string, XmlNode>();
+ longtype2short.Add("System.Boolean", "bool");
+ longtype2short.Add("System.Byte", "byte");
+ longtype2short.Add("System.Int32", "int");
+ longtype2short.Add("System.Double", "double");
+ longtype2short.Add("System.Void", "void");
+ longtype2short.Add("System.Object", "object");
+ longtype2short.Add("System.String", "string");
+ longtype2short.Add("System.Collections.Generic.IEnumerable{T}", "IEnumerable{T}");
+ longtype2short.Add("System.Collections.Generic.IEnumerable{U}", "IEnumerable{U}");
+ //longtype2short.Add("", "");
+ }
+
+
+ DocNet(string a, string x, string defaultNamespace)
+ {
+ this.defaultNamespace = defaultNamespace;
+ assembly = Assembly.LoadFrom(a, null);
+ XmlDocument xml = new XmlDocument();
+ xml.Load(x);
+ assemblyName = xml.SelectSingleNode("doc/assembly/name").InnerXml;
+
+ if (!assembly.FullName.StartsWith(assemblyName + ","))
+ throw new Exception("Wrong assembly specified!\n>> " + assembly.FullName + "\n>> " + assemblyName);
+
+ foreach (XmlNode node in xml.SelectNodes("doc/members/member"))
+ cachedDocComments.Add(node.SelectNodes("@name").Item(0).Value, node);
+ }
+
+
+ private void CopyCodeDoc(XmlElement p, string xpath, XmlDocument ret)
+ {
+ XmlNode n;
+ //xml.SelectSingleNode(xpath);
+
+ if (cachedDocComments.Find(xpath, out n))
+ {
+ foreach (XmlNode child in n.ChildNodes)
+ p.AppendChild(ret.ImportNode(child, true));
+ }
+ //else
+ // Console.Error.WriteLine("docNet: {0} not found", xpath);
+ }
+
+ string xmlClean(string s)
+ {
+// return s.Replace("&", "&amp;").Replace("{", "&lt;").Replace("}", "&gt;").Replace("<", "&lt;").Replace(">", "&gt;");
+ return s.Replace("{", "<").Replace("}", ">");
+ }
+
+ private void AddSignature(XmlElement p, string signtext, XmlDocument ret)
+ {
+ XmlElement sign = CreateElement(ret, "Signature");
+
+ try
+ {
+ sign.InnerXml = signtext.Replace("&", "&amp;").Replace("{", "&lt;").Replace("}", "&gt;").Replace("<", "&lt;").Replace(">", "&gt;");
+ }
+ catch (XmlException)
+ {
+ Console.Error.WriteLine(signtext);
+ }
+ p.AppendChild(sign);
+ }
+
+ private void addImplements(XmlElement p, Type t, XmlDocument ret)
+ {
+ foreach (Type ty in t.GetInterfaces())
+ {
+ XmlElement impl = CreateElement(ret, "Implements");
+
+ if (ty.Assembly == assembly)
+ {
+ impl.SetAttribute("refid", "T:" + canonicalTypeName(ty, null));
+ impl.SetAttribute("C5", "");
+ }
+ AddSignature(impl, prettyTypeName(ty), ret);
+ p.AppendChild(impl);
+ }
+ }
+
+ private void addBases(XmlElement p, Type t, XmlDocument ret)
+ {
+ Type ty = t.BaseType;
+
+ while (ty != null)
+ {
+ XmlElement @base = CreateElement(ret, "Bases");
+
+ if (ty.Assembly == assembly)
+ {
+ @base.SetAttribute("refid", "T:" + canonicalTypeName(ty, null));
+ @base.SetAttribute("C5", "");
+ }
+
+ AddSignature(@base, prettyTypeName(ty), ret);
+ p.PrependChild(@base);
+ ty = ty.BaseType;
+ }
+ }
+
+
+
+ private XmlElement CreateElement(XmlDocument ret, string name)
+ {
+ return ret.CreateElement(null, name, null);
+ }
+
+ private void VisitField(bool inherited, FieldInfo f, XmlElement type, XmlDocument refman)
+ {
+ if (f.Name.Equals("value__"))
+ return;
+ string refid = "F:" + canonicalTypeName(f.DeclaringType, null) + "." + f.Name;
+ //string xpath = "doc/members/member[@name = \"" + refid + "\"]";
+ XmlElement el = CreateElement(refman, "Field");
+
+ el.SetAttribute("Name", f.Name);
+ el.SetAttribute("refid", refid);
+ el.SetAttribute("Static", f.IsStatic.ToString());
+ el.SetAttribute("Declared", xmlClean(prettyTypeName(f.DeclaringType)));
+ el.SetAttribute("CDeclared", canonicalTypeName(f.DeclaringType, null));
+ el.SetAttribute("Type", xmlClean(prettyTypeName(f.FieldType)));
+ el.SetAttribute("Access", f.IsPublic ? "public" : (f.IsPrivate || f.IsAssembly ? "private" : "protected"));
+ if (f.DeclaringType.Assembly == assembly)
+ el.SetAttribute("C5", "");
+
+ if (inherited)
+ el.SetAttribute("Inherited", "");
+
+ AddSignature(el, /*prettyTypeName(f.FieldType) + " " +*/ f.Name, refman);
+ CopyCodeDoc(el, refid, refman);
+ //AddSummary(el, xpath + "/summary", ret, doc);
+ type.AppendChild(el);
+ }
+
+ private void VisitEvent(bool inherited, EventInfo e, XmlElement type, XmlDocument ret)
+ {
+ string refid = "E:" + canonicalTypeName(e.DeclaringType, null) + "." + e.Name;
+ //string xpath = "doc/members/member[@name = \"" + refid + "\"]";
+ XmlElement el = CreateElement(ret, "Event");
+
+ el.SetAttribute("Name", e.Name);
+ el.SetAttribute("refid", refid);
+ //el.SetAttribute("Static", f.IsStatic.ToString());
+ //TODO: check virtual and final values on adders/removers
+ //el.SetAttribute("Virtual", e..IsVirtual.ToString());
+ //el.SetAttribute("Final", e.IsFinal.ToString());
+ el.SetAttribute("Declared", xmlClean(prettyTypeName(e.DeclaringType)));
+ el.SetAttribute("CDeclared", canonicalTypeName(e.DeclaringType, null));
+ el.SetAttribute("Type", xmlClean(prettyTypeName(e.EventHandlerType)));
+ MethodInfo addMethod = e.GetAddMethod(true);
+ el.SetAttribute("Access", addMethod.IsPublic ? "public" : addMethod.IsFamily ? "protected" : "private");//NBNBNB! e.IsPublic ? "public" : (e.IsPrivate || e.IsAssembly ? "private" : "protected"));
+ if (e.DeclaringType.Assembly == assembly)
+ el.SetAttribute("C5", "");
+
+ if (inherited)
+ el.SetAttribute("Inherited", "");
+
+ AddSignature(el, /*prettyTypeName(e.EventHandlerType) + " " +*/ e.Name, ret);
+ CopyCodeDoc(el, refid, ret);
+ //AddSummary(el, xpath + "/summary", ret, doc);
+ type.AppendChild(el);
+ }
+
+
+ private void VisitProperty(bool inherited, PropertyInfo p, XmlElement type, XmlDocument ret)
+ {
+ string refid = "P:" + canonicalPropertyName(p);
+ string xpath = "doc/members/member[@name = \"" + refid + "\"]";
+ XmlElement el = CreateElement(ret, "Property");
+
+ el.SetAttribute("Name", p.Name);
+ el.SetAttribute("refid", refid);
+ el.SetAttribute("Access", "public");//TODO: check if reasonable
+ MethodInfo m = p.CanRead ? p.GetGetMethod() : p.GetSetMethod();
+ if (m != null)
+ {
+ el.SetAttribute("Static", m.IsStatic.ToString());
+ el.SetAttribute("Abstract", m.IsAbstract.ToString());
+ el.SetAttribute("Virtual", m.IsVirtual.ToString());
+ el.SetAttribute("Final", m.IsFinal.ToString());
+ }
+ //else
+ //Console.Error.WriteLine("%%%%% {0} | {1}", p, p.DeclaringType);
+ el.SetAttribute("Declared", xmlClean(prettyTypeName(p.DeclaringType)));
+ el.SetAttribute("CDeclared", canonicalTypeName(p.DeclaringType, null));
+ el.SetAttribute("Get", p.CanRead.ToString());
+ el.SetAttribute("Set", p.CanWrite.ToString());
+ el.SetAttribute("Type", xmlClean(prettyTypeName(p.PropertyType)));
+
+ if (p.DeclaringType.Assembly == assembly)
+ el.SetAttribute("C5", "");
+
+ if (inherited)
+ el.SetAttribute("Inherited", "");
+
+ if (p.Name.Equals("Item"))
+ AddSignature(el, prettyIndexerSignature(p), ret);
+ else
+ AddSignature(el, /*prettyTypeName(p.PropertyType) + " " +*/ p.Name, ret);
+
+ //AddSummary(el, xpath + "/summary", ret, doc);
+ CopyCodeDoc(el, refid, ret);
+ //AddValue(el, xpath + "/value", ret, doc);
+ VisitParameters(p.GetIndexParameters(), el, ret, xpath);
+ type.AppendChild(el);
+ }
+
+
+ private void VisitParameters(ParameterInfo[] pars, XmlElement n, XmlDocument ret, string xpath)
+ {
+ foreach (ParameterInfo p in pars)
+ {
+ XmlElement el = CreateElement(ret, "Parameter");
+
+ el.SetAttribute("Name", p.Name);
+ el.SetAttribute("Type", prettyTypeName(p.ParameterType));
+ //AddSummary(el, xpath + "/param[@name = \"" + p.Name + "\"]", ret, doc);
+ CopyCodeDoc(el, xpath + "/param[@name = \"" + p.Name + "\"]", ret);
+
+ n.AppendChild(el);
+ }
+ }
+
+
+ private void VisitConstructor(Type t, ConstructorInfo c, XmlElement type, XmlDocument ret)
+ {
+ Type declaringType = c.DeclaringType;
+ string refid = "M:" + canonicalTypeName(c.DeclaringType, null) + "." + "#ctor";
+
+ refid += canonicalParameters(c.GetParameters(), new string[]{});
+
+ string xpath = "doc/members/member[@name = \"" + refid + "\"]";
+ XmlElement el = CreateElement(ret, "Constructor");
+ el.SetAttribute("Foo", c.IsConstructor ? "Con" : "San");
+ el.SetAttribute("refid", refid);
+ el.SetAttribute("Declared", prettyTypeName(declaringType));
+ el.SetAttribute("CDeclared", canonicalTypeName(declaringType, null));
+ el.SetAttribute("Access", c.IsPublic ? "public" : (c.IsPrivate ? "private" : "protected"));
+ //el.SetAttribute("Access", c.IsPublic ? "public" : (c.IsPrivate || c.IsAssembly ? "private" : "protected"));
+ if (declaringType.Assembly == assembly)
+ el.SetAttribute("C5", "");
+ if (declaringType != t)
+ el.SetAttribute("Inherited", "");
+ AddSignature(el, prettyConstructorSignature(c), ret);
+ CopyCodeDoc(el, refid, ret);
+ //AddSummary(el, xpath + "/summary", ret, doc);
+ VisitParameters(c.GetParameters(), el, ret, xpath);
+ type.AppendChild(el);
+ }
+
+
+ private void VisitMethod(bool inherited, MethodInfo m, XmlElement type, XmlDocument ret)
+ {
+ if (m.Name.StartsWith("get_") || m.Name.StartsWith("set_") || m.Name.StartsWith("add_") || m.Name.StartsWith("remove_"))
+ return;
+ bool isOperator = m.Name.StartsWith("op_");
+
+ string refid = "M:" + canonicalMethodName(m);
+
+ string xpath = "doc/members/member[@name = \"" + refid + "\"]";
+ XmlElement el = CreateElement(ret, isOperator ? "Operator" : "Method");
+
+ string mangledName = m.Name;
+ if (isOperator)
+ {
+ switch (mangledName)
+ {
+ case "op_Equality": mangledName = "operator =="; break;
+ case "op_Inequality": mangledName = "operator !="; break;
+ default: throw new ApplicationException("unknown operatorname, " + mangledName);
+ }
+ }
+ el.SetAttribute("Name", mangledName);
+ el.SetAttribute("refid", refid);
+ el.SetAttribute("Static", m.IsStatic.ToString());
+ el.SetAttribute("Abstract", m.IsAbstract.ToString());
+ el.SetAttribute("Virtual", m.IsVirtual.ToString());
+ el.SetAttribute("Final", m.IsFinal.ToString());
+ el.SetAttribute("Declared", xmlClean(prettyTypeName(m.DeclaringType)));
+ el.SetAttribute("CDeclared", canonicalTypeName(m.DeclaringType, null));
+ el.SetAttribute("ReturnType", xmlClean(prettyTypeName(m.ReturnType)));
+ if (m.DeclaringType.Assembly == assembly)
+ el.SetAttribute("C5", "");
+ if (inherited)
+ el.SetAttribute("Inherited", "");
+ el.SetAttribute("Access", m.IsPublic ? "public" : (m.IsPrivate || m.IsAssembly ? "private" : "protected"));
+ el.SetAttribute("Sealed", m.IsFinal.ToString());
+ AddSignature(el, prettyMethodSignature(mangledName, m), ret);
+ CopyCodeDoc(el, refid, ret);
+ VisitParameters(m.GetParameters(), el, ret, xpath);
+
+ foreach (Type gp in m.GetGenericArguments())
+ foreach (Type gc in gp.GetGenericParameterConstraints())
+ if (gc != typeof(object))
+ {
+ XmlElement constraint = CreateElement(ret, "constraint");
+ constraint.SetAttribute("Value", prettyTypeName(gp) + " : " + xmlClean(prettyTypeName(gc)));
+ el.AppendChild(constraint);
+ }
+ type.AppendChild(el);
+ }
+
+ public XmlDocument GenerateDoc()
+ {
+ BindingFlags flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic;
+
+ XmlDocument ret = new XmlDocument();
+ XmlElement root = CreateElement(ret, "Assembly");
+
+ root.SetAttribute("Name", assemblyName);
+
+ ret.AppendChild(root);
+
+ XmlElement type = null;
+ //string xpath = null;
+
+ foreach (Type t in assembly.GetTypes())
+ {
+ if (t.Name.StartsWith("DocNet"))
+ continue;
+
+ if (t.IsInterface)
+ {
+ type = CreateElement(ret, "Interface");
+ foreach (EventInfo e in t.GetEvents(flags))
+ VisitEvent(e.DeclaringType != t, e, type, ret);
+
+ foreach (PropertyInfo p in t.GetProperties(flags))
+ VisitProperty(false, p, type, ret);
+
+ foreach (MethodInfo m in t.GetMethods(flags))
+ VisitMethod(false, m, type, ret);
+ }
+ else if (t.IsValueType)
+ {
+ type = CreateElement(ret, "Struct");
+ foreach (FieldInfo f in t.GetFields(flags))
+ VisitField(f.DeclaringType != t, f, type, ret);
+
+ foreach (EventInfo e in t.GetEvents(flags))
+ VisitEvent(e.DeclaringType != t, e, type, ret);
+
+ foreach (PropertyInfo p in t.GetProperties(flags))
+ VisitProperty(p.DeclaringType != t, p, type, ret);
+
+ foreach (ConstructorInfo c in t.GetConstructors(flags))
+ VisitConstructor(t, c, type, ret);
+
+ foreach (MethodInfo m in t.GetMethods(flags))
+ VisitMethod(m.DeclaringType != t, m, type, ret);
+ }
+ else if (t.IsSubclassOf(typeof(Delegate)))
+ {
+ type = CreateElement(ret, "Delegate");
+ VisitMethod(false, t.GetMethod("Invoke"), type, ret);
+ }
+ else
+ { // Class
+ type = CreateElement(ret, "Class");
+ foreach (FieldInfo f in t.GetFields(flags))
+ VisitField(f.DeclaringType != t, f, type, ret);
+
+ foreach (EventInfo e in t.GetEvents(flags))
+ VisitEvent(e.DeclaringType != t, e, type, ret);
+
+ foreach (PropertyInfo p in t.GetProperties(flags))
+ VisitProperty(p.DeclaringType != t, p, type, ret);
+
+ foreach (ConstructorInfo c in t.GetConstructors(flags))
+ VisitConstructor(t, c, type, ret);
+
+ foreach (MethodInfo m in t.GetMethods(flags))
+ VisitMethod(m.DeclaringType != t, m, type, ret);
+ }
+
+ type.SetAttribute("Name", xmlClean(prettyTypeName(t)));
+ type.SetAttribute("Access", t.IsPublic || t.IsNestedPublic ? "public" : t.IsNestedFamily ? "protected" : "private");
+
+ string refid = "T:" + canonicalTypeName(t, null);
+
+ type.SetAttribute("refid", refid);
+ type.SetAttribute("C5", "");
+ AddSignature(type, prettyTypeName(t), ret);
+ addImplements(type, t, ret);
+ addBases(type, t, ret);
+
+ foreach (Type gp in t.GetGenericArguments())
+ {
+ if (gp.GenericParameterAttributes != GenericParameterAttributes.None)
+ {
+ XmlElement constraint = CreateElement(ret, "constraint");
+ string constraintText = null;
+ switch (gp.GenericParameterAttributes)
+ {
+ case GenericParameterAttributes.Contravariant:
+ break;
+ case GenericParameterAttributes.Covariant:
+ break;
+ case GenericParameterAttributes.DefaultConstructorConstraint:
+ constraintText = "new()";
+ break;
+ case GenericParameterAttributes.None:
+ break;
+ case GenericParameterAttributes.ReferenceTypeConstraint:
+ constraintText = "class";
+ break;
+ case GenericParameterAttributes.SpecialConstraintMask:
+ break;
+ case GenericParameterAttributes.NotNullableValueTypeConstraint:
+ constraintText = "struct";
+ break;
+ case GenericParameterAttributes.VarianceMask:
+ break;
+ }
+ constraint.SetAttribute("Value", String.Format("{0} : {1}", gp, constraintText));
+ type.AppendChild(constraint);
+ }
+ foreach (Type gc in gp.GetGenericParameterConstraints())
+ {
+ if (gc != typeof(object))
+ {
+ XmlElement constraint = CreateElement(ret, "constraint");
+ constraint.SetAttribute("Value", String.Format("{0} : {1}", prettyTypeName(gp), xmlClean(prettyTypeName(gc))));
+ type.AppendChild(constraint);
+ }
+ }
+ }
+
+ CopyCodeDoc(type, refid, ret);
+ root.AppendChild(type);
+ }
+
+ return ret;
+ }
+
+ C5.HashDictionary<Type, string> t2ptn = new C5.HashDictionary<Type, string>();
+ private string prettyTypeName(Type t)
+ {
+ string retval;
+ //if (!t2ptn.Find(t, out retval))
+ //{
+ int consumed = 0;
+ retval = prettyTypeName(t, ref consumed);
+ // t2ptn.Add(t, retval);
+ //}
+ return retval;
+ }
+
+ private string prettyTypeName(Type t, ref int consumed)
+ {
+ StringBuilder ret = new StringBuilder();
+
+ if (t.IsGenericParameter)
+ ret.Append(t.Name);
+ else if (t.IsArray)
+ ret.Append(prettyTypeName(t.GetElementType()) + "[]");
+ else if (t.IsByRef)
+ ret.Append("ref ").Append(prettyTypeName(t.GetElementType()));
+ else if (!t.IsGenericType)
+ ret.Append(t.IsNested ? prettyTypeName(t.DeclaringType, ref consumed) + "." + t.Name : t.FullName);
+ else
+ {
+ bool first = true;
+ StringBuilder gps = new StringBuilder();
+ Type[] gp = t.GetGenericArguments();
+
+ ret.Append(t.IsNested ? prettyTypeName(t.DeclaringType, ref consumed) : t.Namespace).Append(".").Append(t.Name);
+ if (consumed < gp.Length)
+ {
+ //TODO: fix this ugly hack to remove `n
+ ret.Remove(ret.Length - 2, 2);
+ //ret = ret.Substring(0, ret.Length - 2);
+ for (int i = consumed, length = gp.Length; i < length; i++)
+ {
+ Type ty = gp[i];
+
+ if (first) first = false;
+ else
+ gps.Append(",");
+
+ gps.Append(prettyTypeName(ty));
+ }
+
+ consumed = gp.Length;
+ ret.Append("{").Append(gps.ToString()).Append("}");
+ }
+ }
+
+ string retval = ret.ToString();
+
+ if (retval.StartsWith(defaultNamespace + "."))
+ retval = retval.Substring(defaultNamespace.Length + 1);
+
+ if (longtype2short.Contains(retval))
+ retval = longtype2short[retval];
+
+ return retval;
+ }
+
+ private string prettyParameters(ParameterInfo[] pars)
+ {
+ string ret = "";
+ bool first = true;
+
+ foreach (ParameterInfo p in pars)
+ {
+ if (first) first = false;
+ else
+ ret += ", ";
+ Type pt = p.ParameterType;
+ if (p.IsOut)
+ {
+ ret += "out ";
+ pt = pt.GetElementType();
+ }
+
+ ret += prettyTypeName(pt) + " " + p.Name;
+ }
+
+ return ret;
+ }
+
+ private string prettyMethodSignature(string name, MethodInfo m)
+ {
+ string gp = "";
+ if (m.IsGenericMethod)
+ {
+ Type[] gps = m.GetGenericArguments();
+ gp = "<";
+
+ for (int i = 0; i < gps.Length; i++)
+ gp += (i == 0 ? "" : ",") + gps[i].Name;
+
+ gp += ">";
+ }
+
+ return name + gp + "(" + prettyParameters(m.GetParameters()) + ")";
+ }
+
+ private string prettyConstructorSignature(ConstructorInfo c)
+ {
+ Type t = c.DeclaringType;
+
+ return prettyTypeName(t) + "(" + prettyParameters(c.GetParameters()) + ")";
+ }
+
+ private string prettyIndexerSignature(PropertyInfo p)
+ {
+ return /*prettyTypeName(p.PropertyType) + " " + */ "this[" + prettyParameters(p.GetIndexParameters()) + "]";
+ }
+
+
+ private string simpleTypeName(Type t)
+ {
+ return (t.IsNested ? simpleTypeName(t.DeclaringType) : t.Namespace) + "." + t.Name;
+ }
+
+
+ private string canonicalTypeName(Type t, string[] mgps)
+ {
+ string ret;
+
+ if (t.IsGenericParameter)
+ ret = "`" + t.GenericParameterPosition;
+ else if (t.IsArray)
+ ret = canonicalTypeName(t.GetElementType(), mgps) + "[]";
+ else if (t.IsByRef)
+ ret = canonicalTypeName(t.GetElementType(), mgps) + "@";
+ else
+ {
+ ret = simpleTypeName(t);
+ if (!t.IsGenericType)
+ ret += "";
+ else if (mgps == null)
+ ret += "";//"`" + t.GetGenericArguments().Length;
+ else
+ {
+ //TODO: fix this ugly hack to remove `n
+ ret = ret.Substring(0, ret.Length - 2);
+
+ bool first = true;
+ string gps = "";
+ Type[] gp = t.GetGenericArguments();
+
+ foreach (Type ty in gp)
+ {
+ if (first) first = false;
+ else
+ gps += ",";
+
+ if (ty.IsGenericParameter)
+ {
+ bool ismgp = false;
+
+ foreach (string s in mgps) if (s.Equals(ty.Name)) ismgp = true;
+
+ gps += (ismgp ? "``" : "`") + ty.GenericParameterPosition;
+ }
+ else
+ gps += canonicalTypeName(ty, mgps);
+ }
+
+ ret += "{" + gps + "}";
+ }
+ }
+
+ return ret;
+ }
+
+ private string canonicalMethodName(MethodInfo m)
+ {
+ string ret = canonicalTypeName(m.DeclaringType, null) + "." + m.Name;
+
+ string[] gmps;
+
+ if (m.IsGenericMethod)
+ {
+ Type[] gps = m.GetGenericArguments();
+
+ ret += "``" + gps.Length;
+ gmps = new string[gps.Length];
+ for (int i = 0; i < gps.Length; i++)
+ gmps[i] = gps[i].Name;
+ }
+ else
+ gmps = new string[]{};
+
+ ret += canonicalParameters(m.GetParameters(), gmps);
+ return ret;
+ }
+
+ private string canonicalPropertyName(PropertyInfo p)
+ {
+ string pname = canonicalTypeName(p.DeclaringType, null) + "." + p.Name;
+ ParameterInfo[] pars = p.GetIndexParameters();
+
+ if (pars.Length > 0)
+ pname += canonicalParameters(pars, new string[]{});
+
+ return pname;
+ }
+
+ private string canonicalParameters(ParameterInfo[] pars, string[] gmps)
+ {
+ if (pars.Length == 0) return "";
+
+ string ret = "";
+ bool first = true;
+
+ foreach (ParameterInfo p in pars)
+ {
+ if (first) first = false;
+ else
+ ret += ",";
+
+ ret += canonicalTypeName(p.ParameterType, gmps); ;
+ }
+
+ return "(" + ret + ")";
+ }
+
+
+
+ static void Main(string[] args)
+ {
+ if (args.Length != 2)
+ {
+ args = new string[] { @"C5.dll", @"C5.xml" };
+
+ }
+ {
+ Timer timer = new Timer();
+ timer.snap();
+ DocNet doc = new DocNet(args[0], args[1], "C5");
+ XmlDocument merged = doc.GenerateDoc();
+ Console.Error.WriteLine("Time merge: {0} ms", timer.snap());
+
+ System.Xml.Xsl.XslCompiledTransform overview = new System.Xml.Xsl.XslCompiledTransform();
+ overview.Load(@"overview.xslt");
+ overview.Transform(merged, new XmlTextWriter(new StreamWriter(@"docbuild\contents.htm")));
+ Console.Error.WriteLine("Time, overview: {0} ms", timer.snap());
+
+ StringBuilder megaDoc = new StringBuilder();
+ using (XmlWriter writer = XmlWriter.Create(megaDoc))
+ {
+ writer.WriteStartElement("hack");
+ System.Xml.Xsl.XslCompiledTransform trans = new System.Xml.Xsl.XslCompiledTransform();
+ trans.Load(@"trans.xslt");
+ trans.Transform(merged, writer);
+ writer.WriteEndElement();
+ writer.Close();
+ }
+ Console.Error.WriteLine("Time trans: {0} ms", timer.snap());
+ System.Xml.XPath.XPathDocument megaXml =
+ new System.Xml.XPath.XPathDocument(XmlReader.Create(new StringReader(megaDoc.ToString())));
+ System.Xml.XPath.XPathNodeIterator nodes = megaXml.CreateNavigator().Select("/hack/*");
+ string docfn = null;
+ foreach (System.Xml.XPath.XPathNavigator var in nodes)
+ {
+ if (var.Name == "filestart")
+ docfn = var.GetAttribute("name", "");
+ if (var.Name == "html")
+ {
+ Console.Error.Write(".");
+ XmlWriter w = new XmlTextWriter(new StreamWriter(@"docbuild\types\" + docfn));
+ var.WriteSubtree(w);
+ w.Close();
+ }
+ }
+ Console.Error.WriteLine();
+ Console.Error.WriteLine("Time split: {0} ms", timer.snap());
+ }
+ Console.Write("? ");
+ Console.Read();
+ }
+ }
+}
+
diff --git a/mcs/class/Mono.C5/doc/dodoc.cmd b/mcs/class/Mono.C5/doc/dodoc.cmd
new file mode 100644
index 00000000000..3ed5141a139
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/dodoc.cmd
@@ -0,0 +1,2 @@
+del docbuild\types\*.htm
+bin\Debug\docNet.exe ..\C5\bin\Debug\C5.dll ..\C5\c5.xml
diff --git a/mcs/class/Mono.C5/doc/mkcurrent.cmd b/mcs/class/Mono.C5/doc/mkcurrent.cmd
new file mode 100644
index 00000000000..65cc5607136
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/mkcurrent.cmd
@@ -0,0 +1,10 @@
+cd c:\src\c5\src\C5\docNet\docbuild
+
+copy ..\..\C5\bin\Debug\C5.dll W:\research\c5\current
+copy ..\..\C5\bin\Debug\C5.pdb W:\research\c5\current
+
+rem del "W:\research\c5\current\types\*.htm"
+
+xcopy /Q *.htm W:\research\c5\current /S/Y
+copy docnet.css W:\research\c5\current
+pause
diff --git a/mcs/class/Mono.C5/doc/overview.xslt b/mcs/class/Mono.C5/doc/overview.xslt
new file mode 100644
index 00000000000..e410cd2318e
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/overview.xslt
@@ -0,0 +1,65 @@
+<?xml version="1.0" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output encoding = "ISO-8859-1"/>
+ <xsl:template match="/">
+ <html>
+ <head>
+ <title>
+ <xsl:text>DocNet documentation for</xsl:text>
+ <xsl:value-of select="Assembly/@Name" /></title>
+ <link rel="stylesheet" type="text/css" href="docnet.css" />
+ </head>
+ <body>
+ <h3>Interfaces overview</h3>
+ <xsl:for-each select="/Assembly/Interface[@Access != 'private']">
+ <xsl:sort select="@Name" />
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">,<br/> </xsl:if>
+ </xsl:for-each>
+ <h3>Classes overview</h3>
+ <xsl:for-each select="/Assembly/Class[@Access != 'private']">
+ <xsl:sort select="@Name" />
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">,<br/> </xsl:if>
+ </xsl:for-each>
+ <h3>Value Types overview</h3>
+ <xsl:for-each select="/Assembly/Struct[@Access != 'private']">
+ <xsl:sort select="@Name" />
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">,<br/> </xsl:if>
+ </xsl:for-each>
+ <h3>Delegates overview</h3>
+ <xsl:for-each select="/Assembly/Delegate[@Access != 'private']">
+ <xsl:sort select="@Name" />
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">,<br/> </xsl:if>
+ </xsl:for-each>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template match="Signature">
+ <code>
+ <xsl:value-of select="." />
+ </code>
+ </xsl:template>
+ <xsl:template name="htmllink">
+ <xsl:choose>
+ <xsl:when test="@refid">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <!--xsl:text>main.htm#</xsl:text>
+ <xsl:value-of select="@refid" /-->
+ <xsl:text>types/</xsl:text><xsl:value-of select="substring(@refid,3)" /><xsl:text>.htm</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="target">
+ <xsl:text>main</xsl:text>
+ </xsl:attribute>
+ <xsl:apply-templates select="Signature" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="Signature" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/mcs/class/Mono.C5/doc/tolatex.xslt b/mcs/class/Mono.C5/doc/tolatex.xslt
new file mode 100644
index 00000000000..0e929b9079b
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/tolatex.xslt
@@ -0,0 +1,43 @@
+<?xml version="1.0" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output encoding = "ISO-8859-1" omit-xml-declaration="yes" indent="no"/>
+ <xsl:strip-space elements="*"/>
+ <xsl:template match="table">
+ <xsl:text>\begin{tabular}{lc|*{15}{c}}\hline\hline&#10;</xsl:text>
+ <xsl:apply-templates></xsl:apply-templates>
+ <xsl:text>\hline\hline&#10;\end{tabular}&#10;</xsl:text>
+ </xsl:template>
+ <xsl:template match="tr">
+ <xsl:choose>
+ <xsl:when test="td/i">
+ <xsl:text>\hline&#10;%</xsl:text><xsl:value-of select="td/i/font"/><xsl:text>&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="th">
+ <xsl:if test="position()!=1">\turned{</xsl:if>
+ <xsl:apply-templates/>
+ <xsl:if test="position()!=1">}</xsl:if>
+ <xsl:if test="position()!=last()"><xsl:text disable-output-escaping="yes" >&#10;&amp;&#32;</xsl:text></xsl:if>
+ </xsl:for-each>
+ <xsl:for-each select="td">
+ <xsl:if test="position()=1">\texttt{</xsl:if>
+ <xsl:if test="position()!=1">$</xsl:if>
+ <xsl:apply-templates/>
+ <xsl:if test="position()=1">}</xsl:if>
+ <xsl:if test="position()!=1">$</xsl:if>
+ <xsl:if test="position()!=last()"><xsl:text disable-output-escaping="yes" >&#32;&amp;&#32;</xsl:text></xsl:if>
+ </xsl:for-each>
+ <!---->\\&#10;<!---->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match ="th">
+ <xsl:apply-templates/>
+ </xsl:template>
+ <xsl:template match ="td">
+ <xsl:apply-templates/>
+ </xsl:template>
+ <xsl:template match="font">
+ <xsl:apply-templates/>
+ </xsl:template>
+</xsl:stylesheet> \ No newline at end of file
diff --git a/mcs/class/Mono.C5/doc/trans.xslt b/mcs/class/Mono.C5/doc/trans.xslt
new file mode 100644
index 00000000000..526c177acb7
--- /dev/null
+++ b/mcs/class/Mono.C5/doc/trans.xslt
@@ -0,0 +1,591 @@
+<?xml version="1.0" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output encoding = "ISO-8859-1"/>
+ <xsl:template match="/">
+ <xsl:apply-templates select="/Assembly/Interface" />
+ <xsl:apply-templates select="/Assembly/Class" />
+ <xsl:apply-templates select="/Assembly/Struct" />
+ <xsl:apply-templates select="/Assembly/Delegate" />
+ </xsl:template>
+ <xsl:template match="/Assembly/Interface">
+ <xsl:call-template name="file"/>
+ </xsl:template>
+ <xsl:template match="/Assembly/Class">
+ <xsl:call-template name="file"/>
+ </xsl:template>
+ <xsl:template match="/Assembly/Struct">
+ <xsl:call-template name="file"/>
+ </xsl:template>
+ <xsl:template match="/Assembly/Delegate">
+ <xsl:call-template name="file"/>
+ </xsl:template>
+ <xsl:template name="file">
+ <xsl:if test="@Access[.!='private']">
+ <xsl:text>&#13;&#10;</xsl:text>
+ <xsl:element name="filestart">
+ <xsl:attribute name="name">
+ <xsl:value-of select="substring(@refid,3)"/>
+ <xsl:text>.htm</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#13;&#10;</xsl:text>
+ <html >
+ <head>
+ <title>
+ <xsl:text>C5 doc: </xsl:text>
+ <xsl:value-of select="@Name" />
+ </title>
+ <link rel="stylesheet" type="text/css" href="../docnet.css" />
+ </head>
+ <xsl:element name="body">
+ <xsl:attribute name="onLoad">
+ <xsl:text>parent.document.title ='C5 doc: </xsl:text>
+ <xsl:value-of select="@Name" />
+ <xsl:text>'</xsl:text>
+ </xsl:attribute>
+ <h2>
+ <xsl:value-of select="name()"/>
+ <xsl:text>&#32;</xsl:text>
+ <xsl:call-template name="htmlname" />
+ </h2>
+ <xsl:apply-templates select="summary" />
+ <xsl:call-template name="typeparams" />
+ <xsl:call-template name="implements" />
+ <xsl:call-template name="implementedby" />
+ <xsl:call-template name="super" />
+ <xsl:apply-templates select="Bases" />
+ <xsl:call-template name="baseof" />
+ <xsl:call-template name="foverview" />
+ <xsl:call-template name="eoverview" />
+ <xsl:call-template name="poverview" />
+ <xsl:call-template name="coverview" />
+ <xsl:call-template name="moverview" />
+ <xsl:call-template name="ooverview" />
+ <xsl:call-template name="ftable" />
+ <xsl:call-template name="etable" />
+ <xsl:call-template name="ptable" />
+ <xsl:call-template name="ctable" />
+ <xsl:call-template name="mtable" />
+ <xsl:call-template name="otable" />
+ </xsl:element>
+ </html>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template name="implements">
+ <xsl:for-each select="Implements">
+ <xsl:sort select="@refid" />
+ <xsl:if test="position()=1">
+ <h3>Implements</h3>
+ </xsl:if>
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">, </xsl:if>
+ </xsl:for-each>
+ </xsl:template>
+ <xsl:template name="super">
+ <xsl:variable name="leRefid" select="@refid" />
+ <xsl:for-each select="/Assembly/Interface[Implements[@refid = $leRefid ] and @Access != 'private']">
+ <xsl:sort select="@Name" />
+ <xsl:if test="position()=1">
+ <h3>Super</h3>
+ </xsl:if>
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">, </xsl:if>
+ </xsl:for-each>
+ </xsl:template>
+ <xsl:template name="implementedby">
+ <xsl:variable name="leRefid" select="@refid" />
+ <xsl:for-each select="/Assembly/Class[Implements[@refid = $leRefid ] and @Access != 'private']">
+ <xsl:sort select="@Name" />
+ <xsl:if test="position()=1">
+ <h3>Implemented by</h3>
+ </xsl:if>
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">, </xsl:if>
+ </xsl:for-each>
+ </xsl:template>
+ <xsl:template match="Bases">
+ <xsl:if test="position()=1">
+ <h3>Bases</h3>
+ </xsl:if>
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">, </xsl:if>
+ </xsl:template>
+ <xsl:template name="baseof">
+ <xsl:variable name="leRefid" select="@refid" />
+ <xsl:for-each select="/Assembly/Class[Bases[@refid = $leRefid ] and @Access != 'private']">
+ <xsl:sort select="@Name" />
+ <xsl:if test="position()=1">
+ <h3>Base of</h3>
+ </xsl:if>
+ <xsl:call-template name="htmllink" />
+ <xsl:if test="position()!=last()">, </xsl:if>
+ </xsl:for-each>
+ </xsl:template>
+ <xsl:template match="param">
+ <tr>
+ <td valign="top">
+ <!--code-->
+ <xsl:value-of select="@name" />
+ <!--/code-->
+ <xsl:text>:</xsl:text>
+ </td>
+ <td valign="top">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="returns">
+ <xsl:if test="current()[../@ReturnType!='void']">
+ <tr>
+ <td valign="top">
+ <b>Returns:</b>
+ </td>
+ <td valign="top">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template match="Signature">
+ <code>
+ <xsl:value-of select="." />
+ </code>
+ </xsl:template>
+ <xsl:template match="summary">
+ <xsl:apply-templates />
+ </xsl:template>
+ <xsl:template match="value">
+ <p>
+ <b>Value:</b>
+ <xsl:apply-templates />
+ </p>
+ </xsl:template>
+ <!-- templates for VS 2005 doc tags-->
+ <xsl:template match="exception">
+ <xsl:choose>
+ <xsl:when test="current()[name(..)='summary']">
+ <b>/Throws</b>
+ <xsl:value-of select="substring(@cref,3)" />
+ <xsl:apply-templates />
+ </xsl:when>
+ <xsl:otherwise>
+ <tr>
+ <td valign="top">
+ <xsl:variable name="leRefid" select="@cref" />
+ <xsl:variable name="leExcNode" select="/Assembly/Class[@refid = $leRefid and @Access != 'private']"/>
+ <xsl:choose>
+ <xsl:when test="$leExcNode">
+ <xsl:for-each select="$leExcNode">
+ <xsl:call-template name="htmllink" />
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring(@cref,3)" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td valign="top">
+ <xsl:apply-templates />
+ </td>
+ </tr>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <!--xsl:template match="code">
+ <code>
+ <xsl:apply-templates select="@* | node()" />
+ </code>
+ </xsl:template-->
+ <xsl:template match="item">
+ <li>
+ <xsl:apply-templates select="@* | node()" />
+ </li>
+ </xsl:template>
+ <!-- also do description and term tags, and other list types?-->
+ <xsl:template match="list">
+ <xsl:choose>
+ <xsl:when test="@type='ordered'">
+ <ol>
+ <xsl:apply-templates select="@* | node()" />
+ </ol>
+ </xsl:when>
+ <xsl:otherwise>
+ <ul>
+ <xsl:apply-templates select="@* | node()" />
+ </ul>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match="para">
+ <p>
+ <xsl:apply-templates select="@* | node()" />
+ </p>
+ </xsl:template>
+ <xsl:template match="seealso">
+ <xsl:text>See also</xsl:text>
+ <xsl:variable name="leRefid" select="@cref" />
+ <xsl:variable name="leNode" select="//*[@refid=$leRefid]" />
+ <xsl:variable name="leFile" select="substring(ancestor::*[@refid and not(@Declared)]/@refid,3)" />
+ <xsl:choose>
+ <xsl:when test ="substring(@cref,1,2) = 'T:'">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="substring(@cref,3)" />
+ <xsl:text>.htm</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="$leNode/Signature" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="$leNode/@CDeclared=$leFile">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ #<xsl:value-of select="@cref" />
+ </xsl:attribute>
+ <xsl:value-of select="$leNode/Signature" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$leNode/@CDeclared" />.htm#<xsl:value-of select="@cref" />
+ </xsl:attribute>
+ <xsl:value-of select="$leNode/@Declared" />.<xsl:value-of select="$leNode/Signature" />
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match="see">
+ <!--xsl:text>See </xsl:text-->
+ <xsl:variable name="leRefid" select="@cref" />
+ <xsl:variable name="leNode" select="//*[@refid=$leRefid]" />
+ <xsl:variable name="leFile" select="substring(ancestor::*[@refid and not(@Declared)]/@refid,3)" />
+ <xsl:choose>
+ <xsl:when test ="substring(@cref,1,2) = 'T:'">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="substring(@cref,3)" />
+ <xsl:text>.htm</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="$leNode/Signature" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="$leNode/@CDeclared=$leFile">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="@cref" />
+ </xsl:attribute>
+ <xsl:value-of select="$leNode/Signature" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$leNode/@CDeclared" />.htm#<xsl:value-of select="@cref" />
+ </xsl:attribute>
+ <xsl:value-of select="$leNode/@Declared" />.<xsl:value-of select="$leNode/Signature" />
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match="typeparam">
+ <tr>
+ <td valign="top">
+ <xsl:value-of select="@name" />
+ </td>
+ <td valign="top">
+ <xsl:apply-templates />
+ </td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="constraint">
+ <tr>
+ <td valign="top"></td>
+ <td valign="top">
+ <xsl:value-of select="@Value" />
+ </td>
+ </tr>
+ </xsl:template>
+ <xsl:template match="@* | node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@* | node()" />
+ </xsl:copy>
+ </xsl:template>
+ <!-- end templates for VS 2005 doc tags -->
+ <xsl:template name="typeparams">
+ <xsl:if test="typeparam">
+ <table>
+ <tr>
+ <td>
+ <b>Type parameters:</b>
+ </td>
+ <td></td>
+ </tr>
+ <xsl:apply-templates select="typeparam"/>
+ <xsl:if test="constraint">
+ <tr>
+ <td>
+ <b>Constraints:</b>
+ </td>
+ <td></td>
+ </tr>
+ <xsl:apply-templates select="constraint"/>
+ </xsl:if>
+ </table>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template name="htmllink">
+ <xsl:choose>
+ <xsl:when test="@C5">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test ="substring(@refid,1,2) = 'T:'">
+ <xsl:value-of select="substring(@refid,3)" />
+ <xsl:text>.htm</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@CDeclared"/>.htm#<xsl:value-of select="@refid" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:apply-templates select="Signature" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="Signature" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template name="locallink">
+ <xsl:choose>
+ <xsl:when test="@refid">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="concat(../@refid , '|',@refid)" />
+ </xsl:attribute>
+ <xsl:apply-templates select="Signature" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="Signature" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template name="htmlname">
+ <xsl:choose>
+ <xsl:when test="@refid">
+ <xsl:choose>
+ <xsl:when test ="not(@Declared)">
+ <!-- i.e. a type -->
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@refid" />
+ </xsl:attribute>
+ <xsl:apply-templates select="Signature" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- i.e. a member -->
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="concat(../@refid , '|',@refid)" />
+ </xsl:attribute>
+ <xsl:apply-templates select="Signature" />
+ </xsl:element>
+ <xsl:if test ="not(@Inherited)">
+ <!-- the canonical description -->
+ <xsl:element name="a">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@refid" />
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="Signature" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template name="ftable">
+ <xsl:call-template name="table">
+ <xsl:with-param name="type">Field</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="etable">
+ <xsl:call-template name="table">
+ <xsl:with-param name="type">Event</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="ptable">
+ <xsl:call-template name="table">
+ <xsl:with-param name="type">Property</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="ctable">
+ <xsl:call-template name="table">
+ <xsl:with-param name="type">Constructor</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="mtable">
+ <xsl:call-template name="table">
+ <xsl:with-param name="type" select="'Method'"/>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="otable">
+ <xsl:call-template name="table">
+ <xsl:with-param name="type" select="'Operator'"/>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="table">
+ <xsl:param name="type" />
+ <xsl:param name="protection" />
+ <xsl:variable name="thenodes" select="*[name() = $type and @Access != 'private' and not(@Inherited)]" />
+ <xsl:if test="$thenodes">
+ <h3>
+ <xsl:value-of select="$type" />
+ <xsl:text> details</xsl:text>
+ </h3>
+ <table border="1">
+ <xsl:for-each select="$thenodes">
+ <xsl:sort select="@Name" />
+ <tr>
+ <td valign="top">
+ <xsl:if test="current()[@Virtual != 'True' and @Static != 'True']">
+ <code class="greenbg">N</code>
+ </xsl:if>
+ <xsl:if test="current()[@Final = 'True' and @Static != 'True']">
+ <code class="greenbg">F</code>
+ </xsl:if>
+ <xsl:if test="current()[@Abstract = 'True']">
+ <code class="greenbg">A</code>
+ </xsl:if>
+ <xsl:if test="current()[@Static = 'True']">
+ <code class="greenbg">S</code>
+ </xsl:if>
+ <xsl:if test="current()[@Access = 'protected']">
+ <code class="greenbg">P</code>
+ </xsl:if>
+ <code>
+ <xsl:text>&#32;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="@ReturnType">
+ <xsl:value-of select="@ReturnType"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@Type"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#32;</xsl:text>
+ </code>
+ <xsl:call-template name="htmlname" />
+ </td>
+ <td>
+ <!--xsl:if test="@Inherited">
+ <xsl:text>Inherited from </xsl:text>
+ <xsl:value-of select="@Declared"/>
+ <xsl:text>: </xsl:text>
+ <xsl:call-template name="htmllink" />
+ </xsl:if-->
+ <xsl:if test="not(@Inherited)">
+ <xsl:if test="@Get">
+ <b>Access: </b>
+ <xsl:if test="@Get='True' and @Set='True'">Read-Write</xsl:if>
+ <xsl:if test="@Get='True' and @Set='False'">Read-Only</xsl:if>
+ <xsl:if test="@Get='False' and @Set='True'">Write-Only</xsl:if>
+ <br/>
+ </xsl:if>
+ <xsl:apply-templates select="value" />
+ <xsl:apply-templates select="summary" />
+ <xsl:if test="exception">
+ <table>
+ <tr>
+ <td>
+ <b>Throws</b>
+ </td>
+ <td></td>
+ </tr>
+ <xsl:apply-templates select="exception" />
+ </table>
+ </xsl:if>
+ <xsl:call-template name="typeparams"/>
+ <xsl:if test="current()[@ReturnType != 'void'] or param">
+ <table>
+ <xsl:apply-templates select="returns" />
+ <xsl:if test="param">
+ <tr>
+ <td>
+ <b>Parameters:</b>
+ </td>
+ </tr>
+ <xsl:apply-templates select="param" />
+ </xsl:if>
+ </table>
+ </xsl:if>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template name="foverview">
+ <xsl:call-template name="overview">
+ <xsl:with-param name="type">Field</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="eoverview">
+ <xsl:call-template name="overview">
+ <xsl:with-param name="type">Event</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="poverview">
+ <xsl:call-template name="overview">
+ <xsl:with-param name="type">Property</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="coverview">
+ <xsl:call-template name="overview">
+ <xsl:with-param name="type">Constructor</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="moverview">
+ <xsl:call-template name="overview">
+ <xsl:with-param name="type">Method</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="ooverview">
+ <xsl:call-template name="overview">
+ <xsl:with-param name="type">Operator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template name="overview">
+ <xsl:param name="type" select="'[Unknown Locale]'" />
+ <xsl:for-each select="*[name() = $type and @Access != 'private']">
+ <xsl:sort select="@Name" />
+ <xsl:if test="position() = 1">
+ <h3>
+ <xsl:value-of select="$type" />
+ <xsl:text> overview</xsl:text>
+ </h3>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="@Inherited">
+ <xsl:call-template name="htmllink" />
+ <xsl:text>, </xsl:text>
+ <xsl:text>Inherited from </xsl:text>
+ <xsl:value-of select="@Declared"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="locallink" />
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="position()!=last()">
+ ,<br/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:template>
+</xsl:stylesheet>