OSDN Git Service

ListViewItemCacheのキャッシュからPostClassを削除
authorKimura Youichi <kim.upsilon@bucyou.net>
Sun, 24 Apr 2022 17:09:42 +0000 (02:09 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sun, 24 Apr 2022 17:10:19 +0000 (02:10 +0900)
OpenTween.Tests/ListViewItemCacheTest.cs
OpenTween/TimelineListViewCache.cs

index 4c70180..e105bee 100644 (file)
@@ -20,8 +20,8 @@
 // Boston, MA 02110-1301, USA.
 
 using System;
+using System.Linq;
 using System.Windows.Forms;
-using OpenTween.Models;
 using Xunit;
 
 namespace OpenTween
@@ -34,17 +34,17 @@ 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);
         }
 
@@ -55,7 +55,7 @@ namespace OpenTween
         [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));
         }
 
@@ -66,7 +66,7 @@ namespace OpenTween
         [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));
         }
 
@@ -74,23 +74,33 @@ namespace OpenTween
         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]);
         }
     }
 }
index ae1be74..5e79ef5 100644 (file)
@@ -27,6 +27,7 @@
 #nullable enable
 
 using System;
+using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
 using System.Drawing;
 using System.Linq;
@@ -128,7 +129,7 @@ namespace OpenTween
             var listCache = new ListViewItemCache(
                 startIndex,
                 endIndex,
-                Enumerable.Zip(listItems, posts, (x, y) => (x, y)).ToArray()
+                listItems
             );
 
             Interlocked.Exchange(ref this.listItemCache, listCache);
@@ -202,9 +203,10 @@ namespace OpenTween
                 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);
         }
 
@@ -259,8 +261,8 @@ namespace OpenTween
         {
             // 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;
@@ -270,9 +272,10 @@ namespace OpenTween
             // 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);
             }
         }
@@ -338,7 +341,7 @@ namespace OpenTween
             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;
@@ -380,14 +383,14 @@ namespace OpenTween
         /// <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));
@@ -407,23 +410,28 @@ namespace OpenTween
         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);
     }