/// </summary>
/// <param name="index">インデックス</param>
/// <returns>Tを返す</returns>
- T this[int index]{get;}
+ T this[int index] { get; }
}
sealed class StringBuffer : IEnumerable<char>, IRandomEnumrator<char>
GapBuffer<char> buf = new GapBuffer<char>();
const int MaxSemaphoreCount = 1;
SemaphoreSlim Semaphore = new SemaphoreSlim(MaxSemaphoreCount);
+ ReaderWriterLockSlim rwlock = new ReaderWriterLockSlim();
public StringBuffer()
{
}
}
- /// <summary>
- /// ロックを解除します
- /// </summary>
- public void UnLock()
- {
- this.Semaphore.Release();
- }
-
- /// <summary>
- /// ロックします
- /// </summary>
- public void Lock()
- {
- this.Semaphore.Wait();
- }
-
- /// <summary>
- /// ロックします
- /// </summary>
- /// <returns>Taskオブジェクト</returns>
- public Task LockAsync()
- {
- return this.Semaphore.WaitAsync();
- }
-
public StringBuffer(StringBuffer buffer)
: this()
{
public string ToString(int index, int length)
{
- this.Lock();
+ this.rwlock.EnterReadLock();
StringBuilder temp = new StringBuilder();
temp.Clear();
for (int i = index; i < index + length; i++)
temp.Append(buf[i]);
- this.UnLock();
+ this.rwlock.ExitReadLock();
return temp.ToString();
}
}
}
- public IEnumerable<Tuple<int,int>> ForEachLines(int startIndex, int endIndex, int maxCharCount = -1)
+ public IEnumerable<Tuple<int, int>> ForEachLines(int startIndex, int endIndex, int maxCharCount = -1)
{
int currentLineHeadIndex = startIndex;
int currentLineLength = 0;
-
+
for (int i = startIndex; i <= endIndex; i++)
{
currentLineLength++;
uc != UnicodeCategory.EnclosingMark &&
uc != UnicodeCategory.Surrogate)
{
- yield return new Tuple<int,int>(currentLineHeadIndex, currentLineLength);
+ yield return new Tuple<int, int>(currentLineHeadIndex, currentLineLength);
currentLineHeadIndex += currentLineLength;
currentLineLength = 0;
}
if (currentLineLength > 0)
yield return new Tuple<int, int>(currentLineHeadIndex, currentLineLength);
}
-
+
public int Length
{
get { return this.buf.Count; }
internal void Replace(GapBuffer<char> buf)
{
- this.Lock();
+ this.rwlock.EnterWriteLock();
this.Clear();
this.buf = buf;
- this.UnLock();
+ this.rwlock.ExitWriteLock();
this.Update(this, new DocumentUpdateEventArgs(UpdateType.Replace, 0, 0, buf.Count));
}
- internal void Replace(int index, int length, IEnumerable<char> chars,int count)
+ internal void Replace(int index, int length, IEnumerable<char> chars, int count)
{
- this.Lock();
+ this.rwlock.EnterWriteLock();
- try{
+ try
+ {
if (length > 0)
this.buf.RemoveRange(index, length);
this.buf.InsertRange(index, chars, count);
}
finally
{
- this.UnLock();
+ this.rwlock.ExitWriteLock();
}
this.Update(this, new DocumentUpdateEventArgs(UpdateType.Replace, index, length, count));
//内部形式に変換する
var internal_str = from s in str where s != '\r' && s != '\0' select s;
- await this.LockAsync().ConfigureAwait(false);
+ this.rwlock.EnterWriteLock();
//str.lengthは事前に確保しておくために使用するので影響はない
this.buf.InsertRange(index, internal_str, str.Length);
- this.UnLock();
+ this.rwlock.ExitWriteLock();
if (tokenSource != null)
tokenSource.Token.ThrowIfCancellationRequested();
{
try
{
- await this.LockAsync().ConfigureAwait(false);
+ this.rwlock.EnterReadLock();
StringBuilder line = new StringBuilder();
for (int i = 0; i < this.Length; i++)
{
if (tokenSource != null)
tokenSource.Token.ThrowIfCancellationRequested();
#if TEST_ASYNC
- System.Threading.Thread.Sleep(10);
+ System.Threading.Thread.Sleep(10);
#endif
}
}
}
finally
{
- this.UnLock();
+ this.rwlock.ExitReadLock();
}
}
return pattern;
});
- this.Lock();
+ this.rwlock.EnterWriteLock();
try
{
//空行は削除する必要はない
}
finally
{
- this.UnLock();
+ this.rwlock.ExitWriteLock();
}
this.Update(this, new DocumentUpdateEventArgs(UpdateType.Replace, lineHeadIndex, lineLength, output.Length, i));
}
}
- internal void ReplaceAll(LineToIndexTable layoutlines,string target, string pattern, bool ci = false)
+ internal void ReplaceAll(LineToIndexTable layoutlines, string target, string pattern, bool ci = false)
{
TextSearch ts = new TextSearch(target, ci);
char[] pattern_chars = pattern.ToCharArray();
- for(int i = 0; i < layoutlines.Count; i++)
+ for (int i = 0; i < layoutlines.Count; i++)
{
int lineHeadIndex = layoutlines.GetIndexFromLineNumber(i), lineLength = layoutlines.GetLengthFromLineNumber(i);
int left = lineHeadIndex, right = lineHeadIndex;
int newLineLength = lineLength;
while ((right = ts.IndexOf(this.buf, left, lineHeadIndex + newLineLength)) != -1)
{
- this.Lock();
+ this.rwlock.EnterWriteLock();
try
{
this.buf.RemoveRange(right, target.Length);
}
finally
{
- this.UnLock();
+ this.rwlock.ExitWriteLock();
}
left = right + pattern.Length;
}
}
- internal int IndexOf(string target, int start,bool ci = false)
+ internal int IndexOf(string target, int start, bool ci = false)
{
- this.Lock();
+ this.rwlock.EnterReadLock();
- TextSearch ts = new TextSearch(target,ci);
- int patternIndex = ts.IndexOf(this.buf, start,this.buf.Count);
+ TextSearch ts = new TextSearch(target, ci);
+ int patternIndex = ts.IndexOf(this.buf, start, this.buf.Count);
- this.UnLock();
+ this.rwlock.ExitReadLock();
return patternIndex;
}
internal void Clear()
{
this.buf.Clear();
- this.Update(this, new DocumentUpdateEventArgs(UpdateType.Clear, 0, this.buf.Count,0));
+ this.Update(this, new DocumentUpdateEventArgs(UpdateType.Clear, 0, this.buf.Count, 0));
}
internal IEnumerable<char> GetEnumerator(int start, int length)
int patternLength;
Dictionary<char, int> qsTable = new Dictionary<char, int>();
bool caseInsenstive;
- public TextSearch(string pattern,bool ci = false)
+ public TextSearch(string pattern, bool ci = false)
{
this.patternLength = pattern.Length;
this.caseInsenstive = ci;
this.qsTable[pattern[i]] = len - i;
}
}
- public int IndexOf(GapBuffer<char> buf, int start,int end)
+ public int IndexOf(GapBuffer<char> buf, int start, int end)
{
//QuickSearch法
int buflen = buf.Count - 1;