// Boston, MA 02110-1301, USA.
using System;
+using System.Linq;
using System.Windows.Forms;
-using OpenTween.Models;
using Xunit;
namespace OpenTween
var startIndex = 10;
var endIndex = 19;
Assert.Throws<ArgumentException>(
- () => new ListViewItemCache(startIndex, endIndex, new (ListViewItem, PostClass)[9])
+ () => new ListViewItemCache(startIndex, endIndex, new ListViewItem[9])
);
Assert.Throws<ArgumentException>(
- () => new ListViewItemCache(startIndex, endIndex, new (ListViewItem, PostClass)[11])
+ () => new ListViewItemCache(startIndex, endIndex, new ListViewItem[11])
);
}
[Fact]
public void Count_Test()
{
- var cache = new ListViewItemCache(10, 19, new (ListViewItem, PostClass)[10]);
+ var cache = new ListViewItemCache(10, 19, new ListViewItem[10]);
Assert.Equal(10, cache.Count);
}
[InlineData(20, false)]
public void Contains_Test(int index, bool expected)
{
- var cache = new ListViewItemCache(10, 19, new (ListViewItem, PostClass)[10]);
+ var cache = new ListViewItemCache(10, 19, new ListViewItem[10]);
Assert.Equal(expected, cache.Contains(index));
}
[InlineData(10, 20, false)]
public void IsSupersetOf_Test(int start, int end, bool expected)
{
- var cache = new ListViewItemCache(10, 19, new (ListViewItem, PostClass)[10]);
+ var cache = new ListViewItemCache(10, 19, new ListViewItem[10]);
Assert.Equal(expected, cache.IsSupersetOf(start, end));
}
public void TryGetValue_FoundTest()
{
var item = new ListViewItem();
- var post = new PostClass();
- var cache = new ListViewItemCache(10, 10, new[] { (item, post) });
+ var cache = new ListViewItemCache(10, 10, new[] { item });
- Assert.True(cache.TryGetValue(10, out var actualItem, out var actualPost));
+ Assert.True(cache.TryGetValue(10, out var actualItem));
Assert.Equal(item, actualItem);
- Assert.Equal(post, actualPost);
}
[Fact]
public void TryGetValue_NotFoundTest()
{
var item = new ListViewItem();
- var post = new PostClass();
- var cache = new ListViewItemCache(10, 10, new[] { (item, post) });
+ var cache = new ListViewItemCache(10, 10, new[] { item });
- Assert.False(cache.TryGetValue(9, out _, out _));
- Assert.False(cache.TryGetValue(11, out _, out _));
+ Assert.False(cache.TryGetValue(9, out _));
+ Assert.False(cache.TryGetValue(11, out _));
+ }
+
+ [Fact]
+ public void WithIndex_Test()
+ {
+ var item1 = new ListViewItem();
+ var item2 = new ListViewItem();
+ var cache = new ListViewItemCache(10, 11, new[] { item1, item2 });
+
+ var actualArray = cache.WithIndex().ToArray();
+ Assert.Equal(2, actualArray.Length);
+ Assert.Equal((item1, 10), actualArray[0]);
+ Assert.Equal((item2, 11), actualArray[1]);
}
}
}
#nullable enable
using System;
+using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using System.Linq;
var listCache = new ListViewItemCache(
startIndex,
endIndex,
- Enumerable.Zip(listItems, posts, (x, y) => (x, y)).ToArray()
+ listItems
);
Interlocked.Exchange(ref this.listItemCache, listCache);
return;
// キャッシュに含まれていないアイテムは対象外
- if (!listCache.TryGetValue(index, out var itm, out var post))
+ if (!listCache.TryGetValue(index, out var itm))
return;
+ var post = this.tab[index];
this.ChangeItemStyleRead(read, itm, post);
}
{
// Index:更新対象のListviewItem.Index。Colorを返す。
// -1は全キャッシュ。Colorは返さない(ダミーを戻す)
- var post = this.tab.AnchorPost ?? this.tab.SelectedPost;
- if (post == null)
+ var basePost = this.tab.AnchorPost ?? this.tab.SelectedPost;
+ if (basePost == null)
return;
var listCache = this.listItemCache;
// ValidateRectが呼ばれる前に選択色などの描画を済ませておく
this.listView.Update();
- foreach (var (listViewItem, cachedPost) in listCache.Cache)
+ foreach (var (listViewItem, index) in listCache.WithIndex())
{
- var backColor = this.JudgeColor(post, cachedPost);
+ var post = this.tab[index];
+ var backColor = this.JudgeColor(basePost, post);
this.listView.ChangeItemBackColor(listViewItem, backColor);
}
}
var listCache = this.listItemCache;
if (listCache != null)
{
- if (listCache.TryGetValue(e.ItemIndex, out var item, out _))
+ if (listCache.TryGetValue(e.ItemIndex, out var item))
{
e.Item = item;
return;
/// <summary>キャッシュする範囲の終了インデックス</summary>
public int EndIndex { get; }
- /// <summary>ã\82ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cã\81\9fç¯\84å\9b²ã\81«å¯¾å¿\9cã\81\99ã\82\8b <see cref="ListViewItem"/> ã\81¨ <see cref="PostClass"/> ã\81®çµ\84</summary>
- public (ListViewItem, PostClass)[] Cache { get; }
+ /// <summary>ã\82ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cã\81\9fç¯\84å\9b²ã\81«å¯¾å¿\9cã\81\99ã\82\8b <see cref="ListViewItem"/> ã\81®é\85\8då\88\97</summary>
+ public ListViewItem[] Cache { get; }
/// <summary>キャッシュされたアイテムの件数</summary>
public int Count
=> this.EndIndex - this.StartIndex + 1;
- public ListViewItemCache(int startIndex, int endIndex, (ListViewItem, PostClass)[] cache)
+ public ListViewItemCache(int startIndex, int endIndex, ListViewItem[] cache)
{
if (!IsCacheSizeValid(startIndex, endIndex, cache))
throw new ArgumentException("Cache size mismatch", nameof(cache));
public bool IsSupersetOf(int rangeStart, int rangeEnd)
=> rangeStart >= this.StartIndex && rangeEnd <= this.EndIndex;
- /// <summary>æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\82¤ã\83³ã\83\87ã\83\83ã\82¯ã\82¹ã\81® <see cref="ListViewItem"/> ã\81¨ <see cref="PostClass"/> ã\82\92ã\82ã\83£ã\83\83ã\82·ã\83¥ã\81\8bã\82\89å\8f\96å¾\97ã\81\99ã\82\8bã\81\93ã\81¨ã\82\92試ã\81¿ã\81¾ã\81\99</summary>
+ /// <summary>指定されたインデックスの <see cref="ListViewItem"/> をキャッシュから取得することを試みます</summary>
/// <returns>取得に成功すれば true、それ以外は false</returns>
- public bool TryGetValue(int index, [NotNullWhen(true)] out ListViewItem? item, [NotNullWhen(true)] out PostClass? post)
+ public bool TryGetValue(int index, [NotNullWhen(true)] out ListViewItem? item)
{
if (this.Contains(index))
{
- (item, post) = this.Cache[index - this.StartIndex];
+ item = this.Cache[index - this.StartIndex];
return true;
}
else
{
item = null;
- post = null;
return false;
}
}
+ public IEnumerable<(ListViewItem Item, int Index)> WithIndex()
+ {
+ foreach (var (item, index) in this.Cache.WithIndex())
+ yield return (item, index + this.StartIndex);
+ }
+
private static bool IsCacheSizeValid<T>(int startIndex, int endIndex, T[] cache)
=> cache.Length == (endIndex - startIndex + 1);
}