A game framework written with osu! in mind.
fork

Configure Feed

Select the types of activity you want to include in your feed.

Implement IReadOnlyList instead of IEnumerable

+41 -35
+11 -11
osu.Framework.Tests/Visual/Layout/TestSceneTableContainer.cs
··· 54 54 public void TestOnlyContent() 55 55 { 56 56 AddStep("set content", () => table.Content = createContent(2, 2)); 57 - AddAssert("headers not displayed", () => getGrid().Content.Count() == 2); 57 + AddAssert("headers not displayed", () => getGrid().Content.Count == 2); 58 58 } 59 59 60 60 [Test] ··· 81 81 }; 82 82 }); 83 83 84 - AddAssert("4 rows", () => getGrid().Content.Count() == 4); 84 + AddAssert("4 rows", () => getGrid().Content.Count == 4); 85 85 AddStep("disable headers", () => table.ShowHeaders = false); 86 - AddAssert("3 rows", () => getGrid().Content.Count() == 3); 86 + AddAssert("3 rows", () => getGrid().Content.Count == 3); 87 87 } 88 88 89 89 [Test] ··· 100 100 }; 101 101 }); 102 102 103 - AddAssert("3 columns", () => getGrid().Content.Max(r => r.Count()) == 3); 103 + AddAssert("3 columns", () => getGrid().Content.Max(r => r.Count) == 3); 104 104 AddStep("disable headers", () => table.ShowHeaders = false); 105 - AddAssert("2 columns", () => getGrid().Content.Max(r => r.Count()) == 2); 105 + AddAssert("2 columns", () => getGrid().Content.Max(r => r.Count) == 2); 106 106 } 107 107 108 108 [Test] ··· 118 118 }; 119 119 }); 120 120 121 - AddAssert("3 columns", () => getGrid().Content.Max(r => r.Count()) == 3); 121 + AddAssert("3 columns", () => getGrid().Content.Max(r => r.Count) == 3); 122 122 AddStep("disable headers", () => table.ShowHeaders = false); 123 - AddAssert("2 columns", () => getGrid().Content.Max(r => r.Count()) == 3); 123 + AddAssert("2 columns", () => getGrid().Content.Max(r => r.Count) == 3); 124 124 } 125 125 126 126 [Test] ··· 172 172 173 173 bool testColumn(int index, Anchor anchor) 174 174 { 175 - for (int r = 0; r < getGrid().Content.Count(); r++) 175 + for (int r = 0; r < getGrid().Content.Count; r++) 176 176 { 177 177 if (getGrid().Content[r][index].Anchor != anchor) 178 178 return false; ··· 202 202 new TableColumn("Header 3"), 203 203 }); 204 204 205 - AddAssert("3 columns", () => getGrid().Content.Max(r => r.Count()) == 3); 205 + AddAssert("3 columns", () => getGrid().Content.Max(r => r.Count) == 3); 206 206 207 207 AddStep("decrease columns", () => table.Columns = new[] 208 208 { 209 209 new TableColumn("Header 1"), 210 210 }); 211 211 212 - AddAssert("2 columns", () => getGrid().Content.Max(r => r.Count()) == 2); 212 + AddAssert("2 columns", () => getGrid().Content.Max(r => r.Count) == 2); 213 213 } 214 214 215 215 [Test] ··· 239 239 240 240 bool testRows(float expectedHeight) 241 241 { 242 - for (int row = 0; row < getGrid().Content.Count(); row++) 242 + for (int row = 0; row < getGrid().Content.Count; row++) 243 243 { 244 244 if (!Precision.AlmostEquals(expectedHeight, getGrid().Content[row][0].Parent.DrawHeight)) 245 245 return false;
+3 -3
osu.Framework/Graphics/Containers/GridContainer.cs
··· 141 141 if (cellContent.IsValid) 142 142 return; 143 143 144 - int requiredRows = Content?.Count() ?? 0; 145 - int requiredColumns = requiredRows == 0 ? 0 : Content?.Max(c => c?.WrappedArray.Length ?? 0) ?? 0; 144 + int requiredRows = Content?.Count ?? 0; 145 + int requiredColumns = requiredRows == 0 ? 0 : Content?.Max(c => c?.Count ?? 0) ?? 0; 146 146 147 147 // Clear cell containers without disposing, as the content might be reused 148 148 foreach (var cell in cells) ··· 168 168 continue; 169 169 170 170 // Allow non-square grids 171 - if (c >= Content[r].WrappedArray.Length) 171 + if (c >= Content[r].Count) 172 172 continue; 173 173 174 174 // Allow empty cells
+21 -15
osu.Framework/Graphics/Containers/GridContainerContent.cs
··· 10 10 /// <summary> 11 11 /// Implements a jagged array behavior with element change notifications 12 12 /// </summary> 13 - public class GridContainerContent : IEnumerable<GridContainerContent.ArrayWrapper<Drawable>> 13 + public class GridContainerContent : IReadOnlyList<GridContainerContent.ArrayWrapper<Drawable>> 14 14 { 15 15 public event Action ContentChanged; 16 16 ··· 32 32 { 33 33 source = drawables; 34 34 35 - wrappedArray = new ArrayWrapper<ArrayWrapper<Drawable>> 36 - { 37 - WrappedArray = new ArrayWrapper<Drawable>[drawables?.Length ?? 0] 38 - }; 35 + wrappedArray = new ArrayWrapper<ArrayWrapper<Drawable>>(new ArrayWrapper<Drawable>[drawables?.Length ?? 0]); 39 36 40 37 wrappedArray.ArrayElementChanged += onArrayElementChanged; 41 38 ··· 45 42 { 46 43 if (drawables[i] != null) 47 44 { 48 - this[i] = new ArrayWrapper<Drawable> { WrappedArray = drawables[i] }; 45 + this[i] = new ArrayWrapper<Drawable>(drawables[i]); 49 46 this[i].ArrayElementChanged += onArrayElementChanged; 50 47 } 51 48 } ··· 61 58 /// Wraps an array and provides a custom indexer with element change notification 62 59 /// </summary> 63 60 /// <typeparam name="T">An array data type</typeparam> 64 - public class ArrayWrapper<T> : IEnumerable<T> 61 + public class ArrayWrapper<T> : IReadOnlyList<T> 65 62 { 66 63 public event Action ArrayElementChanged; 67 64 68 - public T[] WrappedArray { get; set; } 65 + private T[] wrappedArray { get; set; } 66 + 67 + public ArrayWrapper(T[] arrayToWrap) 68 + { 69 + wrappedArray = arrayToWrap; 70 + } 69 71 70 72 public T this[int index] 71 73 { 72 - get => WrappedArray[index]; 74 + get => wrappedArray[index]; 73 75 set 74 76 { 75 - if (EqualityComparer<T>.Default.Equals(WrappedArray[index], value)) 77 + if (EqualityComparer<T>.Default.Equals(wrappedArray[index], value)) 76 78 return; 77 79 78 - WrappedArray[index] = value; 80 + wrappedArray[index] = value; 79 81 ArrayElementChanged?.Invoke(); 80 82 } 81 83 } 82 84 83 85 public IEnumerator<T> GetEnumerator() 84 86 { 85 - return ((IEnumerable<T>)WrappedArray).GetEnumerator(); 87 + return ((IEnumerable<T>)wrappedArray).GetEnumerator(); 86 88 } 87 89 88 90 IEnumerator IEnumerable.GetEnumerator() 89 91 { 90 - return WrappedArray.GetEnumerator(); 92 + return wrappedArray.GetEnumerator(); 91 93 } 94 + 95 + public int Count => wrappedArray.Length; 92 96 } 93 97 94 98 public IEnumerator<ArrayWrapper<Drawable>> GetEnumerator() 95 99 { 96 - return ((IEnumerable<ArrayWrapper<Drawable>>)wrappedArray.WrappedArray).GetEnumerator(); 100 + return ((IEnumerable<ArrayWrapper<Drawable>>)wrappedArray).GetEnumerator(); 97 101 } 98 102 99 103 IEnumerator IEnumerable.GetEnumerator() 100 104 { 101 - return wrappedArray.WrappedArray.GetEnumerator(); 105 + return wrappedArray.GetEnumerator(); 102 106 } 107 + 108 + public int Count => wrappedArray.Count; 103 109 } 104 110 }
+6 -6
osu.Framework/Graphics/Containers/Markdown/MarkdownTable.cs
··· 93 93 if (table.Count == 0) 94 94 return; 95 95 96 - Span<float> columnWidths = stackalloc float[tableContainer.Content[0].WrappedArray.Length]; 96 + Span<float> columnWidths = stackalloc float[tableContainer.Content[0].Count]; 97 97 98 98 // Compute the maximum width of each column 99 - for (int r = 0; r < tableContainer.Content.Count(); r++) 99 + for (int r = 0; r < tableContainer.Content.Count; r++) 100 100 { 101 - for (int c = 0; c < tableContainer.Content[r].WrappedArray.Length; c++) 101 + for (int c = 0; c < tableContainer.Content[r].Count; c++) 102 102 columnWidths[c] = Math.Max(columnWidths[c], ((MarkdownTableCell)tableContainer.Content[r][c]).ContentWidth); 103 103 } 104 104 ··· 129 129 if (table.Count == 0) 130 130 return; 131 131 132 - var rowDefinitions = new Dimension[tableContainer.Content.Count()]; 133 - for (int r = 0; r < tableContainer.Content.Count(); r++) 134 - rowDefinitions[r] = new Dimension(GridSizeMode.Absolute, tableContainer.Content[r].WrappedArray.Max(c => ((MarkdownTableCell)c).ContentHeight)); 132 + var rowDefinitions = new Dimension[tableContainer.Content.Count]; 133 + for (int r = 0; r < tableContainer.Content.Count; r++) 134 + rowDefinitions[r] = new Dimension(GridSizeMode.Absolute, tableContainer.Content[r].Max(c => ((MarkdownTableCell)c).ContentHeight)); 135 135 136 136 tableContainer.RowDimensions = rowDefinitions; 137 137 }