//------------------------------------------------------------------------------
//      Copyright (c) 2002 Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------------------------

// Capture is just a location/length pair that indicates the
// location of a regular expression match. A single regexp
// search may return multiple Capture within each capturing
// RegexGroup.
//

namespace System.Text.RegularExpressions
{

    //| <include file='doc\RegexCapture.uex' path='docs/doc[@for="Capture"]/*' />
    /// <devdoc>
    ///    <para> 
    ///       Represents the results from a single subexpression capture. The object represents
    ///       one substring for a single successful capture.</para>
    /// </devdoc>
    //[ Serializable() ] 
    public class Capture {
        internal String _text;
        internal int _index;
        internal int _length;

        internal Capture(String text, int i, int l) {
            _text = text;
            _index = i;
            _length = l;
        }

        // The index of the beginning of the matched capture
        //| <include file='doc\RegexCapture.uex' path='docs/doc[@for="Capture.Index"]/*' />
        /// <devdoc>
        ///    <para>Returns the position in the original string where the first character of
        ///       captured substring was found.</para>
        /// </devdoc>
        public int Index {
            get {
                return _index;
            }
        }

        // The length of the matched capture
        //| <include file='doc\RegexCapture.uex' path='docs/doc[@for="Capture.Length"]/*' />
        /// <devdoc>
        ///    <para>
        ///       Returns the length of the captured substring.
        ///    </para>
        /// </devdoc>
        public int Length {
            get {
                return _length;
            }
        }

        //| <include file='doc\RegexCapture.uex' path='docs/doc[@for="Capture.Value"]/*' />
        /// <devdoc>
        ///    <para>[To be supplied.]</para>
        /// </devdoc>
        public string Value {
            get {
                return _text.Substring(_index, _length);
            }
        }

        // The capture as a string
        //| <include file='doc\RegexCapture.uex' path='docs/doc[@for="Capture.ToString"]/*' />
        /// <devdoc>
        ///    <para>
        ///       Returns 
        ///          the substring that was matched.
        ///       </para>
        ///    </devdoc>
        override public String ToString() {
            return Value;
        }

        // The original string
        internal String GetOriginalString() {
            return _text;
        }

        // The substring to the left of the capture
        internal String GetLeftSubstring() {
            return _text.Substring(0, _index);
        }

        // The substring to the right of the capture
        internal String GetRightSubstring() {
            return _text.Substring(_index + _length, _text.Length - _index - _length);
        }

#if DBG
        internal virtual String Description() {
            StringBuilder Sb = new StringBuilder();

            Sb.Append("(I = ");
            Sb.Append(_index);
            Sb.Append(", L = ");
            Sb.Append(_length);
            Sb.Append("): ");
            Sb.Append(_text, _index, _length);

            return Sb.ToString();
        }
#endif
    }



}
