/// <summary>
 /// Method called when current segment is full, to allocate new
 /// segment.
 /// </summary>
 private void expand(int minNewSegmentSize)
 {
     // First, let's move current segment to segment list:
     if (_segments == null)
     {
         _segments = new Sharpen.AList<char[]>();
     }
     char[] curr = _currentSegment;
     _hasSegments = true;
     _segments.Add(curr);
     _segmentSize += curr.Length;
     _currentSize = 0;
     int oldLen = curr.Length;
     // Let's grow segments by 50% minimum
     int newLen = oldLen + (oldLen >> 1);
     if (newLen < MIN_SEGMENT_LEN)
     {
         newLen = MIN_SEGMENT_LEN;
     }
     else
     {
         if (newLen > MAX_SEGMENT_LEN)
         {
             newLen = MAX_SEGMENT_LEN;
         }
     }
     _currentSegment = carr(newLen);
 }
 public char[] finishCurrentSegment()
 {
     if (_segments == null)
     {
         _segments = new Sharpen.AList<char[]>();
     }
     _hasSegments = true;
     _segments.Add(_currentSegment);
     int oldLen = _currentSegment.Length;
     _segmentSize += oldLen;
     _currentSize = 0;
     // Let's grow segments by 50%
     int newLen = oldLen + (oldLen >> 1);
     if (newLen < MIN_SEGMENT_LEN)
     {
         newLen = MIN_SEGMENT_LEN;
     }
     else
     {
         if (newLen > MAX_SEGMENT_LEN)
         {
             newLen = MAX_SEGMENT_LEN;
         }
     }
     char[] curr = carr(newLen);
     _currentSegment = curr;
     return curr;
 }