MiscUtil
    
    
        
            
            Class allowing a user to choose a console application to run, after
            examining an assembly for all classes containing a static Main method, either
            parameterless or with a string array parameter.
            
        
        
            
            Displays entry points and prompts the user to choose one.
            
            Type within the assembly containing the applications. This type is
            not included in the list of entry points to run.
            Arguments to pass in for methods which have a single string[] parameter.
        
        
            
            Returns the entry point for a method, or null if no entry points can be used.
            An entry point taking string[] is preferred to one with no parameters.
            
        
        
            
            Exception thrown to indicate that a buffer of the
            desired size cannot be acquired.
            
        
        
            
            Creates an instance of this class with the given message.
            
        
        
            
            Type of buffer returned by CachingBufferManager.
            
        
        
            
            Interface encapsulating a byte array which may be managed
            by an IBufferManager implementation. When the buffer is
            disposed, some implementations of this interface may
            return the buffer to the IBufferManager which created
            it. Note that an IBuffer *must* always be disposed after use,
            or some implementations may leak memory. The buffer must
            not be used after being disposed, likewise the byte array must
            not be used after the buffer is disposed.
            
        
        
            
            Returns the byte array encapsulated by this buffer.
            Note that depending on the buffer manager providing
            the buffer, the array may or may not be cleared (i.e.
            with every byte 0) to start with.
            
        
        
            
            An implementation of IBufferManager which keeps a cache of
            buffers. The precise behaviour is controlled by the nested Options
            class.
            
            This class is safe to use from multiple threads, but buffers
            returned are not inherently thread safe (although they have no
            thread affinity).
            
        
        
            
            Interface for classes which manage instances of
            IBuffer.
            
        
        
            
            Returns a buffer of the given size or greater.
            
            The minimum size of buffer to return
            This manager is unable
            to return a buffer of the appropriate size
            minimumSize is less than
            or equal to 0
        
        
            
            Options configurating this manager.
            
        
        
            
            List of bands. Each entry is an array
            of size MaxBuffersPerSizeBand. Each entry of that array is either
            null or a buffer, which may or may not be in use. The first entry
            in the list consists of buffers of size MinBufferSize, then
            MinBufferSize*ScalingFactor etc.
            
        
        
            
            Lock for member access. 5 seconds should be more than adequate
            as a timeout.
            
        
        
            
            Creates a caching buffer manager configured with the default options
            (as per a freshly created instance of Options).
            
        
        
            
            Creates a caching buffer manager configured with the specified
            options. Note that the options are cloned - any changes to the
            options passed in after construction will have no effect on the
            manager.
            
            The configuration options for this manager.
            The configuration is invalid
        
        
            
            Returns a buffer of the given size or greater.
            
            If the buffer could
            not be taken from a pool, and the ActionOnBufferUnavailable
            is set to ThrowException, or if the specified size is greater
            than the maximum buffer size.
            If minimumSize is less than 0.
        
        
            
            Works out the size of the next band up from the current size.
            This is based on the scaling factor in the options, the maximum buffer
            size, and the requirement that the returned size should always be
            greater than the original one. (This is achieved using Ceiling -
            the worst case is when size is 1 and the scaling factor is 1.25,
            whereupon Ceiling will return 2.)
            
            
        
        
            
            Finds an available buffer from the list, creating a new buffer
            where appropriate.
            
            Index into the list of buffer slots
            Size of buffer to create if necessary
            An available buffer, or null if none are available in the given band.
        
        
            
            Provides options for CachingBufferManager.
            
        
        
            
            Strongly typed Clone implementation.
            
            A clone of these options
        
        
            
            Weakly typed Clone implementation.
            
        
        
            
            The maximum number of buffers to keep for each
            size band. When a buffer is requested from one size band,
            if none are available and this many buffers have already
            been allocated, a buffer from the next size band is
            returned (using the same algorithm). Defaults to 16;
            must not be less than 1.
            
        
        
            
            The minimum buffer size to use, in bytes. If a buffer less than this size is
            requested, this is the size that will actually be used. Must be at least 1.
            On construction of the CachingBufferManager, this must not be greater than
            MaxBufferSize. Defaults to 1024.
            
        
        
            
            Whether buffers are cleared (i.e. all bytes set to 0) after they
            are disposed. Defaults to true. For situations where buffers do not
            contain any sensitive information, and all clients know to only use
            data they have specifically put into the buffer (e.g. when copying
            streams), this may be set to false for efficiency.
            
        
        
            
            The scaling factor for sizes of buffers. The smallest buffer is of size
            MinBufferSize, then the next smallest is MinBufferSize*ScalingFactor, and
            so forth. The default is 2.0, so with the default buffer size of 1K, buffers
            will be 1K, 2K, 4K, 8K etc. The value must be greater than or equal to 1.25.
            
        
        
            
            The maximum size of buffer to return, or 0 for no maximum.
            This is primarily used with an ActionOnBufferUnavailable of UseBigger,
            which could potentially create bigger and bigger buffers. If a buffer
            of a size greater than this is requested, a BufferAcquisitionException will
            be thrown. Defaults to Int32.MaxValue. The value must be greater than 0.
            On construction of the CachingBufferManager, this must not be less than
            MinBufferSize.
            
        
        
            
            Determines the action to take when a buffer of the most appropriate size
            is unavailable. Defaults to ReturnUncached.
            
        
        
            
            Enumeration of options available when a buffer of the most appropriate size
            is unavailable.
            
        
        
            
            A buffer of the next size band up is returned, or the size band above that,
            etc, until the maximum size is reached, at which point this fails over to
            ReturnUncached.
            
        
        
            
            A buffer of exactly the right size is returned, but one which when disposed
            does not return the buffer to a cache.
            
        
        
            
            A BufferAcquisitionException is thrown.
            
        
        
            
            Implementation of the Adler32 checksum routine.
            TODO: Derive from HashAlgorithm.
            
        
        
            
            Base for modulo arithmetic
            
        
        
            
            Number of iterations we can safely do before applying the modulo.
            
        
        
            
            Computes the Adler32 checksum for the given data.
            
            
            Initial value or previous result. Use 1 for the
            first transformation.
            
            The data to compute the checksum of
            Index of first byte to compute checksum for
            Number of bytes to compute checksum for
            The checksum of the given data
        
        
            
            Computes the Adler32 checksum for the given data.
            
            
            Initial value or previous result. Use 1 for the
            first transformation.
            
            The data to compute the checksum of
            The checksum of the given data
        
        
            
            Computes the checksum for a stream, starting from the current
            position and reading until no more can be read
            
            The stream to compute the checksum for
            The checksum for the stream
        
        
            
            Computes the checksum of a file
            
            The file to compute the checksum of
            The checksum for the file
        
        
            
            Utility to build an IComparer implementation from a Comparison delegate,
            and a static method to do the reverse.
            
        
        
            
            Creates a new instance which will proxy to the given Comparison
            delegate when called.
            
            Comparison delegate to proxy to. Must not be null.
        
        
            
            Implementation of IComparer.Compare which simply proxies
            to the originally specified Comparison delegate.
            
        
        
            
            Creates a Comparison delegate from the given Comparer.
            
            Comparer to use when the returned delegate is called. Must not be null.
            A Comparison delegate which proxies to the given Comparer.
        
        
            
            Map from types to instances of those types, e.g. int to 10 and
            string to "hi" within the same dictionary. This cannot be done
            without casting (and boxing for value types) as .NET cannot
            represent this relationship with generics in their current form.
            This class encapsulates the nastiness in a single place.
            
        
        
            
            Maps the specified type argument to the given value. If
            the type argument already has a value within the dictionary,
            ArgumentException is thrown.
            
        
        
            
            Maps the specified type argument to the given value. If
            the type argument already has a value within the dictionary, it
            is overwritten.
            
        
        
            
            Attempts to fetch a value from the dictionary, throwing a
            KeyNotFoundException if the specified type argument has no
            entry in the dictionary.
            
        
        
            
            Attempts to fetch a value from the dictionary, returning false and
            setting the output parameter to the default value for T if it
            fails, or returning true and setting the output parameter to the
            fetched value if it succeeds.
            
        
        
            
            Extensions to IComparer
            
        
        
            
            Reverses the original comparer; if it was already a reverse comparer,
            the previous version was reversed (rather than reversing twice).
            In other words, for any comparer X, X==X.Reverse().Reverse().
            
        
        
            
            Combines a comparer with a second comparer to implement composite sort
            behaviour.
            
        
        
            
            Combines a comparer with a projection to implement composite sort behaviour.
            
        
        
            
            Extensions to IDictionary
            
        
        
            
            Returns the value associated with the specified key if there
            already is one, or inserts a new value for the specified key and
            returns that.
            
            Type of key
            Type of value, which must either have
            a public parameterless constructor or be a value type
            Dictionary to access
            Key to lookup
            Existing value in the dictionary, or new one inserted
        
        
            
            Returns the value associated with the specified key if there already
            is one, or calls the specified delegate to create a new value which is
            stored and returned.
            
            Type of key
            Type of value
            Dictionary to access
            Key to lookup
            Delegate to provide new value if required
            Existing value in the dictionary, or new one inserted
        
        
            
            Returns the value associated with the specified key if there
            already is one, or inserts the specified value and returns it.
            
            Type of key
            Type of value
            Dictionary to access
            Key to lookup
            Value to use when key is missing
            Existing value in the dictionary, or new one inserted
        
        
            
            Wrapper methods for SmartEnumerable[T].
            
        
        
            
            Extension method to make life easier.
            
            Type of enumerable
            Source enumerable
            A new SmartEnumerable of the appropriate type
        
        
            
            Non-generic class to produce instances of the generic class,
            optionally using type inference.
            
        
        
            
            Creates an instance of ProjectionComparer using the specified projection.
            
            Type parameter for the elements to be compared
            Type parameter for the keys to be compared, after being projected from the elements
            Projection to use when determining the key of an element
            A comparer which will compare elements by projecting each element to its key, and comparing keys
        
        
            
            Creates an instance of ProjectionComparer using the specified projection.
            The ignored parameter is solely present to aid type inference.
            
            Type parameter for the elements to be compared
            Type parameter for the keys to be compared, after being projected from the elements
            Value is ignored - type may be used by type inference
            Projection to use when determining the key of an element
            A comparer which will compare elements by projecting each element to its key, and comparing keys
        
        
            
            Class generic in the source only to produce instances of the 
            doubly generic class, optionally using type inference.
            
        
        
            
            Creates an instance of ProjectionComparer using the specified projection.
            
            Type parameter for the keys to be compared, after being projected from the elements
            Projection to use when determining the key of an element
            A comparer which will compare elements by projecting each element to its key, and comparing keys        
        
        
            
            Comparer which projects each element of the comparison to a key, and then compares
            those keys using the specified (or default) comparer for the key type.
            
            Type of elements which this comparer will be asked to compare
            Type of the key projected from the element
        
        
            
            Creates a new instance using the specified projection, which must not be null.
            The default comparer for the projected type is used.
            
            Projection to use during comparisons
        
        
            
            Creates a new instance using the specified projection, which must not be null.
            
            Projection to use during comparisons
            The comparer to use on the keys. May be null, in
            which case the default comparer will be used.
        
        
            
            Compares x and y by projecting them to keys and then comparing the keys. 
            Null values are not projected; they obey the
            standard comparer contract such that two null values are equal; any null value is
            less than any non-null value.
            
        
        
            
            Non-generic class to produce instances of the generic class,
            optionally using type inference.
            
        
        
            
            Creates an instance of ProjectionEqualityComparer using the specified projection.
            
            Type parameter for the elements to be compared
            Type parameter for the keys to be compared, after being projected from the elements
            Projection to use when determining the key of an element
            A comparer which will compare elements by projecting each element to its key, and comparing keys
        
        
            
            Creates an instance of ProjectionEqualityComparer using the specified projection.
            The ignored parameter is solely present to aid type inference.
            
            Type parameter for the elements to be compared
            Type parameter for the keys to be compared, after being projected from the elements
            Value is ignored - type may be used by type inference
            Projection to use when determining the key of an element
            A comparer which will compare elements by projecting each element to its key, and comparing keys
        
        
            
            Class generic in the source only to produce instances of the 
            doubly generic class, optionally using type inference.
            
        
        
            
            Creates an instance of ProjectionEqualityComparer using the specified projection.
            
            Type parameter for the keys to be compared, after being projected from the elements
            Projection to use when determining the key of an element
            A comparer which will compare elements by projecting each element to its key, and comparing keys        
        
        
            
            Comparer which projects each element of the comparison to a key, and then compares
            those keys using the specified (or default) comparer for the key type.
            
            Type of elements which this comparer will be asked to compare
            Type of the key projected from the element
        
        
            
            Creates a new instance using the specified projection, which must not be null.
            The default comparer for the projected type is used.
            
            Projection to use during comparisons
        
        
            
            Creates a new instance using the specified projection, which must not be null.
            
            Projection to use during comparisons
            The comparer to use on the keys. May be null, in
            which case the default comparer will be used.
        
        
            
            Compares the two specified values for equality by applying the projection
            to each value and then using the equality comparer on the resulting keys. Null
            references are never passed to the projection.
            
        
        
            
            Produces a hash code for the given value by projecting it and
            then asking the equality comparer to find the hash code of
            the resulting key.
            
        
        
            
            A class with a similar function to System.Collections.Queue,
            but allowing random access to the contents of the queue as well
            as the usual enqueuing at the end and dequeuing at the start.
            This implementation is not synchronized at all - clients should
            provide their own synchronization. A SyncRoot is provided for
            this purpose, although any other common reference may also be used.
            In order to provide an efficient implementation of both random access
            and the removal of items from the start of the queue, a circular
            buffer is used and resized when necessary. The buffer never shrinks
            unless TrimToSize is called.
            
        
        
            
            Default (and minimum) capacity for the buffer containing the elements in the queue.
            
        
        
            
            The circular buffer containing the items in the queue
            
        
        
            
            The "physical" index of item with logical index 0.
            
        
        
            
            Version information for the queue - this is incremented every time
            the contents of the queue is changed, so that enumerators can detect
            the change.
            
        
        
            
            Initializes a new instance of the RandomAccessQueue class which is empty
            and has the specified capacity (or the default capacity if that is higher).
            
            The initial capacity of the queue
        
        
            
            Initializes a new instance of the RandomAccessQueue class which is empty
            and has the default capacity.
            
        
        
            
            Private constructor used in cloning
            
            The buffer to clone for use in this queue
            The number of "valid" elements in the buffer
            The first valid element in the queue
        
        
            
            Clears the queue without resizing the buffer
            
        
        
            
            Resizes the buffer to just fit the current number of items in the queue.
            The buffer size is never set to less than the default capacity, however.
            
        
        
            
            Adds an item to the end of the queue.
            
            The item to add to the queue. The value can be a null reference.
        
        
            
            Adds an object at the specified index.
            
            The item to add to the queue. The value can be a null reference.
            The index of the newly added item
        
        
            
            Removes an T from the start of the queue, returning it.
            
            The item at the head of the queue
        
        
            
            Removes an item at the given index and returns it.
            
            The index of the item to remove
            The item which has been removed from the
        
        
            
            Copies the elements of the queue to the given array, beginning at
            the specified index in the array.
            
            The array to copy the contents of the queue into
            The zero-based index in array at which copying begins
        
        
            
            Performs a binary search using IComparable. If the value occurs multiple times,
            there is no guarantee as to which index will be returned. If the value does
            not occur at all, the bitwise complement of the first index containing a larger
            value is returned (or the bitwise complement of the size of the queue if the value
            is larger than any value in the queue). This is the location at which the value should
            be inserted to preserve sort order. If the list is not sorted according to 
            the appropriate IComparable implementation before this method is calling, the result
            is not guaranteed. The value passed in must implement IComparable, unless it is null.
            The IComparable.CompareTo method will be called on the value passed in, with the
            values in the queue as parameters, rather than the other way round. No test is made
            to make sure that the types of item are the same - it is up to the implementation of
            IComparable to throw an exception if incomparable types are presented.
            A null reference is treated as being less than any item, (so passing in null will always 
            return 0 or -1). The implementation of IComparable is never asked to compare to null.
            
            The item to search for
            
            A location in the queue containing the item, or the bitwise complement of the 
            first index containing a larger value.
            
        
        
            
            Performs a binary search using the specified IComparer. If the value occurs multiple times,
            there is no guarantee as to which index will be returned. If the value does
            not occur at all, the bitwise complement of the first index containing a larger
            value is returned (or the bitwise complement of the size of the queue if the value
            is larger than any value in the queue). This is the location at which the value should
            be inserted to preserve sort order. If the list is not sorted according to 
            the appropriate IComparer implementation before this method is calling, the result
            is not guaranteed. The CompareTo method will be called on the comparer passed in, with the
            specified value as the first parameter, and values in the queue as the second parameter, 
            rather than the other way round.
            While a null reference should be treated as being less than any object in most
            implementations of IComparer, this is not required by this method. Any null references
            (whether in the queue or the specified value itself) are passed directly to the CompareTo
            method. This allow for IComparers to reverse the usual order, if required.
            
            The object to search for
            The comparator to use for searching. Must not be null.
            
            A location in the queue containing the object, or the bitwise complement of the 
            first index containing a larger value.
            
        
        
            
            Performs a binary search using the specified Comparison. If the value occurs multiple times,
            there is no guarantee as to which index will be returned. If the value does
            not occur at all, the bitwise complement of the first index containing a larger
            value is returned (or the bitwise complement of the size of the queue if the value
            is larger than any value in the queue). This is the location at which the value should
            be inserted to preserve sort order. If the list is not sorted according to 
            the appropriate IComparer implementation before this method is calling, the result
            is not guaranteed. The CompareTo method will be called on the comparer passed in, with the
            specified value as the first parameter, and values in the queue as the second parameter, 
            rather than the other way round.
            While a null reference should be treated as being less than any object in most
            implementations of IComparer, this is not required by this method. Any null references
            (whether in the queue or the specified value itself) are passed directly to the CompareTo
            method. This allow for Comparisons to reverse the usual order, if required.
            
            The object to search for
            The comparison to use for searching. Must not be null.
            
            A location in the queue containing the object, or the bitwise complement of the 
            first index containing a larger value.
            
        
        
            
            Returns an enumerator that can iterate through the queue.
            Note that due to the way C# 2.0 iterators work, we cannot spot changes 
            to the queue after the enumerator was fetched but before MoveNext() is first
            called.
            
            Returns an enumerator for the entire queue.
        
        
            
            Returns an enumerator that can iterate through the queue.
            
            Returns an enumerator for the entire queue.
        
        
            
            Creates a new queue with the same contents as this queue.
            The queues are separate, however - adding an item to the returned
            queue doesn't affect the current queue or vice versa.
            A new sync root is also supplied.
            
            A clone of the current queue
        
        
            
            Strongly typed version of ICloneable.Clone. Creates a new queue 
            with the same contents as this queue.
            The queues are separate, however - adding an item to the returned
            queue doesn't affect the current queue or vice versa.
            A new sync root is also supplied.
            
            A clone of the current queue
        
        
            
            Resizes the queue to a new capacity, optionally leaving a gap at
            a specified logical index so that a new item can be slotted in 
            without further copying
            
            The new capacity
            The logical index at which to insert a gap,
            or -1 for no gap
        
        
            
            Adds an item to the queue
            
            The item to add
        
        
            
            Returns whether or not the queue contains the given item,
            using the default EqualityComparer if the item to find is
            non-null.
            
        
        
            
            Copies the elements of the queue to the given array, beginning at
            the specified index in the array.
            
            The array to copy the contents of the queue into
            The zero-based index in array at which copying begins
        
        
            
            Removes the given item from the queue, if it is present. The first
            equal value is removed.
            
        
        
            
            The number of items in the queue.
            
        
        
            
            Indexer for the class, allowing items to be retrieved by
            index and replaced.
            
        
        
            
            Current capacity of the queue - the size of the buffer.
            
        
        
            
            An object reference to synchronize on when using the queue
            from multiple threads. This reference isn't used anywhere
            in the class itself. The same reference will always be returned
            for the same queue, and this will never be the same as the reference
            returned for a different queue, even a clone.
            
        
        
            
            Returns false, to indicate that this queue is not synchronized.
            
        
        
            
            Returns false, to indicate that this queue is not read-only.
            
        
        
            
            Represents a range of values. An IComparer{T} is used to compare specific
            values with a start and end point. A range may be include or exclude each end
            individually.
            
            A range which is half-open but has the same start and end point is deemed to be empty,
            e.g. [3,3) doesn't include 3. To create a range with a single value, use an inclusive
            range, e.g. [3,3].
            
            Ranges are always immutable - calls such as IncludeEnd() and ExcludeEnd() return a new
            range without modifying this one.
            
        
        
            
            Constructs a new inclusive range using the default comparer
            
        
        
            
            Constructs a new range including both ends using the specified comparer
            
        
        
            
            Constructs a new range, including or excluding each end as specified,
            with the given comparer.
            
        
        
            
            Returns a range with the same boundaries as this, but excluding the end point.
            When called on a range already excluding the end point, the original range is returned.
            
        
        
            
            Returns a range with the same boundaries as this, but excluding the start point.
            When called on a range already excluding the start point, the original range is returned.
            
        
        
            
            Returns a range with the same boundaries as this, but including the end point.
            When called on a range already including the end point, the original range is returned.
            
        
        
            
            Returns a range with the same boundaries as this, but including the start point.
            When called on a range already including the start point, the original range is returned.
            
        
        
            
            Returns whether or not the range contains the given value
            
        
        
            
            Returns an iterator which begins at the start of this range,
            applying the given step delegate on each iteration until the 
            end is reached or passed. The start and end points are included
            or excluded according to this range.
            
            Delegate to apply to the "current value" on each iteration
        
        
            
            Returns an iterator which begins at the end of this range,
            applying the given step delegate on each iteration until the 
            start is reached or passed. The start and end points are included
            or excluded according to this range.
            
            Delegate to apply to the "current value" on each iteration
        
        
            
            Returns an iterator which begins at the start of this range,
            adding the given step amount to the current value each iteration until the 
            end is reached or passed. The start and end points are included
            or excluded according to this range. This method does not check for
            the availability of an addition operator at compile-time; if you use it
            on a range where there is no such operator, it will fail at execution time.
            
            Amount to add on each iteration
        
        
            
            Returns an iterator which begins at the end of this range,
            subtracting the given step amount to the current value each iteration until the 
            start is reached or passed. The start and end points are included
            or excluded according to this range. This method does not check for
            the availability of a subtraction operator at compile-time; if you use it
            on a range where there is no such operator, it will fail at execution time.
            
            Amount to subtract on each iteration. Note that
            this is subtracted, so in a range [0,10] you would pass +2 as this parameter
            to obtain the sequence (10, 8, 6, 4, 2, 0).
            
        
        
            
            Returns an iterator which begins at the start of this range,
            adding the given step amount to the current value each iteration until the 
            end is reached or passed. The start and end points are included
            or excluded according to this range. This method does not check for
            the availability of an addition operator at compile-time; if you use it
            on a range where there is no such operator, it will fail at execution time.
            
            Amount to add on each iteration
        
        
            
            Returns an iterator which begins at the end of this range,
            subtracting the given step amount to the current value each iteration until the 
            start is reached or passed. The start and end points are included
            or excluded according to this range. This method does not check for
            the availability of a subtraction operator at compile-time; if you use it
            on a range where there is no such operator, it will fail at execution time.
            
            Amount to subtract on each iteration. Note that
            this is subtracted, so in a range [0,10] you would pass +2 as this parameter
            to obtain the sequence (10, 8, 6, 4, 2, 0).
            
        
        
            
            Returns an iterator which steps through the range, applying the specified
            step delegate on each iteration. The method determines whether to begin 
            at the start or end of the range based on whether the step delegate appears to go
            "up" or "down". The step delegate is applied to the start point. If the result is 
            more than the start point, the returned iterator begins at the start point; otherwise
            it begins at the end point.
            
            Delegate to apply to the "current value" on each iteration
        
        
            
            Returns an iterator which steps through the range, adding the specified amount
            on each iteration. If the step amount is logically negative, the returned iterator
            begins at the start point; otherwise it begins at the end point.
            This method does not check for
            the availability of an addition operator at compile-time; if you use it
            on a range where there is no such operator, it will fail at execution time.
            
            The amount to add on each iteration
        
        
            
            Returns an iterator which steps through the range, adding the specified amount
            on each iteration. If the step amount is logically negative, the returned iterator
            begins at the end point; otherwise it begins at the start point. This method
            is equivalent to Step(T stepAmount), but allows an alternative type to be used.
            The most common example of this is likely to be stepping a range of DateTimes
            by a TimeSpan.
            This method does not check for
            the availability of a suitable addition operator at compile-time; if you use it
            on a range where there is no such operator, it will fail at execution time.
            
            The amount to add on each iteration
        
        
            
            The start of the range.
            
        
        
            
            The end of the range.
            
        
        
            
            Comparer to use for comparisons
            
        
        
            
            Whether or not this range includes the start point
            
        
        
            
            Whether or not this range includes the end point
            
        
        
            
            Iterates over a range. Despite its name, this implements IEnumerable{T} rather than
            IEnumerator{T} - it just sounds better, frankly.
            
        
        
            
            Creates an ascending iterator over the given range with the given step function
            
        
        
            
            Creates an iterator over the given range with the given step function,
            with the specified direction.
            
        
        
            
            Returns an IEnumerator{T} running over the range.
            
        
        
            
            Returns an IEnumerator running over the range.
            
        
        
            
            Returns the range this object iterates over
            
        
        
            
            Returns the step function used for this range
            
        
        
            
            Returns whether or not this iterator works up from the start point (ascending)
            or down from the end point (descending)
            
        
        
            
            Implementation of IComparer{T} based on another one;
            this simply reverses the original comparison.
            
            
        
        
            
            Creates a new reversing comparer.
            
            The original comparer to use for comparisons.
        
        
            
            Returns the result of comparing the specified values using the original
            comparer, but reversing the order of comparison.
            
        
        
            
            Returns the original comparer; this can be useful to avoid multiple
            reversals.
            
        
        
            
            Static class to make creation easier. If possible though, use the extension
            method in SmartEnumerableExt.
            
        
        
            
            Extension method to make life easier.
            
            Type of enumerable
            Source enumerable
            A new SmartEnumerable of the appropriate type
        
        
            
            Type chaining an IEnumerable<T> to allow the iterating code
            to detect the first and last entries simply.
            
            Type to iterate over
        
        
            
            Enumerable we proxy to
            
        
        
            
            Constructor.
            
            Collection to enumerate. Must not be null.
        
        
            
            Returns an enumeration of Entry objects, each of which knows
            whether it is the first/last of the enumeration, as well as the
            current value.
            
        
        
            
            Non-generic form of GetEnumerator.
            
        
        
            
            Represents each entry returned within a collection,
            containing the value and whether it is the first and/or
            the last entry in the collection's. enumeration
            
        
        
            
            The value of the entry.
            
        
        
            
            Whether or not this entry is first in the collection's enumeration.
            
        
        
            
            Whether or not this entry is last in the collection's enumeration.
            
        
        
            
            The 0-based index of this entry (i.e. how many entries have been returned before this one)
            
        
        
            
            Cache used for encoding/decoding addresses.
            
        
        
            
            Table used to encode/decode instructions.
            
        
        
            
            Default code table specified in RFC 3284.
            
        
        
            
            Array of entries in the code table
            
        
        
            
            Builds the default code table specified in RFC 3284
            
            
            The default code table.
            
        
        
            
            
            
        
        
            
            Contains the information for a single instruction
            
        
        
            
            Enumeration of the different instruction types.
            
        
        
            
            A few IO routines to make life easier. Most are basically available
            in EndianBinaryReader, but having them separately here makes VcdiffDecoder
            more easily movable to other places - and no endianness issues are involved in
            the first place.
            
        
        
            
            Decoder for VCDIFF (RFC 3284) streams.
            
        
        
            
            Reader containing original data, if any. May be null.
            If non-null, will be readable and seekable.
            
        
        
            
            Stream containing delta data. Will be readable.
            
        
        
            
            Stream containing target data. Will be readable,
            writable and seekable.
            
        
        
            
            Code table to use for decoding.
            
        
        
            
            Address cache to use when decoding; must be reset before decoding each window.
            Default to the default size.
            
        
        
            
            Sole constructor; private to prevent instantiation from
            outside the class.
            
        
        
            
            Decodes an original stream and a delta stream, writing to a target stream.
            The original stream may be null, so long as the delta stream never
            refers to it. The original and delta streams must be readable, and the
            original stream (if any) and the target stream must be seekable. 
            The target stream must be writable and readable. The original and target
            streams are rewound to their starts before any data is read; the relevant data
            must occur at the beginning of the original stream, and any data already present
            in the target stream may be overwritten. The delta data must begin
            wherever the delta stream is currently positioned. The delta stream must end
            after the last window. The streams are not disposed by this method.
            
            Stream containing delta. May be null.
            Stream containing delta data.
            Stream to write resulting data to.
        
        
            
            Top-level decoding method. When this method exits, all decoding has been performed.
            
        
        
            
            Read the header, including any custom code table. The delta stream is left
            positioned at the start of the first window.
            
        
        
            
            Reads the custom code table, if there is one
            
        
        
            
            Reads and decodes a window, returning whether or not there was
            any more data to read.
            
            
            Whether or not the delta stream had reached the end of its data.
            
        
        
            
            Summary description for VcdiffFormatException.
            
        
        
            
            Implementation of EndianBitConverter which converts to/from big-endian
            byte arrays.
            
        
        
            
            Equivalent of System.BitConverter, but with either endianness.
            
        
        
            
            Indicates the byte order ("endianess") in which data is converted using this class.
            
            
            Different computer architectures store data using different byte orders. "Big-endian"
            means the most significant byte is on the left end of a word. "Little-endian" means the 
            most significant byte is on the right end of a word.
            
            true if this converter is little-endian, false otherwise.
        
        
            
            Converts the specified double-precision floating point number to a 
            64-bit signed integer. Note: the endianness of this converter does not
            affect the returned value.
            
            The number to convert. 
            A 64-bit signed integer whose value is equivalent to value.
        
        
            
            Converts the specified 64-bit signed integer to a double-precision 
            floating point number. Note: the endianness of this converter does not
            affect the returned value.
            
            The number to convert. 
            A double-precision floating point number whose value is equivalent to value.
        
        
            
            Converts the specified single-precision floating point number to a 
            32-bit signed integer. Note: the endianness of this converter does not
            affect the returned value.
            
            The number to convert. 
            A 32-bit signed integer whose value is equivalent to value.
        
        
            
            Converts the specified 32-bit signed integer to a single-precision floating point 
            number. Note: the endianness of this converter does not
            affect the returned value.
            
            The number to convert. 
            A single-precision floating point number whose value is equivalent to value.
        
        
            
            Returns a Boolean value converted from one byte at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            true if the byte at startIndex in value is nonzero; otherwise, false.
        
        
            
            Returns a Unicode character converted from two bytes at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A character formed by two bytes beginning at startIndex.
        
        
            
            Returns a double-precision floating point number converted from eight bytes 
            at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A double precision floating point number formed by eight bytes beginning at startIndex.
        
        
            
            Returns a single-precision floating point number converted from four bytes 
            at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A single precision floating point number formed by four bytes beginning at startIndex.
        
        
            
            Returns a 16-bit signed integer converted from two bytes at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A 16-bit signed integer formed by two bytes beginning at startIndex.
        
        
            
            Returns a 32-bit signed integer converted from four bytes at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A 32-bit signed integer formed by four bytes beginning at startIndex.
        
        
            
            Returns a 64-bit signed integer converted from eight bytes at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A 64-bit signed integer formed by eight bytes beginning at startIndex.
        
        
            
            Returns a 16-bit unsigned integer converted from two bytes at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A 16-bit unsigned integer formed by two bytes beginning at startIndex.
        
        
            
            Returns a 32-bit unsigned integer converted from four bytes at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A 32-bit unsigned integer formed by four bytes beginning at startIndex.
        
        
            
            Returns a 64-bit unsigned integer converted from eight bytes at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A 64-bit unsigned integer formed by eight bytes beginning at startIndex.
        
        
            
            Checks the given argument for validity.
            
            The byte array passed in
            The start index passed in
            The number of bytes required
            value is a null reference
            
            startIndex is less than zero or greater than the length of value minus bytesRequired.
            
        
        
            
            Checks the arguments for validity before calling FromBytes
            (which can therefore assume the arguments are valid).
            
            The bytes to convert after checking
            The index of the first byte to convert
            The number of bytes to convert
            
        
        
            
            Convert the given number of bytes from the given array, from the given start
            position, into a long, using the bytes as the least significant part of the long.
            By the time this is called, the arguments have been checked for validity.
            
            The bytes to convert
            The index of the first byte to convert
            The number of bytes to use in the conversion
            The converted number
        
        
            
            Returns a String converted from the elements of a byte array.
            
            An array of bytes.
            All the elements of value are converted.
            
            A String of hexadecimal pairs separated by hyphens, where each pair 
            represents the corresponding element in value; for example, "7F-2C-4A".
            
        
        
            
            Returns a String converted from the elements of a byte array starting at a specified array position.
            
            An array of bytes.
            The starting position within value.
            The elements from array position startIndex to the end of the array are converted.
            
            A String of hexadecimal pairs separated by hyphens, where each pair 
            represents the corresponding element in value; for example, "7F-2C-4A".
            
        
        
            
            Returns a String converted from a specified number of bytes at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            The number of bytes to convert.
            The length elements from array position startIndex are converted.
            
            A String of hexadecimal pairs separated by hyphens, where each pair 
            represents the corresponding element in value; for example, "7F-2C-4A".
            
        
        
            
            Returns a decimal value converted from sixteen bytes 
            at a specified position in a byte array.
            
            An array of bytes.
            The starting position within value.
            A decimal  formed by sixteen bytes beginning at startIndex.
        
        
            
            Returns the specified decimal value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 16.
        
        
            
            Copies the specified decimal value into the specified byte array,
            beginning at the specified index.
            
            A character to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Returns an array with the given number of bytes formed
            from the least significant bytes of the specified value.
            This is used to implement the other GetBytes methods.
            
            The value to get bytes for
            The number of significant bytes to return
        
        
            
            Returns the specified Boolean value as an array of bytes.
            
            A Boolean value.
            An array of bytes with length 1.
        
        
            
            Returns the specified Unicode character value as an array of bytes.
            
            A character to convert.
            An array of bytes with length 2.
        
        
            
            Returns the specified double-precision floating point value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 8.
        
        
            
            Returns the specified 16-bit signed integer value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 2.
        
        
            
            Returns the specified 32-bit signed integer value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 4.
        
        
            
            Returns the specified 64-bit signed integer value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 8.
        
        
            
            Returns the specified single-precision floating point value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 4.
        
        
            
            Returns the specified 16-bit unsigned integer value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 2.
        
        
            
            Returns the specified 32-bit unsigned integer value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 4.
        
        
            
            Returns the specified 64-bit unsigned integer value as an array of bytes.
            
            The number to convert.
            An array of bytes with length 8.
        
        
            
            Copies the given number of bytes from the least-specific
            end of the specified value into the specified byte array, beginning
            at the specified index.
            This is used to implement the other CopyBytes methods.
            
            The value to copy bytes for
            The number of significant bytes to copy
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the given number of bytes from the least-specific
            end of the specified value into the specified byte array, beginning
            at the specified index.
            This must be implemented in concrete derived classes, but the implementation
            may assume that the value will fit into the buffer.
            
            The value to copy bytes for
            The number of significant bytes to copy
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified Boolean value into the specified byte array,
            beginning at the specified index.
            
            A Boolean value.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified Unicode character value into the specified byte array,
            beginning at the specified index.
            
            A character to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified double-precision floating point value into the specified byte array,
            beginning at the specified index.
            
            The number to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified 16-bit signed integer value into the specified byte array,
            beginning at the specified index.
            
            The number to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified 32-bit signed integer value into the specified byte array,
            beginning at the specified index.
            
            The number to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified 64-bit signed integer value into the specified byte array,
            beginning at the specified index.
            
            The number to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified single-precision floating point value into the specified byte array,
            beginning at the specified index.
            
            The number to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified 16-bit unsigned integer value into the specified byte array,
            beginning at the specified index.
            
            The number to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified 32-bit unsigned integer value into the specified byte array,
            beginning at the specified index.
            
            The number to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Copies the specified 64-bit unsigned integer value into the specified byte array,
            beginning at the specified index.
            
            The number to convert.
            The byte array to copy the bytes into
            The first index into the array to copy the bytes into
        
        
            
            Indicates the byte order ("endianess") in which data is converted using this class.
            
        
        
            
            Returns a little-endian bit converter instance. The same instance is
            always returned.
            
        
        
            
            Returns a big-endian bit converter instance. The same instance is
            always returned.
            
        
        
            
            Union used solely for the equivalent of DoubleToInt64Bits and vice versa.
            
        
        
            
            Int32 version of the value.
            
        
        
            
            Single version of the value.
            
        
        
            
            Creates an instance representing the given integer.
            
            The integer value of the new instance.
        
        
            
            Creates an instance representing the given floating point number.
            
            The floating point value of the new instance.
        
        
            
            Returns the value of the instance as an integer.
            
        
        
            
            Returns the value of the instance as a floating point number.
            
        
        
            
            Indicates the byte order ("endianess") in which data is converted using this class.
            
            
            Different computer architectures store data using different byte orders. "Big-endian"
            means the most significant byte is on the left end of a word. "Little-endian" means the 
            most significant byte is on the right end of a word.
            
            true if this converter is little-endian, false otherwise.
        
        
            
            Copies the specified number of bytes from value to buffer, starting at index.
            
            The value to copy
            The number of bytes to copy
            The buffer to copy the bytes into
            The index to start at
        
        
            
            Returns a value built from the specified number of bytes from the given buffer,
            starting at index.
            
            The data in byte array format
            The first index to use
            The number of bytes to use
            The value built from the given bytes
        
        
            
            Indicates the byte order ("endianess") in which data is converted using this class.
            
        
        
            
            A class to allow the conversion of doubles to string representations of
            their exact decimal values. The implementation aims for readability over
            efficiency.
            
        
        
            
            Converts the given double to a string representation of its
            exact decimal value.
            
            The double to convert.
            A string representation of the double's exact decimal value.
        
        
            
            Private class used for manipulating sequences of decimal digits.
            
        
        
            Digits in the decimal expansion, one byte per digit
        
        
             
            How many digits are *after* the decimal point
            
        
        
             
            Constructs an arbitrary decimal expansion from the given long.
            The long must not be negative.
            
        
        
            
            Multiplies the current expansion by the given amount, which should
            only be 2 or 5.
            
        
        
            
            Shifts the decimal point; a negative value makes
            the decimal expansion bigger (as fewer digits come after the
            decimal place) and a positive value makes the decimal
            expansion smaller.
            
        
        
            
            Removes leading/trailing zeroes from the expansion.
            
        
        
            
            Converts the value to a proper decimal string representation.
            
        
        
            
            Endianness of a converter
            
        
        
            
            Little endian - least significant byte first
            
        
        
            
            Big endian - most significant byte first
            
        
        
            
            Implementation of EndianBitConverter which converts to/from little-endian
            byte arrays.
            
        
        
            
            Indicates the byte order ("endianess") in which data is converted using this class.
            
            
            Different computer architectures store data using different byte orders. "Big-endian"
            means the most significant byte is on the left end of a word. "Little-endian" means the 
            most significant byte is on the right end of a word.
            
            true if this converter is little-endian, false otherwise.
        
        
            
            Copies the specified number of bytes from value to buffer, starting at index.
            
            The value to copy
            The number of bytes to copy
            The buffer to copy the bytes into
            The index to start at
        
        
            
            Returns a value built from the specified number of bytes from the given buffer,
            starting at index.
            
            The data in byte array format
            The first index to use
            The number of bytes to use
            The value built from the given bytes
        
        
            
            Indicates the byte order ("endianess") in which data is converted using this class.
            
        
        
            
            Generic event argument taking a single value
            
        
        
            
            Creates a new EventArgs<T> with the specified value.
            
            The Value of the EventArgs<T> instance.
        
        
            
            The typed value of the EventArgs<T>
            
        
        
            
            Extension methods to do with ranges.
            
        
        
            
            Creates an inclusive range between two values. The default comparer is used
            to compare values.
            
            Type of the values
            Start of range.
            End of range.
            An inclusive range between the start point and the end point.
        
        
            
            Returns a RangeIterator over the given range, where the stepping function
            is to step by the given number of characters.
            
            The range to create an iterator for
            How many characters to step each time
            A RangeIterator with a suitable stepping function
        
        
            
            Extension methods on all reference types. 
            
        
        
            
            Throws an ArgumentNullException if the given data item is null.
            
            The item to check for nullity.
            The name to use when throwing an exception, if necessary
        
        
            
            Throws an ArgumentNullException if the given data item is null.
            No parameter name is specified.
            
            The item to check for nullity.
        
        
            
            Extension methods producing DateTime values. These are useful
            when writing unit tests with fixed dates which should be easily understandable.
            
        
        
            
            Returns a DateTime representing the specified day in January
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in February
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in March
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in April
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in May
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in June
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in July
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in August
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in September
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in October
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in November
            in the specified year.
            
        
        
            
            Returns a DateTime representing the specified day in December
            in the specified year.
            
        
        
            
            Extension methods producing TimeSpan values. Note: Ticks should really
            take a long, and the rest should all take doubles. It looks like extension
            methods don't quite work properly with implicit numeric conversions :(
            
        
        
            
            Returns a TimeSpan representing the specified number of ticks.
            
        
        
            
            Returns a TimeSpan representing the specified number of milliseconds.
            
        
        
            
            Returns a TimeSpan representing the specified number of seconds.
            
        
        
            
            Returns a TimeSpan representing the specified number of minutes.
            
        
        
            
            Returns a TimeSpan representing the specified number of hours.
            
        
        
            
            Returns a TimeSpan representing the specified number of days.
            
        
        
            
            Generic math equivalents of System.Math.
            (Calling this just Math makes far too much mess.)
            
        
        
            
            Returns the absolute value of a specified number.
            
            Type to calculate with
            Input to return the absolute value of.
            The input value if it is greater than or equal to the default value of T,
            or the negated input value otherwise
        
        
            
            Returns whether or not two inputs are "close" to each other with respect to a given delta.
            
            
            This implementation currently does no overflow checking - if (input1-input2) overflows, it
            could yield the wrong result.
            
            Type to calculate with
            First input value
            Second input value
            Permitted range (exclusive)
            True if Abs(input1-input2) is less than or equal to delta; false otherwise.
        
        
            
            Equivalent of System.IO.BinaryReader, but with either endianness, depending on
            the EndianBitConverter it is constructed with. No data is buffered in the
            reader; the client may seek within the stream at will.
            
        
        
            
            Whether or not this reader has been disposed yet.
            
        
        
            
            Decoder to use for string conversions.
            
        
        
            
            Buffer used for temporary storage before conversion into primitives
            
        
        
            
            Buffer used for temporary storage when reading a single character
            
        
        
            
            Minimum number of bytes used to encode a character
            
        
        
            
            Equivalent of System.IO.BinaryWriter, but with either endianness, depending on
            the EndianBitConverter it is constructed with.
            
            Converter to use when reading data
            Stream to read data from
        
        
            
            Constructs a new binary reader with the given bit converter, reading
            to the given stream, using the given encoding.
            
            Converter to use when reading data
            Stream to read data from
            Encoding to use when reading character data
        
        
            
            Closes the reader, including the underlying stream..
            
        
        
            
            Seeks within the stream.
            
            Offset to seek to.
            Origin of seek operation.
        
        
            
            Reads a single byte from the stream.
            
            The byte read
        
        
            
            Reads a single signed byte from the stream.
            
            The byte read
        
        
            
            Reads a boolean from the stream. 1 byte is read.
            
            The boolean read
        
        
            
            Reads a 16-bit signed integer from the stream, using the bit converter
            for this reader. 2 bytes are read.
            
            The 16-bit integer read
        
        
            
            Reads a 32-bit signed integer from the stream, using the bit converter
            for this reader. 4 bytes are read.
            
            The 32-bit integer read
        
        
            
            Reads a 64-bit signed integer from the stream, using the bit converter
            for this reader. 8 bytes are read.
            
            The 64-bit integer read
        
        
            
            Reads a 16-bit unsigned integer from the stream, using the bit converter
            for this reader. 2 bytes are read.
            
            The 16-bit unsigned integer read
        
        
            
            Reads a 32-bit unsigned integer from the stream, using the bit converter
            for this reader. 4 bytes are read.
            
            The 32-bit unsigned integer read
        
        
            
            Reads a 64-bit unsigned integer from the stream, using the bit converter
            for this reader. 8 bytes are read.
            
            The 64-bit unsigned integer read
        
        
            
            Reads a single-precision floating-point value from the stream, using the bit converter
            for this reader. 4 bytes are read.
            
            The floating point value read
        
        
            
            Reads a double-precision floating-point value from the stream, using the bit converter
            for this reader. 8 bytes are read.
            
            The floating point value read
        
        
            
            Reads a decimal value from the stream, using the bit converter
            for this reader. 16 bytes are read.
            
            The decimal value read
        
        
            
            Reads a single character from the stream, using the character encoding for
            this reader. If no characters have been fully read by the time the stream ends,
            -1 is returned.
            
            The character read, or -1 for end of stream.
        
        
            
            Reads the specified number of characters into the given buffer, starting at
            the given index.
            
            The buffer to copy data into
            The first index to copy data into
            The number of characters to read
            The number of characters actually read. This will only be less than
            the requested number of characters if the end of the stream is reached.
            
        
        
            
            Reads the specified number of bytes into the given buffer, starting at
            the given index.
            
            The buffer to copy data into
            The first index to copy data into
            The number of bytes to read
            The number of bytes actually read. This will only be less than
            the requested number of bytes if the end of the stream is reached.
            
        
        
            
            Reads the specified number of bytes, returning them in a new byte array.
            If not enough bytes are available before the end of the stream, this
            method will return what is available.
            
            The number of bytes to read
            The bytes read
        
        
            
            Reads the specified number of bytes, returning them in a new byte array.
            If not enough bytes are available before the end of the stream, this
            method will throw an IOException.
            
            The number of bytes to read
            The bytes read
        
        
            
            Reads a 7-bit encoded integer from the stream. This is stored with the least significant
            information first, with 7 bits of information per byte of value, and the top
            bit as a continuation flag. This method is not affected by the endianness
            of the bit converter.
            
            The 7-bit encoded integer read from the stream.
        
        
            
            Reads a 7-bit encoded integer from the stream. This is stored with the most significant
            information first, with 7 bits of information per byte of value, and the top
            bit as a continuation flag. This method is not affected by the endianness
            of the bit converter.
            
            The 7-bit encoded integer read from the stream.
        
        
            
            Reads a length-prefixed string from the stream, using the encoding for this reader.
            A 7-bit encoded integer is first read, which specifies the number of bytes 
            to read from the stream. These bytes are then converted into a string with
            the encoding for this reader.
            
            The string read from the stream.
        
        
            
            Checks whether or not the reader has been disposed, throwing an exception if so.
            
        
        
            
            Reads the given number of bytes from the stream, throwing an exception
            if they can't all be read.
            
            Buffer to read into
            Number of bytes to read
        
        
            
            Reads the given number of bytes from the stream if possible, returning
            the number of bytes actually read, which may be less than requested if
            (and only if) the end of the stream is reached.
            
            Buffer to read into
            Number of bytes to read
            Number of bytes actually read
        
        
            
            Disposes of the underlying stream.
            
        
        
            
            The bit converter used to read values from the stream
            
        
        
            
            The encoding used to read strings
            
        
        
            
            Gets the underlying stream of the EndianBinaryReader.
            
        
        
            
            Equivalent of System.IO.BinaryWriter, but with either endianness, depending on
            the EndianBitConverter it is constructed with.
            
        
        
            
            Whether or not this writer has been disposed yet.
            
        
        
            
            Buffer used for temporary storage during conversion from primitives
            
        
        
            
            Buffer used for Write(char)
            
        
        
            
            Constructs a new binary writer with the given bit converter, writing
            to the given stream, using UTF-8 encoding.
            
            Converter to use when writing data
            Stream to write data to
        
        
            
            Constructs a new binary writer with the given bit converter, writing
            to the given stream, using the given encoding.
            
            Converter to use when writing data
            Stream to write data to
            Encoding to use when writing character data
        
        
            
            Closes the writer, including the underlying stream.
            
        
        
            
            Flushes the underlying stream.
            
        
        
            
            Seeks within the stream.
            
            Offset to seek to.
            Origin of seek operation.
        
        
            
            Writes a boolean value to the stream. 1 byte is written.
            
            The value to write
        
        
            
            Writes a 16-bit signed integer to the stream, using the bit converter
            for this writer. 2 bytes are written.
            
            The value to write
        
        
            
            Writes a 32-bit signed integer to the stream, using the bit converter
            for this writer. 4 bytes are written.
            
            The value to write
        
        
            
            Writes a 64-bit signed integer to the stream, using the bit converter
            for this writer. 8 bytes are written.
            
            The value to write
        
        
            
            Writes a 16-bit unsigned integer to the stream, using the bit converter
            for this writer. 2 bytes are written.
            
            The value to write
        
        
            
            Writes a 32-bit unsigned integer to the stream, using the bit converter
            for this writer. 4 bytes are written.
            
            The value to write
        
        
            
            Writes a 64-bit unsigned integer to the stream, using the bit converter
            for this writer. 8 bytes are written.
            
            The value to write
        
        
            
            Writes a single-precision floating-point value to the stream, using the bit converter
            for this writer. 4 bytes are written.
            
            The value to write
        
        
            
            Writes a double-precision floating-point value to the stream, using the bit converter
            for this writer. 8 bytes are written.
            
            The value to write
        
        
            
            Writes a decimal value to the stream, using the bit converter for this writer.
            16 bytes are written.
            
            The value to write
        
        
            
            Writes a signed byte to the stream.
            
            The value to write
        
        
            
            Writes an unsigned byte to the stream.
            
            The value to write
        
        
            
            Writes an array of bytes to the stream.
            
            The values to write
        
        
            
            Writes a portion of an array of bytes to the stream.
            
            An array containing the bytes to write
            The index of the first byte to write within the array
            The number of bytes to write
        
        
            
            Writes a single character to the stream, using the encoding for this writer.
            
            The value to write
        
        
            
            Writes an array of characters to the stream, using the encoding for this writer.
            
            An array containing the characters to write
        
        
            
            Writes a string to the stream, using the encoding for this writer.
            
            The value to write. Must not be null.
            value is null
        
        
            
            Writes a 7-bit encoded integer from the stream. This is stored with the least significant
            information first, with 7 bits of information per byte of value, and the top
            bit as a continuation flag.
            
            The 7-bit encoded integer to write to the stream
        
        
            
            Checks whether or not the writer has been disposed, throwing an exception if so.
            
        
        
            
            Writes the specified number of bytes from the start of the given byte array,
            after checking whether or not the writer has been disposed.
            
            The array of bytes to write from
            The number of bytes to write
        
        
            
            Disposes of the underlying stream.
            
        
        
            
            The bit converter used to write values to the stream
            
        
        
            
            The encoding used to write strings
            
        
        
            
            Gets the underlying stream of the EndianBinaryWriter.
            
        
        
            
            Reads a data source line by line. The source can be a file, a stream,
            or a text reader. In any case, the source is only opened when the
            enumerator is fetched, and is closed when the iterator is disposed.
            
        
        
            
            Means of creating a TextReader to read from.
            
        
        
            
            Creates a LineReader from a stream source. The delegate is only
            called when the enumerator is fetched. UTF-8 is used to decode
            the stream into text.
            
            Data source
        
        
            
            Creates a LineReader from a stream source. The delegate is only
            called when the enumerator is fetched.
            
            Data source
            Encoding to use to decode the stream into text
        
        
            
            Creates a LineReader from a filename. The file is only opened
            (or even checked for existence) when the enumerator is fetched.
            UTF8 is used to decode the file into text.
            
            File to read from
        
        
            
            Creates a LineReader from a filename. The file is only opened
            (or even checked for existence) when the enumerator is fetched.
            
            File to read from
            Encoding to use to decode the file into text
        
        
            
            Creates a LineReader from a TextReader source. The delegate
            is only called when the enumerator is fetched
            
            Data source
        
        
            
            Enumerates the data source line by line.
            
        
        
            
            Enumerates the data source line by line.
            
        
        
            
            Wraps a stream for all operations except Close and Dispose, which
            merely flush the stream and prevent further operations from being
            carried out using this wrapper.
            
        
        
            
            Creates a new instance of the class, wrapping the specified stream.
            
            The stream to wrap. Must not be null.
            stream is null
        
        
            
            Whether this stream has been closed or not
            
        
        
            
            Throws an InvalidOperationException if the wrapper is closed.
            
        
        
            
            Begins an asynchronous read operation.
            
            The buffer to read the data into. 
            
            The byte offset in buffer at which to begin writing data read from the stream.
            
            The maximum number of bytes to read. 
            
            An optional asynchronous callback, to be called when the read is complete.
            
            
            A user-provided object that distinguishes this particular 
            asynchronous read request from other requests.
            
            
            An IAsyncResult that represents the asynchronous read, 
            which could still be pending.
            
        
        
            
            Begins an asynchronous write operation.
            
            The buffer to write data from.
            The byte offset in buffer from which to begin writing.
            The maximum number of bytes to write.
            
            An optional asynchronous callback, to be called when the write is complete.
            
            
            A user-provided object that distinguishes this particular asynchronous 
            write request from other requests.
            
            
            An IAsyncResult that represents the asynchronous write, 
            which could still be pending.
            
        
        
            
            This method is not proxied to the underlying stream; instead, the wrapper
            is marked as unusable for other (non-close/Dispose) operations. The underlying
            stream is flushed if the wrapper wasn't closed before this call.
            
        
        
            
            Throws a NotSupportedException.
            
            The Type of the object that the new ObjRef will reference.
            n/a
        
        
            
            Waits for the pending asynchronous read to complete.
            
            
            The reference to the pending asynchronous request to finish.
            
            
            The number of bytes read from the stream, between zero (0) 
            and the number of bytes you requested. Streams only return 
            zero (0) at the end of the stream, otherwise, they should 
            block until at least one byte is available.
            
        
        
            
            Ends an asynchronous write operation.
            
            A reference to the outstanding asynchronous I/O request.
        
        
            
            Flushes the underlying stream.
            
        
        
            
            Throws a NotSupportedException.
            
            n/a
        
        
            
            Reads a sequence of bytes from the underlying stream and advances the 
            position within the stream by the number of bytes read.
            
            
            An array of bytes. When this method returns, the buffer contains 
            the specified byte array with the values between offset and 
            (offset + count- 1) replaced by the bytes read from the underlying source.
            
            
            The zero-based byte offset in buffer at which to begin storing the data 
            read from the underlying stream.
            
            
            The maximum number of bytes to be read from the 
            underlying stream.
            
            The total number of bytes read into the buffer. 
            This can be less than the number of bytes requested if that many 
            bytes are not currently available, or zero (0) if the end of the 
            stream has been reached.
            
        
        
            
            Reads a byte from the stream and advances the position within the 
            stream by one byte, or returns -1 if at the end of the stream.
            
            The unsigned byte cast to an Int32, or -1 if at the end of the stream.
        
        
            
            Sets the position within the current stream.
            
            A byte offset relative to the origin parameter.
            
            A value of type SeekOrigin indicating the reference 
            point used to obtain the new position.
            
            The new position within the underlying stream.
        
        
            
            Sets the length of the underlying stream.
            
            The desired length of the underlying stream in bytes.
        
        
            
            Writes a sequence of bytes to the underlying stream and advances 
            the current position within the stream by the number of bytes written.
            
            
            An array of bytes. This method copies count bytes 
            from buffer to the underlying stream.
            
            
            The zero-based byte offset in buffer at 
            which to begin copying bytes to the underlying stream.
            
            The number of bytes to be written to the underlying stream.
        
        
            
            Writes a byte to the current position in the stream and
            advances the position within the stream by one byte.
            
            The byte to write to the stream. 
        
        
            
            Stream wrapped by this wrapper
            
        
        
            
            Indicates whether or not the underlying stream can be read from.
            
        
        
            
            Indicates whether or not the underlying stream supports seeking.
            
        
        
            
            Indicates whether or not the underlying stream can be written to.
            
        
        
            
            Returns the length of the underlying stream.
            
        
        
            
            Gets or sets the current position in the underlying stream.
            
        
        
            
            Takes an encoding (defaulting to UTF-8) and a function which produces a seekable stream
            (or a filename for convenience) and yields lines from the end of the stream backwards.
            Only single byte encodings, and UTF-8 and Unicode, are supported. The stream
            returned by the function must be seekable.
            
        
        
            
            Buffer size to use by default. Classes with internal access can specify
            a different buffer size - this is useful for testing.
            
        
        
            
            Means of creating a Stream to read from.
            
        
        
            
            Encoding to use when converting bytes to text
            
        
        
            
            Size of buffer (in bytes) to read each time we read from the
            stream. This must be at least as big as the maximum number of
            bytes for a single character.
            
        
        
            
            Function which, when given a position within a file and a byte, states whether
            or not the byte represents the start of a character.
            
        
        
            
            Creates a LineReader from a stream source. The delegate is only
            called when the enumerator is fetched. UTF-8 is used to decode
            the stream into text.
            
            Data source
        
        
            
            Creates a LineReader from a filename. The file is only opened
            (or even checked for existence) when the enumerator is fetched.
            UTF8 is used to decode the file into text.
            
            File to read from
        
        
            
            Creates a LineReader from a filename. The file is only opened
            (or even checked for existence) when the enumerator is fetched.
            
            File to read from
            Encoding to use to decode the file into text
        
        
            
            Creates a LineReader from a stream source. The delegate is only
            called when the enumerator is fetched.
            
            Data source
            Encoding to use to decode the stream into text
        
        
            
            Returns the enumerator reading strings backwards. If this method discovers that
            the returned stream is either unreadable or unseekable, a NotSupportedException is thrown.
            
        
        
            
            Collection of utility methods which operate on streams.
            (With C# 3.0, these could well become extension methods on Stream.)
            
        
        
            
            Reads the given stream up to the end, returning the data as a byte
            array.
            
            The stream to read from
            input is null
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Reads the given stream up to the end, returning the data as a byte
            array, using the given buffer size.
            
            The stream to read from
            The size of buffer to use when reading
            input is null
            bufferSize is less than 1
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Reads the given stream up to the end, returning the data as a byte
            array, using the given buffer for transferring data. Note that the
            current contents of the buffer is ignored, so the buffer needn't
            be cleared beforehand.
            
            The stream to read from
            The buffer to use to transfer data
            input is null
            buffer is null
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Reads the given stream up to the end, returning the data as a byte
            array, using the given buffer for transferring data. Note that the
            current contents of the buffer is ignored, so the buffer needn't
            be cleared beforehand.
            
            The stream to read from
            The buffer to use to transfer data
            input is null
            buffer is null
            buffer is a zero-length array
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Copies all the data from one stream into another.
            
            The stream to read from
            The stream to write to
            input is null
            output is null
            An error occurs while reading or writing
        
        
            
            Copies all the data from one stream into another, using a buffer
            of the given size.
            
            The stream to read from
            The stream to write to
            The size of buffer to use when reading
            input is null
            output is null
            bufferSize is less than 1
            An error occurs while reading or writing
        
        
            
            Copies all the data from one stream into another, using the given 
            buffer for transferring data. Note that the current contents of 
            the buffer is ignored, so the buffer needn't be cleared beforehand.
            
            The stream to read from
            The stream to write to
            The buffer to use to transfer data
            input is null
            output is null
            buffer is null
            An error occurs while reading or writing
        
        
            
            Copies all the data from one stream into another, using the given 
            buffer for transferring data. Note that the current contents of 
            the buffer is ignored, so the buffer needn't be cleared beforehand.
            
            The stream to read from
            The stream to write to
            The buffer to use to transfer data
            input is null
            output is null
            buffer is null
            buffer is a zero-length array
            An error occurs while reading or writing
        
        
            
            Reads exactly the given number of bytes from the specified stream.
            If the end of the stream is reached before the specified amount
            of data is read, an exception is thrown.
            
            The stream to read from
            The number of bytes to read
            input is null
            bytesToRead is less than 1
            The end of the stream is reached before 
            enough data has been read
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Reads into a buffer, filling it completely.
            
            The stream to read from
            The buffer to read into
            input is null
            The buffer is of zero length
            The end of the stream is reached before 
            enough data has been read
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Reads into a buffer, filling it completely.
            
            The stream to read from
            The buffer to read into
            input is null
            The buffer is of zero length
            The end of the stream is reached before 
            enough data has been read
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Reads into a buffer, for the given number of bytes.
            
            The stream to read from
            The buffer to read into
            The number of bytes to read
            input is null
            The buffer is of zero length, or bytesToRead
            exceeds the buffer length
            The end of the stream is reached before 
            enough data has been read
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Reads exactly the given number of bytes from the specified stream,
            into the given buffer, starting at position 0 of the array.
            
            The stream to read from
            The byte array to read into
            The number of bytes to read
            input is null
            bytesToRead is less than 1
            The end of the stream is reached before 
            enough data has been read
            An error occurs while reading from the stream
        
        
            
            Reads into a buffer, for the given number of bytes, from the specified location
            
            The stream to read from
            The buffer to read into
            The index into the buffer at which to start writing
            The number of bytes to read
            input is null
            The buffer is of zero length, or startIndex+bytesToRead
            exceeds the buffer length
            The end of the stream is reached before 
            enough data has been read
            An error occurs while reading from the stream
            The data read from the stream
        
        
            
            Reads exactly the given number of bytes from the specified stream,
            into the given buffer, starting at position 0 of the array.
            
            The stream to read from
            The byte array to read into
            The index into the buffer at which to start writing
            The number of bytes to read
            input is null
            bytesToRead is less than 1, startIndex is less than 0,
            or startIndex+bytesToRead is greater than the buffer length
            The end of the stream is reached before 
            enough data has been read
            An error occurs while reading from the stream
        
        
            
            A simple class derived from StringWriter, but which allows
            the user to select which Encoding is used. This is most
            likely to be used with XmlTextWriter, which uses the Encoding
            property to determine which encoding to specify in the XML.
            
        
        
            
            The encoding to return in the Encoding property.
            
        
        
            
            Initializes a new instance of the StringWriterWithEncoding class
            with the specified encoding.
            
            The encoding to report.
        
        
            
            Initializes a new instance of the StringWriter class with the 
            specified format control and encoding.
            
            An IFormatProvider object that controls formatting.
            The encoding to report.
        
        
            
            Initializes a new instance of the StringWriter class that writes to the
            specified StringBuilder, and reports the specified encoding.
            
            The StringBuilder to write to. 
            The encoding to report.
        
        
            
            Initializes a new instance of the StringWriter class that writes to the specified 
            StringBuilder, has the specified format provider, and reports the specified encoding.
            
            The StringBuilder to write to. 
            An IFormatProvider object that controls formatting.
            The encoding to report.
        
        
            
            Gets the Encoding in which the output is written.
            
        
        
            
            Simple non-unique map wrapper
            
            
            ApplyResultSelector (from Lookup[TKey, TElement] is not implemented,
            since the caller could just as easily (or more-so) use .Select() with
            a Func[IGrouping[TKey, TElement], TResult], since
            IGrouping[TKey, TElement] already includes both the "TKey Key"
            and the IEnumerable[TElement].
            
        
        
            
            Creates a new EditableLookup using the default key-comparer
            
        
        
            
            Creates a new EditableLookup using the specified key-comparer
            
            
        
        
            
            Does the lookup contain any value(s) for the given key?
            
        
        
            
            Does the lookup the specific key/value pair?
            
        
        
            
            Adds a key/value pair to the lookup
            
            If the value is already present it will be duplicated
        
        
            
            Adds a range of values against a single key
            
            Any values already present will be duplicated
        
        
            
            Add all key/value pairs from the supplied lookup
            to the current lookup
            
            Any values already present will be duplicated
        
        
            
            Remove all values from the lookup for the given key
            
            True if any items were removed, else false
        
        
            
            Remove the specific key/value pair from the lookup
            
            True if the item was found, else false
        
        
            
            Trims the inner data-structure to remove
            any surplus space
            
        
        
            
            Returns the sequence of keys and their contained values
            
        
        
            
            Returns the number of dictinct keys in the lookup
            
        
        
            
            Returns the set of values for the given key
            
        
        
            
            Provides extension methods to List<T>
            
        
        
            
            Sorts the elements in the entire System.Collections.Generic.List{T} using
            a projection.
            
            Data source
            The projection to use to obtain values for comparison
            The comparer to use to compare projected values (on null to use the default comparer)
            Should the list be sorted ascending or descending?
        
        
            
            Sorts the elements in the entire System.Collections.Generic.List{T} using
            a projection.
            
            Data source
            The projection to use to obtain values for comparison
        
        
            
            Provides extension methods to System.Type to provide simple
            and efficient access to delegates representing reflection
            operations.
            
        
        
            
            Obtains a delegate to invoke a parameterless constructor
            
            The base/interface type to yield as the
            new value; often object except for factory pattern implementations
            The Type to be created
            A delegate to the constructor if found, else null
        
        
            
            Obtains a delegate to invoke a constructor which takes a parameter
            
            The type of the constructor parameter
            The base/interface type to yield as the
            new value; often object except for factory pattern implementations
            The Type to be created
            A delegate to the constructor if found, else null
        
        
            
            Obtains a delegate to invoke a constructor with multiple parameters
            
            The type of the first constructor parameter
            The type of the second constructor parameter
            The base/interface type to yield as the
            new value; often object except for factory pattern implementations
            The Type to be created
            A delegate to the constructor if found, else null
        
        
            
            Obtains a delegate to invoke a constructor with multiple parameters
            
            The type of the first constructor parameter
            The type of the second constructor parameter
            The type of the third constructor parameter
            The base/interface type to yield as the
            new value; often object except for factory pattern implementations
            The Type to be created
            A delegate to the constructor if found, else null
        
        
            
            Obtains a delegate to invoke a constructor with multiple parameters
            
            The type of the first constructor parameter
            The type of the second constructor parameter
            The type of the third constructor parameter
            The type of the fourth constructor parameter
            The base/interface type to yield as the
            new value; often object except for factory pattern implementations
            The Type to be created
            A delegate to the constructor if found, else null
        
        
            
            IProducerGrouping is to IDataProducer as IGrouping is to IEnumerable:
            it's basically a data producer with a key. It's used by the GroupBy
            operator.
            
        
        
            
            Interface to be implemented by sequences of data which have a "push"
            nature rather than "pull" - instead of the IEnumerable model of
            the client pulling data from the sequence, here the client registers
            an interest in the data being produced, and in the sequence reaching
            an end. The data producer than produces data whenever it wishes, and the
            clients can react. This allows other actions to occur between items being
            pulled, as well as multiple clients for the same sequence of data.
            
        
        
            
            Event which is raised when an item of data is produced.
            This will not be raised after EndOfData has been raised.
            The parameter for the event is the 
            
        
        
            
            Event which is raised when the sequence has finished being
            produced. This will be raised exactly once, and after all
            DataProduced events (if any) have been raised.
            
        
        
            
            The key for this grouping.
            
        
        
            
            Simple implementation of IProducerGrouping which proxies to an existing
            IDataProducer.
            
        
        
            
            Constructs a new grouping with the given key
            
        
        
            
            Event which is raised when an item of data is produced.
            This will not be raised after EndOfData has been raised.
            The parameter for the event is the 
            
            
        
        
            
            Event which is raised when the sequence has finished being
            produced. This will be raised exactly once, and after all
            DataProduced events (if any) have been raised.
            
            
        
        
            
            The key for this grouping.
            
        
        
            
            Comparer to daisy-chain two existing comparers and 
            apply in sequence (i.e. sort by x then y)
            
            
        
        
            
            Create a new LinkedComparer
            
            The first comparison to use
            The next level of comparison if the primary returns 0 (equivalent)
        
        
            
            General purpose Expression utilities
            
        
        
            
            Create a function delegate representing a unary operation
            
            The parameter type
            The return type
            Body factory
            Compiled function delegate
        
        
            
            Create a function delegate representing a binary operation
            
            The first parameter type
            The second parameter type
            The return type
            Body factory
            Compiled function delegate
        
        
            
            Create a function delegate representing a binary operation
            
            
            If no matching operation is possible, attempt to convert
            TArg1 and TArg2 to TResult for a match? For example, there is no
            "decimal operator /(decimal, int)", but by converting TArg2 (int) to
            TResult (decimal) a match is found.
            
            The first parameter type
            The second parameter type
            The return type
            Body factory
            Compiled function delegate
        
        
            
            Extensions on IDataProducer
            
            
            Extensions on IDataProducer
            
        
        
            
            Returns the number of elements in a sequence, as a future value.
            
            The type of the elements of source.
            A sequence that contains elements to be counted.
            The number of elements in the input sequence, as a future value.
            The actual count can only be retrieved after the source has indicated the end
            of its data.
            
        
        
            
            Returns the number of elements in the specified sequence satisfy a condition,
            as a future value.
            
            The type of the elements of source.
            A sequence that contains elements to be tested and counted.
            A function to test each element for a condition.
            A number that represents how many elements in the sequence satisfy 
            the condition in the predicate function, as a future value.
            The actual count can only be retrieved after the source has indicated the end
            of its data.
            
        
        
            
            Returns the number of elements in a sequence, as a future value.
            
            The type of the elements of source.
            A sequence that contains elements to be counted.
            The number of elements in the input sequence, as a future value.
            The actual count can only be retrieved after the source has indicated the end
            of its data.
            
        
        
            
            Returns the number of elements in the specified sequence satisfy a condition,
            as a future value.
            
            The type of the elements of source.
            A sequence that contains elements to be tested and counted.
            A function to test each element for a condition.
            A number that represents how many elements in the sequence satisfy 
            the condition in the predicate function, as a future value.
            The actual count can only be retrieved after the source has indicated the end
            of its data.
            
        
        
            
            Returns the first element of a sequence, as a future value.
            
            The type of the elements of source.
            The sequence to return the first element of.
            The first element in the specified sequence, as a future value.
            The actual value can only be retrieved after the source has indicated the end
            of its data.
            
        
        
            
            Returns the first element in a sequence that satisfies a specified condition, as a future value.
            
            The type of the elements of source.
            The sequence to an element from.
            A function to test each element for a condition.
            The first element in the specified sequence that passes the test in 
            the specified predicate function, as a future value.
            The actual value can only be retrieved after the source has indicated the end
            of its data.
            
        
        
            
            Returns the last element of a sequence, as a future value.
            
            The type of the elements of source.
            The sequence to return the last element of.
            The last element in the specified sequence, as a future value.
            The actual value can only be retrieved after the source has indicated the end
            of its data.
            
        
        
            
            Returns the last element in a sequence that satisfies a specified condition, as a future value.
            
            The type of the elements of source.
            The sequence to an element from.
            A function to test each element for a condition.
            The last element in the specified sequence that passes the test in 
            the specified predicate function, as a future value.
            The actual value can only be retrieved after the source has indicated the end
            of its data.
            
        
        
            
            Returns a future to the first value from a sequence, or the default for that type
            if no value is produced.
            
            The source data-producer.
        
        
            
            Returns a future to the first value from a sequence that matches the given condition, or the default
            for that type if no matching value is produced.
            
            The source data-producer.
            The condition to be satisfied.
        
        
            
            Returns a future to the last value from a sequence, or the default for that type
            if no value is produced.
            
            The source data-producer.
        
        
            
            Returns the last value from a sequence that matches the given condition, or the default
            for that type if no matching value is produced.
            
            The source data-producer.
            The condition to be satisfied.
        
        
            
            Returns a future to a single value from a data-source; an exception
            is thrown if no values, or multiple values, are encountered.
            
            The source data-producer.
            Zero or multiple terms are encountered.
        
        
            
            Returns a future to a single value from a data-source that matches the
            specified condition; an exception
            is thrown if no matching values, or multiple matching values, are encountered.
            
            The source data-producer.
            The condition to be satisfied.
            Zero or multiple matching terms are encountered.
        
        
            
            Returns a future to a single value from a data-source or the default value if no values
            are encountered. An exception
            is thrown if multiple values are encountered.
            
            The source data-producer.
            Multiple terms are encountered.
        
        
            
            Returns a future to a single value from a data-source that matches the
            specified condition, or the default value if no matching values
            are encountered. An exception
            is thrown if multiple matching values are encountered.
            
            The source data-producer.
            The condition to be satisfied.
            Multiple matching terms are encountered.
        
        
            
            Returns a future to the element at the given position in the sequence
            
            The data-producer
            The index of the desired trem in the sequence
            If the specified index is negative
            or is never reached
        
        
            
            Returns a future to the element at the given position in the sequence,
            or the default-value if the specified index is never reached
            
            The data-producer
            The index of the desired trem in the sequence
            If the specified index is negative
        
        
            
            Returns a future that indicates whether all values
            yielded by the data-producer satisfy a given condition.
            The future will return true for an empty sequence or
            where all values satisfy the condition, else false
            (if any value value fails to satisfy the condition).
            
            The data-producer to be monitored.
            The condition that must be satisfied by all terms.
        
        
            
            Returns a future that indicates whether any values are
            yielded by the data-producer. The future will return false
            for an empty sequence, or true for a sequence with values.
            
            The data-producer to be monitored.
        
        
            
            Returns a future that indicates whether any suitable values are
            yielded by the data-producer. The future will return false
            for an empty sequence or one with no matching values, or true for a sequence with matching values.
            
            The data-producer to be monitored.
            The condition that must be satisfied.
        
        
            
            Returns a future to indicate whether the specified value
            is yielded by the data-source.
            
            The type of data to be yielded
            The data-source
            The value to detect from the data-source, checked with the default comparer
        
        
            
            Returns a future to indicate whether the specified value
            is yielded by the data-source.
            
            The type of data to be yielded
            The data-source
            The value to detect from the data-source
            The comparer to use to determine equality
        
        
            
            Applies an accumulator function over the values yielded from
            a data-producer. The first value in the seqnence
            is used as the initial accumulator value, and the specified function is used
            to select the result value. If the sequence is empty then
            the default value for TSource is returned.
            
            The type of data yielded by the data-source
            Accumulator function to be applied to each term in the sequence
            The data-source for the values
        
        
            
            Applies an accumulator function over the values yielded from
            a data-producer. The specified seed value
            is used as the initial accumulator value, and the specified function is used
            to select the result value
            
            The type of data yielded by the data-source
            The type to be used for the accumulator
            Accumulator function to be applied to each term in the sequence
            The initial value for the accumulator
            The data-source for the values
        
        
            
            Applies an accumulator function over the values yielded from
            a data-producer, performing a transformation on the final
            accululated value. The specified seed value
            is used as the initial accumulator value, and the specified function is used
            to select the result value
            
            The type of data yielded by the data-source
            The final result type (after the accumulator has been transformed)
            The type to be used for the accumulator
            Accumulator function to be applied to each term in the sequence
            Transformation to apply to the final
            accumulated value to produce the result
            The initial value for the accumulator
            The data-source for the values
        
        
            
            Groups the elements of a sequence according to a specified key selector function
            and creates a result value from each group and its key.
            
            The return-type of the transform used to group the sequence
            The values to be yielded by the original data-source
            A function to extract the key for each element in hte original sequence.
            The data-source to be grouped
            This will force each unique grouping key to
            be buffered, but not the data itself
        
        
            
            Groups the elements of a sequence according to a specified key selector function
            and creates a result value from each group and its key.
            
            The return-type of the transform used to group the sequence
            The values to be yielded by the original data-source
            Used to compare grouping keys
            A function to extract the key for each element in hte original sequence.
            The data-source to be grouped
            This will force each unique grouping key to
            be buffered, but not the data itself
        
        
            
            Groups the elements of a sequence according to a specified key selector function
            and creates a result value from each group and its key. The elements of each
            group are projected by using a specified function.
            
            The return-type of the transform used to process the
            values within each grouping.
            The return-type of the transform used to group the sequence
            The values to be yielded by the original data-source
            A function to map each source element to an element in the appropriate group
            A function to extract the key for each element in hte original sequence.
            The data-source to be grouped
            This will force each unique grouping key to
            be buffered, but not the data itself
        
        
            
            Groups the elements of a sequence according to a specified key selector function
            and creates a result value from each group and its key.
            
            The return-type of the transform used to group the sequence
            The final values to be yielded after processing
            The values to be yielded by the original data-source
            A function to extract the key for each element in hte original sequence.
            A function to create a result value from each group.
            The data-source to be grouped
            This will force each unique grouping key to
            be buffered, but not the data itself
        
        
            
            Groups the elements of a sequence according to a specified key selector function
            and creates a result value from each group and its key. The elements of each
            group are projected by using a specified function.
            
            The return-type of the transform used to process the
            values within each grouping.
            The return-type of the transform used to group the sequence
            The values to be yielded by the original data-source
            Used to compare grouping keys
            A function to map each source element to an element in the appropriate group
            A function to extract the key for each element in hte original sequence.
            The data-source to be grouped
            This will force each unique grouping key to
            be buffered, but not the data itself
        
        
            
            Groups the elements of a sequence according to a specified key selector function
            and creates a result value from each group and its key. The elements of each
            group are projected by using a specified function.
            
            The return-type of the transform used to process the
            values within each grouping.
            The return-type of the transform used to group the sequence
            The final values to be yielded after processing
            The values to be yielded by the original data-source
            A function to map each source element to an element in the appropriate group
            A function to extract the key for each element in hte original sequence.
            A function to create a result value from each group.
            The data-source to be grouped
            This will force each unique grouping key to
            be buffered, but not the data itself
        
        
            
            Groups the elements of a sequence according to a specified key selector function
            and creates a result value from each group and its key.
            
            The return-type of the transform used to group the sequence
            The final values to be yielded after processing
            The values to be yielded by the original data-source
            Used to compare grouping keys
            A function to extract the key for each element in hte original sequence.
            A function to create a result value from each group.
            The data-source to be grouped
            This will force each unique grouping key to
            be buffered, but not the data itself
        
        
            
            Groups the elements of a sequence according to a specified key selector function
            and creates a result value from each group and its key. The elements of each
            group are projected by using a specified function.
            
            The return-type of the transform used to process the
            values within each grouping.
            The return-type of the transform used to group the sequence
            The final values to be yielded after processing
            The values to be yielded by the original data-source
            Used to compare grouping keys
            A function to map each source element to an element in the appropriate group
            A function to extract the key for each element in hte original sequence.
            A function to create a result value from each group.
            The data-source to be grouped
            This will force each unique grouping key to
            be buffered, but not the data itself
        
        
            
            Filters a data-producer based on a predicate on each value
            
            The data-producer to be filtered
            The condition to be satisfied
            A filtered data-producer; only matching values will raise the DataProduced event
        
        
            
            Filters a data-producer based on a predicate on each value; the index
            in the sequence is used in the predicate
            
            The data-producer to be filtered
            The condition to be satisfied
            A filtered data-producer; only matching values will raise the DataProduced event
        
        
            
            Returns a data-producer that yeilds the values from the sequence, or which yields the given
            singleton value if no data is produced.
            
            The default value to be yielded if no data is produced.
            The source data-producer.
        
        
            
            Returns a data-producer that yeilds the values from the sequence, or which yields the default
            value for the Type if no data is produced.
            
            The source data-producer.
        
        
            
            Returns a projection on the data-producer, using a transformation to
            map each element into a new form.
            
            The source type
            The projected type
            The source data-producer
            The transformation to apply to each element.
        
        
            
            Returns a projection on the data-producer, using a transformation
            (involving the elements's index in the sequence) to
            map each element into a new form.
            
            The source type
            The projected type
            The source data-producer
            The transformation to apply to each element.
        
        
            
            Returns a data-producer that will yield a specified number of
            contiguous elements from the start of a sequence - i.e.
            "the first <x> elements".
            
            The source data-producer
            The maximum number of elements to return
        
        
            
            Returns a data-producer that will ignore a specified number of
            contiguous elements from the start of a sequence, and yield
            all elements after this point - i.e. 
            "elements from index <x> onwards".
            
            The source data-producer
            The number of elements to ignore
        
        
            
            Returns a data-producer that will yield
            elements a sequence as long as a condition
            is satsified; when the condition fails for an element,
            that element and all subsequent elements are ignored.
            
            The source data-producer
            The condition to yield elements
        
        
            
            Returns a data-producer that will yield
            elements a sequence as long as a condition
            (involving the element's index in the sequence)
            is satsified; when the condition fails for an element,
            that element and all subsequent elements are ignored.
            
            The source data-producer
            The condition to yield elements        
        
        
            
            Returns a data-producer that will ignore the
            elements from the start of a sequence while a condition
            is satsified; when the condition fails for an element,
            that element and all subsequent elements are yielded.
            
            The source data-producer
            The condition to skip elements
        
        
            
            Returns a data-producer that will ignore the
            elements from the start of a sequence while a condition
            (involving the elements's index in the sequence)
            is satsified; when the condition fails for an element,
            that element and all subsequent elements are yielded.
            
            The source data-producer
            The condition to skip elements
        
        
            
            Returns a data-producer that yields the first instance of each unique
            value in the sequence; subsequent identical values are ignored.
            
            The data-producer
            This will force the first instance of each unique value to be buffered
        
        
            
            Returns a data-producer that yields the first instance of each unique
            value in the sequence; subsequent identical values are ignored.
            
            The data-producer
            Used to determine equaility between values
            This will force the first instance of each unique value to be buffered
        
        
            
            Reverses the order of a sequence
            
            The data-producer
            A data-producer that yields the sequence
            in the reverse order
            This will force all data to be buffered
        
        
            
            Further orders the values from an ordered data-source by a transform on each term, ascending
            (the sort operation is only applied once for the combined ordering)
            
            The original data-producer and ordering
            Returns the value (for each term) by which to order the sequence
            A data-producer that yeilds the sequence ordered
            by the selected value
            This will force all data to be buffered
        
        
            
            Further orders the values from an ordered data-source by a transform on each term, ascending
            (the sort operation is only applied once for the combined ordering)
            
            The original data-producer and ordering
            Returns the value (for each term) by which to order the sequence
            Comparer to compare the selected values
            A data-producer that yeilds the sequence ordered
            by the selected value
            This will force all data to be buffered
        
        
            
            Further orders the values from an ordered data-source by a transform on each term, descending
            (the sort operation is only applied once for the combined ordering)
            
            The original data-producer and ordering
            Returns the value (for each term) by which to order the sequence
            A data-producer that yeilds the sequence ordered
            by the selected value
            This will force all data to be buffered
        
        
            
            Further orders the values from an ordered data-source by a transform on each term, descending
            (the sort operation is only applied once for the combined ordering)
            
            The original data-producer and ordering
            Returns the value (for each term) by which to order the sequence
            Comparer to compare the selected values
            A data-producer that yeilds the sequence ordered
            by the selected value
            This will force all data to be buffered        
        
        
            
            Orders the values from a data-source by a transform on each term, ascending
            
            The original data-producer
            Returns the value (for each term) by which to order the sequence
            A data-producer that yeilds the sequence ordered
            by the selected value
            This will force all data to be buffered
        
        
            
            Orders the values from a data-source by a transform on each term, ascending
            
            The original data-producer
            Returns the value (for each term) by which to order the sequence
            Comparer to compare the selected values
            A data-producer that yeilds the sequence ordered
            by the selected value
            This will force all data to be buffered
        
        
            
            Orders the values from a data-source by a transform on each term, descending
            
            The original data-producer
            Returns the value (for each term) by which to order the sequence
            A data-producer that yeilds the sequence ordered
            by the selected value
            This will force all data to be buffered
        
        
            
            Orders the values from a data-source by a transform on each term, descending
            
            The original data-producer
            Returns the value (for each term) by which to order the sequence
            Comparer to compare the selected values
            A data-producer that yeilds the sequence ordered
            by the selected value
            This will force all data to be buffered
        
        
            
            Converts an IDataProducer into an IFuture[IEnumerable]. The results
            are buffered in memory (as a list), so be warned that this loses the "streaming"
            nature of most of the IDataProducer extension methods. The "future" nature of
            the result ensures that all results are produced before the enumeration can take
            place.
            
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into an IEnumerable. The results
            are buffered in memory (as a list), so be warned that this loses the "streaming"
            nature of most of the IDataProducer extension methods. The list is returned
            immediately, but further data productions add to it. You must therefore be careful
            when the list is used - it is a good idea to only use it after all data has been
            produced.
            
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a list. An empty list is returned immediately,
            and any results produced are added to it.
            
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a future array.
            
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a lookup.
            
            A transform function to produce a result element value from each element.
            A function to extract a key from each element.
            Used to compare keys.
            The data source.
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a lookup.
            
            A function to extract a key from each element.
            The data source.
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a lookup.
            
            A function to extract a key from each element.
            Used to compare keys.
            The data source.
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a lookup.
            
            A transform function to produce a result element value from each element.
            A function to extract a key from each element.
            The data source.
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a dictionary.
            
            A transform function to produce a result element value from each element.
            A function to extract a key from each element.
            Used to compare keys.
            The data source.
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a dictionary.
            
            A function to extract a key from each element.
            The data source.
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a dictionary.
            
            A function to extract a key from each element.
            Used to compare keys.
            The data source.
            This will force all values to be buffered
        
        
            
            Converts an IDataProducer into a dictionary.
            
            A transform function to produce a result element value from each element.
            A function to extract a key from each element.
            The data source.
            This will force all values to be buffered
        
        
            
            Returns a future to the sum of a sequence of values that are
            obtained by taking a transform of the input sequence
            
            Null values are removed from the sum
        
        
            
            Returns a future to the sum of a sequence of values
            
            Null values are removed from the sum
        
        
            
            Returns a future to the average of a sequence of values that are
            obtained by taking a transform of the input sequence
            
            Null values are removed from the average
        
        
            
            Returns a future to the average of a sequence of values
            
            Null values are removed from the average
        
        
            
            Returns a future to the average of a sequence of values
            
        
        
            
            Returns a future to the average of a sequence of values
            
            Null values are removed from the average
        
        
            
            Returns a future to the average of a sequence of values
            
        
        
            
            Returns a future to the average of a sequence of values
            
            Null values are removed from the average
        
        
            
            Returns a future to the average of a sequence of values that are
            obtained by taking a transform of the input sequence
            
        
        
            
            Returns a future to the average of a sequence of values that are
            obtained by taking a transform of the input sequence
            
            Null values are removed from the average
        
        
            
            Returns a future to the average of a sequence of values that are
            obtained by taking a transform of the input sequence
            
        
        
            
            Returns a future to the average of a sequence of values that are
            obtained by taking a transform of the input sequence
            
            Null values are removed from the average
        
        
            
            Returns a future to the maximum of a sequence of values that are
            obtained by taking a transform of the input sequence, using the default comparer, using the default comparer
            
            Null values are removed from the maximum
        
        
            
            Returns a future to the maximum of a sequence of values, using the default comparer
            
            Null values are removed from the maximum
        
        
            
            Returns a future to the minumum of a sequence of values that are
            obtained by taking a transform of the input sequence, using the default comparer
            
            Null values are removed from the minimum
        
        
            
            Returns a future to the minumum of a sequence of values, using the default comparer
            
            Null values are removed from the minimum
        
        
            
            Further extensions to IEnumerable{T}.
            
        
        
            
            Groups and executes a pipeline for a single result per group
            
        
        
            
            Groups and executes a pipeline for a single result per group
            
        
        
            
            Groups and executes a pipeline for two results per group
            
        
        
            
            Groups and executes a pipeline for two results per group
            
        
        
            
            Groups and executes a pipeline for three results per group
            
        
        
            
            Groups and executes a pipeline for three results per group
            
        
        
            
            Groups and executes a pipeline for four results per group
            
        
        
            
            Groups and executes a pipeline for four results per group
            
        
        
            
            Computes the sum of a sequence of values
            
            The values in the sequence must support the Add operator
        
        
            
            Computes the sum of the sequence of values that are
            obtained by invoking a transform function on each element of the input sequence.
            
            The values returned by the transform function must support the Add operator
        
        
            
            Computes the mean average of a sequence of values
            
            The values in the sequence must support the Add and Divide(Int32) operators
        
        
            
            Computes the mean average of the sequence of values that are
            obtained by invoking a transform function on each element of the input sequence.
            
            The values returned by the transform function must support the Add and Divide(Int32) operators
        
        
            
            Computes the maximum (using a custom comparer) of a sequence of values.
            
        
        
            
            Computes the maximum (using a custom comparer) of the sequence of values that are
            obtained by invoking a transform function on each element of the input sequence.
            
        
        
            
            Computes the minimum (using a custom comparer) of a sequence of values.
            
        
        
            
            Computes the minimum (using a custom comparer) of the sequence of values that are
            obtained by invoking a transform function on each element of the input sequence.
            
        
        
            
            Poor-man's version of a Future. This wraps a result which *will* be
            available in the future. It's up to the caller/provider to make sure
            that the value has been specified by the time it's requested.
            
        
        
            
            Class representing a value which will be available some time in the future.
            
        
        
            
            Retrieves the value, if available, and throws InvalidOperationException
            otherwise.
            
        
        
            
            Returns a string representation of the value if available, null otherwise
            
            A string representation of the value if available, null otherwise
        
        
            
            Returns the value of the future, once it has been set
            
            If the value is not yet available
        
        
            
            Implementation of IFuture which retrieves it value from a delegate.
            This is primarily used for FromFuture, which will transform another
            Future's value on demand.
            
        
        
            
            Creates a new FutureProxy using the given method
            to obtain the value when needed
            
        
        
            
            Creates a new FutureProxy from an existing future using
            the supplied transformation to obtain the value as needed
            
        
        
            
            Returns the value of the Future
            
        
        
            
            Ordered variant of IDataProducer; note that generally
            this will force data to be buffered until the sequence
            is complete.
            
            
        
        
            
            The unlerlying producer that can push data
            
        
        
            
            The comparer used to order the sequence (once complete)
            
        
        
            
            Generic tuple for a key and a single value
            
            The Type of the key
            The Type of the value
        
        
            
            Creates a new tuple with the given key and value
            
        
        
            
            The key for the tuple
            
        
        
            
            The value for the tuple
            
        
        
            
            Generic tuple for a key and a pair of values
            
            The Type of the key
            The Type of the first value
            The Type of the second value    
        
        
            
            Creates a new tuple with the given key and values
            
        
        
            
            The key for the tuple
            
        
        
            
            The first value
            
        
        
            
            The second value
            
        
        
            
            Generic tuple for a key and a trio of values
            
            The Type of the key
            The Type of the first value
            The Type of the second value
            The Type of the third value
        
        
            
            Creates a new tuple with the given key and values
            
        
        
            
            The key for the tuple
            
        
        
            
            The first value
            
        
        
            
            The second value
            
        
        
            
            The third value
            
        
        
            
            Generic tuple for a key and a quartet of values
            
            The Type of the key
            The Type of the first value
            The Type of the second value
            The Type of the third value
            The Type of the fourth value
        
        
            
            Creates a new tuple with the given key and values
            
        
        
            
            The key for the tuple
            
        
        
            
            The first value
            
        
        
            
            The second value
            
        
        
            
            The third value
            
        
        
            
            The fourth value
            
        
        
            
            Very simple implementation of IDataProducer.
            
            
        
        
            
            Signals a single item of data.
            
        
        
            
            Signals multiple items of data, one at a time, then ends.
            Note that this method only exists to support the params modifier.
            In every other way it's equivalent to the ProduceAndEnd(IEnumerable{T}).
            
        
        
            
            Signals multiple items of data, one at a time, then ends.
            
        
        
            
            Pumps the specified items into this data producer, yielding results
            as they are received. Before an item is pumped, an internal queue is
            created. Pumping an item may yield results at the other end of the pipeline
            - any such results are buffered in the queue. When the pumping of a particular
            item has finished, all results in the queue are yielded. This means that
            naturally streaming operations (projection and filtering) require only a single item
            buffer. This producer "ends" when all the items have been produced. If the result
            pipeline ends before all items have been pumped, the buffered results are yielded
            but no more items are pumped.
            
            Type of element in the result pipeline
            Items to insert into the pipeline
            The pipeline to subscribe to for items to yield
            A sequence of yielded items.
        
        
            
            Signal the end of data. This can only be called once, and
            afterwards the Produce method must not be called.
            
        
        
            
            Event which is raised when an item of data is produced.
            This will not be raised after EndOfData has been raised.
            The parameter for the event is the 
            
            
        
        
            
            Event which is raised when the sequence has finished being
            produced. This will be raised exactly once, and after all
            DataProduced events (if any) have been raised.
            
            
        
        
            
            A DataProducer with ordering capabilities
            Note that this may cause data to be buffered
            
        
        
            
            Create a new OrderedDataProducer
            
            The base source which will supply data
            The comparer to use when sorting the data (once complete)
        
        
            
            Encapsulates a reference compatible with the type parameter. The reference
            is guaranteed to be non-null unless the value has been created with the
            parameterless constructor (e.g. as the default value of a field or array).
            Implicit conversions are available to and from the type parameter. The
            conversion to the non-nullable type will throw ArgumentNullException
            when presented with a null reference. The conversion from the non-nullable
            type will throw NullReferenceException if it contains a null reference.
            This type is a value type (to avoid taking any extra space) and as the CLR
            unfortunately has no knowledge of it, it will be boxed as any other value
            type. The conversions are also available through the Value property and the
            parameterised constructor.
            
            Type of non-nullable reference to encapsulate
        
        
            
            Creates a non-nullable value encapsulating the specified reference.
            
        
        
            
            Implicit conversion from the specified reference.
            
        
        
            
            Implicit conversion to the type parameter from the encapsulated value.
            
        
        
            
            Equality operator, which performs an identity comparison on the encapuslated
            references. No exception is thrown even if the references are null.
            
        
        
            
            Inequality operator, which performs an identity comparison on the encapuslated
            references. No exception is thrown even if the references are null.
            
        
        
            
            Equality is deferred to encapsulated references, but there is no equality
            between a NonNullable[T] and a T. This method never throws an exception,
            even if a null reference is encapsulated.
            
        
        
            
            Type-safe (and non-boxing) equality check.
            
        
        
            
            Type-safe (and non-boxing) static equality check.
            
        
        
            
            Defers to the GetHashCode implementation of the encapsulated reference, or 0 if
            the reference is null.
            
        
        
            
            Defers to the ToString implementation of the encapsulated reference, or an
            empty string if the reference is null.
            
        
        
            
            Retrieves the encapsulated value, or throws a NullReferenceException if
            this instance was created with the parameterless constructor or by default.
            
        
        
            
            The Operator class provides easy access to the standard operators
            (addition, etc) for generic types, using type inference to simplify
            usage.
            
        
        
            
            Indicates if the supplied value is non-null,
            for reference-types or Nullable<T>
            
            True for non-null values, else false
        
        
            
            Increments the accumulator only
            if the value is non-null. If the accumulator
            is null, then the accumulator is given the new
            value; otherwise the accumulator and value
            are added.
            
            The current total to be incremented (can be null)
            The value to be tested and added to the accumulator
            True if the value is non-null, else false - i.e.
            "has the accumulator been updated?"
        
        
            
            Evaluates unary negation (-) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates bitwise not (~) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates bitwise or (|) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates bitwise and (&) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates bitwise xor (^) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Performs a conversion between the given types; this will throw
            an InvalidOperationException if the type T does not provide a suitable cast, or for
            Nullable<TInner> if TInner does not provide this cast.
            
        
        
            
            Evaluates binary addition (+) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
                    
        
        
            
            Evaluates binary addition (+) for the given type(s); this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary subtraction (-) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary subtraction(-) for the given type(s); this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary multiplication (*) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary multiplication (*) for the given type(s); this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary division (/) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary division (/) for the given type(s); this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary equality (==) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary inequality (!=) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary greater-than (>) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary less-than (<) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary greater-than-on-eqauls (>=) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates binary less-than-or-equal (<=) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Evaluates integer division (/) for the given type; this will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
            This operation is particularly useful for computing averages and
            similar aggregates.
            
        
        
            
            Provides standard operators (such as addition) that operate over operands of
            different types. For operators, the return type is assumed to match the first
            operand.
            
            
            
        
        
            
            Returns a delegate to convert a value between two types; this delegate will throw
            an InvalidOperationException if the type T does not provide a suitable cast, or for
            Nullable<TInner> if TInner does not provide this cast.
            
        
        
            
            Returns a delegate to evaluate binary addition (+) for the given types; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary subtraction (-) for the given types; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary multiplication (*) for the given types; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary division (/) for the given types; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Provides standard operators (such as addition) over a single type
            
            
            
        
        
            
            Returns the zero value for value-types (even full Nullable<TInner>) - or null for reference types
            
        
        
            
            Returns a delegate to evaluate unary negation (-) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate bitwise not (~) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate bitwise or (|) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate bitwise and (&) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate bitwise xor (^) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary addition (+) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary subtraction (-) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary multiplication (*) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary division (/) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary equality (==) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary inequality (!=) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary greater-then (>) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary less-than (<) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary greater-than-or-equal (>=) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Returns a delegate to evaluate binary less-than-or-equal (<=) for the given type; this delegate will throw
            an InvalidOperationException if the type T does not provide this operator, or for
            Nullable<TInner> if TInner does not provide this operator.
            
        
        
            
            Class to provide partial comparisons, which can be useful when
            implementing full comparisons in other classes.
            
        
        
            
            Provides comparisons for just the references, returning 0
            if the arguments are the same reference, -1 if just the first is null,
            and 1 if just the second is null. Otherwise, this method returns null.
            It can be used to make life easier for an initial comparison 
            before comparing individual components of an object.
            
            The type of objects to compare
            The first object to compare
            The second object to compare
        
        
            
            Compares two instances of T using the default comparer for T,
            returning a non-null value in the case of inequality, or null 
            where the default comparer would return 0. This aids chained 
            comparisons (where if the first values are equal, you move 
            on to the next ones) if you use the null coalescing operator.
            
            The type of objects to compare
            The first object to compare
            The second object to compare
        
        
            
            Compares two instances of T using the specified comparer for T,
            returning a non-null value in the case of inequality, or null 
            where the comparer would return 0. This aids chained 
            comparisons (where if the first values are equal, you move 
            on to the next ones) if you use the null coalescing operator.
            
            The type of objects to compare
            The comparer to use
            The first object to compare
            The second object to compare
        
        
            
            Compares two instances of T, returning true if they are definitely
            the same (i.e. the same references), false if exactly one reference is
            null, or null otherwise. This aids implementing equality operations.
            
            The type of objects to compare
            The first object to compare
            The second object to compare
        
        
            
            Generic class which copies to its target type from a source
            type specified in the Copy method. The types are specified
            separately to take advantage of type inference on generic
            method arguments.
            
        
        
            
            Copies all readable properties from the source to a new instance
            of TTarget.
            
        
        
            
            Static class to efficiently store the compiled delegate which can
            do the copying. We need a bit of work to ensure that exceptions are
            appropriately propagated, as the exception is generated at type initialization
            time, but we wish it to be thrown as an ArgumentException.
            
        
        
            
            Thread-safe equivalent of System.Random, using just static methods.
            If all you want is a source of random numbers, this is an easy class to
            use. If you need to specify your own seeds (eg for reproducible sequences
            of numbers), use System.Random.
            
        
        
            
            Returns a nonnegative random number. 
            		
            A 32-bit signed integer greater than or equal to zero and less than Int32.MaxValue.
        
        
            
            Returns a nonnegative random number less than the specified maximum. 
            
            
            A 32-bit signed integer greater than or equal to zero, and less than maxValue; 
            that is, the range of return values includes zero but not maxValue.
            
            maxValue is less than zero.
        
        
            
            Returns a random number within a specified range. 
            
            The inclusive lower bound of the random number returned. 
            
            The exclusive upper bound of the random number returned. 
            maxValue must be greater than or equal to minValue.
            
            
            A 32-bit signed integer greater than or equal to minValue and less than maxValue;
            that is, the range of return values includes minValue but not maxValue.
            If minValue equals maxValue, minValue is returned.
            
            minValue is greater than maxValue.
        
        
            
            Returns a random number between 0.0 and 1.0.
            
            A double-precision floating point number greater than or equal to 0.0, and less than 1.0.
        
        
            
            Fills the elements of a specified array of bytes with random numbers.
            
            An array of bytes to contain random numbers.
            buffer is a null reference (Nothing in Visual Basic).
        
        
            
            Utility class providing a number of singleton instances of
            Range<char> to indicate the various ranges of unicode characters,
            as documented at http://msdn.microsoft.com/en-us/library/20bw873z.aspx.
            Note that this does not indicate the Unicode category of a character,
            merely which range it's in.
            TODO: Work out how to include names. Can't derive from Range[char].
            
        
        
            
            Returns the unicode range containing the specified character.
            
            Character to look for
            The unicode range containing the specified character, or null if the character
            is not in a unicode range.
        
        
            
            String of UTF-32 characters (ints). This class is immutable, and so is thread-safe
            after copying, but copies must be originally made in a thread-safe manner so as
            to avoid seeing invalid data.
            
        
        
            
            Number of samples to take (at most) to form a hash code.
            
        
        
            
            An empty UTF-32 string.
            
        
        
            
            UTF-32 characters making up the string.
            
        
        
            
            Returns whether or not an integer value is a valid
            UTF-32 character, that is, whether it is non-negative
            and less than or equal to 0x10ffff.
            
            The value to test.
            Whether or not the given value is a valid UTF-32 character.
        
        
            
            Used inside this class to construct extra strings quickly, when validation
            isn't required and a reference copy is good enough.
            
        
        
            
            Creates a UTF-32 string from an array of integers, all of which must
            be less than 0x10ffff and non-negative. A copy of the array is taken so that
            further changes to the array afterwards are ignored.
            
            The array of characters to copy. Must not be null.
        
        
            
            Creates a UTF-32 string from a System.String (UTF-16), converting surrogates
            where they are present.
            
            The string in UTF-16 format.
        
        
            
            Takes a substring of this string, starting at the given index.
            
            Starting index of desired substring in this string
            A substring of this string
        
        
            
            Takes a substring of this string, starting at the given index
            and containing the given number of characters.
            
            Starting index of desired substring in this string
            The number of characters in the desired substring
            A substring of this string
        
        
            
            Finds the index of another Utf32String within this one.
            
            Value to find
            The index of value within this string, or -1 if it isn't found
        
        
            
            Finds the index of another Utf32String within this one,
            starting at the specified position.
            
            Value to find
            First position to consider when finding value within this Utf32String
            The index of value within this string, or -1 if it isn't found
        
        
            
            Finds the index of another Utf32String within this one,
            starting at the specified position and considering the
            specified number of positions.
            
            Value to find
            First position to consider when finding value within this Utf32String
            Number of positions to consider
            The index of value within this string, or -1 if it isn't found
        
        
            
            Finds the first index of the specified character within this string.
            
            Character to find
            The index of the first occurrence of the specified character, or -1
            if it is not found.
        
        
            
            Finds the first index of the specified character within this string, starting
            at the specified position.
            
            Character to find
            First position to consider
            The index of the first occurrence of the specified character, or -1
            if it is not found.
        
        
            
            Finds the first index of the specified character within this string, starting
            at the specified position and considering the specified number of positions.
            
            Character to find
            First position to consider
            Number of positions to consider
            The index of the first occurrence of the specified character, or -1
            if it is not found.
        
        
            
            Compares two UTF-32 strings (in a culture-insensitive manner) for equality.
            
            The other string to compare this one to.
            Whether or not this string is equal to the other one.
        
        
            
            Compares one string with another for equality.
            
            The first string to compare
            The second string to compare
            true if the strings are equivalent; false otherwise
        
        
            
            Compares the two specified strings.
            
            The first string to compare
            The second string to compare
            0 if both strings are null or they are equal; a negative number if strA is null or
            is lexicographically before strB; a positive number otherwise
        
        
            
            Concatenates an array of strings together.
            
            The array of strings to concatenate.
            
        
        
            
            Returns a concatenation of the given strings.
            
            The first string
            The second string
            A string consisting of the first string followed by the second
        
        
            
            Returns a concatenation of the given strings.
            
            The first string
            The second string
            The third string
            
            A string consisting of the first string 
            followed by the second, followed by the third
            
        
        
            
            Returns a concatenation of the given strings.
            
            The first string
            The second string
            The third string
            The fourth string
            
            A string consisting of the first string 
            followed by the second, followed by the third,
            followed by the fourth
            
        
        
            
            Copies the UTF-32 characters in this string to an int array.
            
            An array of integers representing the characters in this array.
        
        
            
            Converts the UTF-32 string into a UTF-16 string, 
            creating surrogates if necessary.
            
            
            A UTF-16 string (System.String) representing the same 
            character data as this UTF-32 string.
            
        
        
            
            Returns whether or not this UTF-32 string is equal to another object.
            
            The object to compare this UTF-32 string to.
            Whether or not this object is equal to the other one.
        
        
            
            Returns a hashcode formed from sampling some of the characters in this
            UTF-32 string. This gives a good balance between performance and hash
            collisions.
            
            A hashcode for this UTF-32 string.
        
        
            
            Returns a concatenation of the given strings.
            
            The first string
            The second string
            A string consisting of the first string followed by the second
        
        
            
            Determines whether two specified String objects have the same value.
            
            A string or a null reference
            A string or a null reference
            true if the value of strA is the same as the value of strB; otherwise, false
        
        
            
            Determines whether two specified String objects have different values.
            
            A string or a null reference
            A string or a null reference
            true if the value of strA is different from the value of strB; otherwise, false
        
        
            
            Enumerates the characters in the string.
            
            The enumerator for 
        
        
            
            Compares this string to another Utf32String.
            
            The other Utf32String to compare this string to.
            
            <0 if this string <> obj; 0 if this==object; >0 if this string > obj, 
            with the relation defines in a culture-insensitive way in lexicographic order.
            
        
        
            
            Creates a shallow copy of this string.
            
            A shallow copy of this string.
        
        
            
            The number of UTF-32 characters in this string.
            
        
        
            
            The character at the specified index.
            
        
        
            
            A thread pool implementation which allows policy decisions
            for the number of threads to run, etc, to be programatically set.
            
            
            Each instance runs with entirely separate threads, so one thread pool
            cannot "starve" another one of threads, although having lots of threads
            running may mean that some threads are starved of processor time.
            If the values for properties such as MinThreads, IdlePeriod etc are changed
            after threads have been started, it may take some time before their effects
            are noticed. For instance, reducing the idle time from 5 minutes to 1 minute
            will not prevent a thread which had only just started to idle from waiting
            for 5 minutes before dying. Any exceptions thrown in the work item itself
            are handled by the WorkerException event, but all other exceptions are
            propagated to the AppDomain's UnhandledException event. This includes
            exceptions thrown by the BeforeWorkItem and AfterWorkItem events.
            This class is thread-safe - any thread may call any method on any instance of it.
            
        
        
            
            Default idle period for new pools
            
        
        
            
            Default min threads for new pools
            
        
        
            
            Default max threads for new pools
            
        
        
            
            If the idle period is short but we have less than the
            minimum number of threads, idle for this long instead,
            so as to avoid tight-looping. We don't enforce this
            minimum if the thread will die if it idles for its IdlePeriod.
            
        
        
            
            If the idle period is long (or infinite) then we shouldn't
            actually wait that long, just in case the timeout etc changes.
            
        
        
            
            Lock around all static members.
            
        
        
            
            Total number of instances created
            
        
        
            
            Creates a new thread pool with an autogenerated name.
            
        
        
            
            Creates a new thread pool with the specified name
            
            The name of the new thread pool
        
        
            
            Lock around access to all state other than events and the queue.
            The queue lock may be acquired within this lock.
            
        
        
            
            Lock for the queue itself. The state lock must not be acquired within
            this lock unless it is already held by the thread.
            
        
        
            
            The queue itself.
            
        
        
            
            The number of threads started (in total) by this threadpool.
            Used for naming threads.
            
        
        
            
            Sets both the minimum and maximum number of threads, atomically. This prevents
            exceptions which might occur when setting properties individually (e.g. going
            from (min=5, max=10) to (min=15, max=20), if the minimum were changed first,
            an exception would occur.
            
        
        
            
            Lock around all access to events.
            
        
        
            
            Raises the WorkerException event.
            TODO: Write to the event log if no exception handlers are attached?
            
        
        
            
            Delegate for the BeforeWorkItem event.
            
        
        
            
            Raises the BeforeWorkItem event
            
            The work item which is about to execute
            Whether or not the work item was cancelled by an event handler
        
        
            
            Delegate for the AfterWorkItem event.
            
        
        
            
            Raises the AfterWorkItem event
            
        
        
            
            Delegate for the ThreadExit event.
            
        
        
            
            Raises the WorkerThreadExit event and decrements the number of total worker threads
            
        
        
            
            Ensures that the pool has at least the minimum number of threads.
            
        
        
            
            Adds a work item to the queue, starting a new thread if appropriate.
            
            The delegate representing the work item
            The parameters to pass to the delegate
        
        
            
            Adds a work item to the queue, starting a new thread if appropriate.
            
            The delegate representing the work item.
        
        
            
            Adds a work item to the queue and potentially start a new thread.
            A thread is started if there are no idle threads or if there is already
            something on the queue - but in each case, only if the total number of
            threads is less than the maximum.
            
            The actual work item to add to the queue.
        
        
            
            Cancels the first work item with the specified ID, if there is one.
            Note that items which have been taken off the queue and are running
            or about to be started cannot be cancelled.
            
            The ID of the work item to cancel
        
        
            
            Cancels all work items in the queue.
            Note that items which have been taken off the queue and are running
            or about to be started cannot be cancelled.
            
        
        
            
            Starts a new worker thread.
            
        
        
            
            Main worker thread loop. This picks jobs off the queue and executes
            them, until it's time to die.
            
        
        
            
            Work out how long to wait for in this iteration. If the thread isn't going
            to die even if the wait completes, make the idle timeout at least MinWaitPeriod
            so we don't end up with lots of threads stealing CPU by checking too often.
            
            The time this thread last finished executing a work item.
            
        
        
            
            Retrieves the next work item from the queue, pausing for at most
            the specified amount of time.
            
            
            The maximum amount of time to wait for a work item to arrive, in ms.
            
            
            The next work item, or null if there aren't any after waiting
            for the specified period.
            
        
        
            
            Checks whether or not this thread should exit, based on the current number
            of threads and the time that this thread last finished executing a work item.
            
            The time this thread last finished executing a work item.
            Whether or not the thread is "spare" and should thus quit
        
        
            
            Executes the given work item, firing the BeforeWorkItem and AfterWorkItem events,
            and incrementing and decrementing the number of working threads.
            
            The work item to execute
        
        
            
            How long a thread may be remain idle for before dying, in ms.
            Note that a thread will not die if doing so would
            reduce the number of threads below MinThreads. A value of 0 here
            indicates that threads should not idle at all (except if the number
            of threads would otherwise fall below MinThreads). A value of
            Timeout.Infinite indicates that a thread will idle until a new work item
            is added, however long that is.
            
        
        
            
            Gets the name of the thread pool.
            This is used to set the name of any new threads created by the pool.
            
        
        
            
            The minimum number of threads to leave in the pool. Note that
            the pool may contain fewer threads than this until work items
            have been placed on the queue. A call to StartMinThreads
            will make sure that at least MinThreads threads have been started.
            This value must be non-negative. Note that a MinThreads value of 0
            introduces a possible (although very unlikely) race condition where
            a work item may be added to the queue just as the last thread decides
            to exit. In this case, the work item would not be executed until the
            next work item was added.
            TODO: Try to remove this race condition
            
        
        
            
            The maximum number of threads to allow to be in the pool at any
            one time. This value must be greater than or equal to 1.
            
        
        
            
            The number of work items currently awaiting execution.
            This does not include work items currently being executed.
            
        
        
            
            The number of threads currently executing work items
            or BeforeWorkItem/AfterWorkItem/WorkerException events.
            
        
        
            
            The total number of threads in the pool at the present time.
            
        
        
            
            The priority of worker threads. Each thread's priority is set
            before the BeforeWorkItem event and after the AfterWorkItem event.
            The priority of an individual thread may be changed in 
            the BeforeWorkItem event, and that changed priority
            will remain active for the duration of the work item itself.
            The default is ThreadPriority.Normal.
            
        
        
            
            Whether or not worker threads should be created and
            set as background threads. This is set for the thread before
            the BeforeWorkItem event and after the AfterWorkItem event.
            The background status of a thread may be changed in the BeforeWorkItem
            event, and that changed status will remain active for the duration
            of the work item itself. Default is true.
            
        
        
            
            Event which is fired if a worker thread throws an exception in
            its work item.
            
        
        
            
            Event fired before a worker thread starts a work item.
            
        
        
            
            Event fired after a worker thread successfully finishes a work item.
            This event is not fired if the work item throws an exception.
            
        
        
            
            Event called just before a thread dies.
            
        
        
            
            Comparer which compares an integer priority with the priority of a work item.
            Must only be used in the appropriate order (CompareTo(int, WorkItem)). Also,
            0 is never returned by the method - effectively, the given priority is raised by
            0.5, so that when a binary search is used, the value is never found but the returned
            index is always the bitwise complement of the correct insertion point.
            
        
        
            
            Access to single instance of PriorityComparer.
            
        
        
            
            Private constructor to prevent instantiation
            
        
        
            
            Implementation of IComparer.Compare - see class remarks for details.
            
        
        
            
            Delegate for handling exceptions.
            
        
        
            
            Delegate for handling exceptions thrown by work items executing
            in a custom thread pool.
            
            The pool which created the worker thread
            The work item which threw the exception
            The exception thrown
            
            Whether or not the exception has been handled by this delegate. The value
            of this parameter will be false on entry, and changing it to true will
            prevent any further delegates in the event from being executed.
            
        
        
            
            Delegate for handling the event that a thread is about to execute
            a work item.
            
            The pool which created the worker thread
            The work item which is about to execute
            
            Whether or not the work item should be cancelled. The value
            of this parameter will be false on entry, and changing it to true will
            prevent any further delegates in the event from being executed, and
            prevent the work item itself from being executed.
            
        
        
            
            Delegate for handling the event that a thread has executed a work item.
            
            The pool which created the worker thread
            The work item which has executed
        
        
            
            Delegate for handling the event that a thread has changed state
            (e.g. it's about to execute a work item, it's just executed one, etc).
            Also used for requests for a thread to change state (e.g. if a stop
            request has been received).
            
        
        
            
            Represents the method that is executed by a ThreadController.
            
        
        
            
            Exception thrown when a Lock method on the SyncLock class times out.
            
        
        
            
            Constructs an instance with the specified message.
            
            The message for the exception
        
        
            
            Constructs an instance by formatting the specified message with
            the given parameters.
            
            The message, which will be formatted with the parameters.
            The parameters to use for formatting.
        
        
            
            Exception thrown when a Lock method on the SyncLock class times out.
            
        
        
            
            Constructs an instance with the specified message.
            
            The message for the exception
        
        
            
            Constructs an instance by formatting the specified message with
            the given parameters.
            
            The message, which will be formatted with the parameters.
            The parameters to use for formatting.
        
        
            
            A lock token returned by a Lock method call on a SyncLock.
            This effectively holds the lock until it is disposed - a 
            slight violation of the IDisposable contract, but it makes
            for easy use of the SyncLock system. This type itself
            is not thread-safe - LockTokens should not be shared between
            threads.
            
        
        
            
            The lock this token has been created by.
            
        
        
            
            Constructs a new lock token for the specified lock.
            
            The internal monitor used for locking.
        
        
            
            Releases the lock. Subsequent calls to this method do nothing.
            
        
        
            
            Class used for locking, as an alternative to just locking on normal monitors.
            Allows for timeouts when locking, and each Lock method returns a token which
            must then be disposed of to release the internal monitor (i.e. to unlock).
            All properties and methods of this class are thread-safe.
            
        
        
            
            Class used for locking, as an alternative to just locking on normal monitors.
            Allows for timeouts when locking, and each Lock method returns a token which
            must then be disposed of to release the internal monitor (i.e. to unlock).
            All properties and methods of this class are thread-safe.
            
        
        
            
            Lock for static mutable properties.
            
        
        
            
            The default timeout for new instances of this class
            where the default timeout isn't otherwise specified.
            Defaults to Timeout.Infinite.
            
        
        
            
            Creates a new lock with no name, and the default timeout specified by DefaultDefaultTimeout.
            
        
        
            
            Creates a new lock with the specified name, and the default timeout specified by
            DefaultDefaultTimeout.
            
            The name of the new lock
        
        
            
            Creates a new lock with no name, and the specified default timeout
            
            Default timeout, in milliseconds
        
        
            
            Creates a new lock with the specified name, and an
            infinite default timeout.
            
            The name of the new lock
            
            Default timeout, in milliseconds. Use Timeout.Infinite
            for an infinite timeout, or a non-negative number otherwise.
            
        
        
            
            Locks the monitor, with the default timeout.
            
            A lock token which should be disposed to release the lock
            The operation times out.
        
        
            
            Locks the monitor, with the specified timeout.
            
            The timeout duration. When converted to milliseconds, 
            must be Timeout.Infinite, or non-negative.
            A lock token which should be disposed to release the lock
            The operation times out.
        
        
            
            Locks the monitor, with the specified timeout. Derived classes may override
            this method to change the behaviour; the other calls to Lock all result in
            a call to this method. This implementation checks the validity of the timeout,
            calls Monitor.TryEnter (throwing an exception if appropriate) and returns a
            new LockToken.
            
            The timeout, in milliseconds. Must be Timeout.Infinite,
            or non-negative.
            A lock token which should be disposed to release the lock
            The operation times out.
        
        
            
            Unlocks the monitor. This method may be overridden in derived classes
            to change the behaviour. This implementation simply calls Monitor.Exit.
            
        
        
            
            The default timeout for the 
            
        
        
            
            The name of this lock.
            
        
        
            
            The internal monitor used for locking. While this
            is owned by the thread, it can be used for waiting
            and pulsing in the usual way. Note that manually entering/exiting
            this monitor could result in the lock malfunctioning.
            
        
        
            
            Lock count (incremented with Lock, decremented with Unlock).
            
        
        
            
            Creates a new lock with no name, and the default timeout specified by DefaultDefaultTimeout.
            
        
        
            
            Creates a new lock with the specified name, and the default timeout specified by
            DefaultDefaultTimeout.
            
            The name of the new lock
        
        
            
            Creates a new lock with no name, and the specified default timeout
            
            Default timeout, in milliseconds
        
        
            
            Creates a new lock with the specified name, and an
            infinite default timeout.
            
            The name of the new lock
            
            Default timeout, in milliseconds. Use Timeout.Infinite
            for an infinite timeout, or a non-negative number otherwise.
            
        
        
            
            Sets the "inner" lock for this lock, returning this lock. This
            is a convenience method for setting InnerLock as part of a variable
            declaration.
            
            
            OrderedLock inner = new OrderedLock();
            OrderedLock outer = new OrderedLock().SetInnerLock(inner);
            
            The inner 
            This lock is returned.
        
        
            
            Locks the monitor, with the specified timeout. This implementation validates
            the ordering of locks, and maintains the current owner.
            
            The timeout, in milliseconds. Must be Timeout.Infinite,
            or non-negative.
            A lock token which should be disposed to release the lock
            The operation times out.
            
            The lock order would be violated if this lock were taken out. (i.e. attempting
            to acquire the lock could cause deadlock.)
            
        
        
            
            Unlocks the monitor, decreasing the count and setting the owner to null
            if the count becomes 0.
            
        
        
            
            The current owner of the lock, if any.
            
        
        
            
            Gets or sets the "inner" lock for this lock. This lock must not be acquired
            after the inner one, unless it has already been acquired previously.
            Inner locks are transitive - if A has an inner lock B, and B has
            an inner lock C, then C is also effectively an inner lock of A.
            If this property to null, this lock is considered not to have an inner lock.
            
        
        
            
            Class designed to control a worker thread (co-operatively).
            
        
        
            
            Lock used throughout for all state management.
            (This is unrelated to the "state" variable.)
            
        
        
            
            The delegate to be invoked when the thread is started.
            
        
        
            
            State to pass to the "starter" delegate when the thread is started.
            This reference is discarded when the new thread is started, so
            it won't prevent garbage collection.
            
        
        
            
            Creates a new controller.
            
            The delegate to invoke when the thread is started.
            Must not be null.
            The state to pass to the delegate. May be null.
        
        
            
            Creates a new controller without specifying a state object to
            pass when the delegate is invoked.
            
            The delegate to invoke when the thread is started.
        
        
            
            Creates the thread to later be started. This enables
            properties of the thread to be manipulated before the thread
            is started.
            
            The thread has already been created.
        
        
            
            Starts the task in a separate thread, creating it if it hasn't already been
            created with the CreateThread method.
            
            The thread has already been started.
        
        
            
            Tell the thread being controlled by this controller to stop. 
            This call does not throw an exception if the thread hasn't been 
            created, or has already been told to stop - it is therefore safe 
            to call at any time, regardless of other information about the 
            state of the controller. Depending on the way in which the controlled
            thread is running, it may not take notice of the request to stop
            for some time.
            
        
        
            
            Runs the task specified by starter, catching exceptions and propagating them
            to the Exception event.
            
        
        
            
            Whether the thread has been started. A thread can only
            be started once.
            
        
        
            
            Thread being controlled. May be null if it hasn't
            been created yet.
            
        
        
            
            Whether or not the thread is stopping. This may be used
            by the thread itself to test whether or not to stop, as
            well as by clients checking status. To see whether the
            thread has actually finished or not, use the IsAlive
            property of the thread itself.
            
        
        
            
            Event raised if the controlled thread throws an unhandled exception.
            The exception is not propagated beyond the controller by default, however
            by adding an ExceptionHandler which simply rethrows the exception,
            it will propagate. Note that in this case any further ExceptionHandlers
            added after the propagating one will not be executed. This event is
            raised in the worker thread.
            
        
        
            
            Event raised when the thread has finished and all exception handlers
            have executed (if an exception was raised). Note that this event is
            raised even if one of the exception handlers propagates the exception
            up to the top level. This event is raised in the worker thread.
            
        
        
            
            Event raised when a stop is requested. Worker threads
            may register for this event to allow them to respond to
            stop requests in a timely manner. The event is raised
            in the thread which calls the Stop method.
            
        
        
            
            Class encapsulating an item of work to be executed in a CustomThreadPool.
            
        
        
            
            Creates a new instance of this class.
            
            The ID of the work item. May be null.
            
            Whether or not the parameter array should be preserved during the work item's
            execution to allow the information to be retrieved in the WorkerException and
            AfterWorkItem events.
            
            
            Whether or not the parameter array provided should be cloned. This should be
            true if the contents of the passed array will be changed by the caller afterwards,
            but false in the common case of creating the array solely for the purpose of
            constructing this work item. Note that the values within the array are not cloned
            - just the array itself.
            
            The priority of this work item.
            
            The delegate to run when the work item is executed. Must not be null.
            
            
            The parameters to pass to the target delegate. May be null if the delegate
            takes no parameters.
            
        
        
            
            Creates a new work item with the given target delegate and parameters.
            The parameters (if any) are cloned on construction and preserved during
            the work item's execution. The ID of the constructed work item is null,
            and the priority is 0.
            
            
            The delegate to run when the work item is executed. Must not be null.
            
            
            The parameters to pass to the target delegate. May be null if the delegate
            takes no parameters.
            
        
        
            
            Invokes the work item.
            
        
        
            
            The target delegate for the work item. This is the delegate
            which is run when the work item is executed.
            
        
        
            
            The parameters passed to the delegate. This may be null,
            and will definitely be null if PreserveParameters is false
            and the work item has started executing. The contents of
            the returned array should not be changed.
            
        
        
            
            The priority of this work item compared with others. Note
            that this is entirely independent of the thread priority - it
            serves only to specify the order of execution of a work item.
            Items with a higher priority are added ahead of items with a lower
            priority in the queue.
            
        
        
            
            Whether or not to preserve parameters during and after
            execution. If this is true, the parameters are available in
            the AfterWorkItem and WorkerException events of the containing
            CustomThreadPool. However, this means that the contents cannot 
            be garbage collected until after the work item has finished
            executing, which may be costly in some situations.
            
        
        
            
            The ID of the work item, which may be null. This is provided
            by the caller when the work item is constructed, and is used
            for cancellation purposes.
            
        
        
            
            Extensions to System.Object for LINQ to XML purposes.
            
        
        
            
            Returns the properties of the given object as XElements.
            Properties with null values are still returned, but as empty
            elements. Underscores in property names are replaces with hyphens.
            
        
        
            
            Returns the properties of the given object as XElements.
            Properties with null values are returned as empty attributes.
            Underscores in property names are replaces with hyphens.