Skip to content

Commit 5903f68

Browse files
committed
v1.1.0 Release.
v1.1.0 リリース
1 parent de44fbb commit 5903f68

10 files changed

Lines changed: 444 additions & 108 deletions

File tree

MemoizationGenerator/MemoizationGenerator.cs

Lines changed: 338 additions & 80 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,6 @@ Therefore, application of Memoization to struct instance methods is prohibited.
268268
### Memoization to methods without return value or out,ref
269269
Memoization cannot be set for methods that have no outputs.
270270

271-
### If more than 8 inputs
272-
Inputs are all parameters except the out parameter.
273-
In the case of instance methods, generic parameters are also included as inputs.
274-
275271
## Reasons for high performance
276272
This library uses SourceGenerator to analyze the code and select the optimal cache method on a case-by-case basis.
277273
For example, if a method has arguments, it is converted to a Tuple and an EqualityComparer optimized specifically for Tuple is used.

README_ja.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,6 @@ structのインスタンスメンバをpartialすると、回避不能の警告(
270270
### 戻り値やout,refを持たないメソッドへの適用
271271
アウトプットのないメソッドにはMemoizationを設定できません。
272272

273-
### インプットが8つを超える場合
274-
インプットとはoutパラメーターを除く全てのパラメーターを指します。
275-
また、インスタンスメソッドの場合はGenericパラメーターもインプットに含みます。
276-
277273
## 高速な理由
278274
このライブラリではSourceGeneratorを用いてコードを解析しケースバイケースで最適なキャッシュ方法を選定しています。
279275
例えば、引数を持つメソッドの場合一度Tuple化し、Tuple専用に最適化したEqualityComparerを用います。
5.5 KB
Binary file not shown.

packages/Runtime/MemoizationEqualityComparer.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace Katuusagi.MemoizationForUnity
55
{
66
public sealed class MemoizationEqualityComparer<T1> : IEqualityComparer<ValueTuple<T1>>
77
{
8-
public static MemoizationEqualityComparer<T1> Default = new ();
8+
public static MemoizationEqualityComparer<T1> Default { get; } = new ();
99
bool IEqualityComparer<ValueTuple<T1>>.Equals(ValueTuple<T1> x, ValueTuple<T1> y)
1010
{
1111
return x.Equals(y);
@@ -19,7 +19,7 @@ int IEqualityComparer<ValueTuple<T1>>.GetHashCode(ValueTuple<T1> obj)
1919

2020
public sealed class MemoizationEqualityComparer<T1, T2> : IEqualityComparer<(T1, T2)>
2121
{
22-
public static MemoizationEqualityComparer<T1, T2> Default = new ();
22+
public static MemoizationEqualityComparer<T1, T2> Default { get; } = new ();
2323
bool IEqualityComparer<(T1, T2)>.Equals((T1, T2) x, (T1, T2) y)
2424
{
2525
return x.Equals(y);
@@ -33,7 +33,7 @@ public sealed class MemoizationEqualityComparer<T1, T2> : IEqualityComparer<(T1,
3333

3434
public sealed class MemoizationEqualityComparer<T1, T2, T3> : IEqualityComparer<(T1, T2, T3)>
3535
{
36-
public static MemoizationEqualityComparer<T1, T2, T3> Default = new ();
36+
public static MemoizationEqualityComparer<T1, T2, T3> Default { get; } = new ();
3737
bool IEqualityComparer<(T1, T2, T3)>.Equals((T1, T2, T3) x, (T1, T2, T3) y)
3838
{
3939
return x.Equals(y);
@@ -47,7 +47,7 @@ public sealed class MemoizationEqualityComparer<T1, T2, T3> : IEqualityComparer<
4747

4848
public sealed class MemoizationEqualityComparer<T1, T2, T3, T4> : IEqualityComparer<(T1, T2, T3, T4)>
4949
{
50-
public static MemoizationEqualityComparer<T1, T2, T3, T4> Default = new ();
50+
public static MemoizationEqualityComparer<T1, T2, T3, T4> Default { get; } = new ();
5151
bool IEqualityComparer<(T1, T2, T3, T4)>.Equals((T1, T2, T3, T4) x, (T1, T2, T3, T4) y)
5252
{
5353
return x.Equals(y);
@@ -61,7 +61,7 @@ public sealed class MemoizationEqualityComparer<T1, T2, T3, T4> : IEqualityCompa
6161

6262
public sealed class MemoizationEqualityComparer<T1, T2, T3, T4, T5> : IEqualityComparer<(T1, T2, T3, T4, T5)>
6363
{
64-
public static MemoizationEqualityComparer<T1, T2, T3, T4, T5> Default = new ();
64+
public static MemoizationEqualityComparer<T1, T2, T3, T4, T5> Default { get; } = new ();
6565
bool IEqualityComparer<(T1, T2, T3, T4, T5)>.Equals((T1, T2, T3, T4, T5) x, (T1, T2, T3, T4, T5) y)
6666
{
6767
return x.Equals(y);
@@ -75,7 +75,7 @@ public sealed class MemoizationEqualityComparer<T1, T2, T3, T4, T5> : IEqualityC
7575

7676
public sealed class MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6> : IEqualityComparer<(T1, T2, T3, T4, T5, T6)>
7777
{
78-
public static MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6> Default = new ();
78+
public static MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6> Default { get; } = new ();
7979
bool IEqualityComparer<(T1, T2, T3, T4, T5, T6)>.Equals((T1, T2, T3, T4, T5, T6) x, (T1, T2, T3, T4, T5, T6) y)
8080
{
8181
return x.Equals(y);
@@ -89,7 +89,7 @@ public sealed class MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6> : IEqual
8989

9090
public sealed class MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6, T7> : IEqualityComparer<(T1, T2, T3, T4, T5, T6, T7)>
9191
{
92-
public static MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6, T7> Default = new ();
92+
public static MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6, T7> Default { get; } = new ();
9393
bool IEqualityComparer<(T1, T2, T3, T4, T5, T6, T7)>.Equals((T1, T2, T3, T4, T5, T6, T7) x, (T1, T2, T3, T4, T5, T6, T7) y)
9494
{
9595
return x.Equals(y);
@@ -103,7 +103,7 @@ public sealed class MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6, T7> : IE
103103

104104
public sealed class MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6, T7, T8> : IEqualityComparer<(T1, T2, T3, T4, T5, T6, T7, T8)>
105105
{
106-
public static MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6, T7, T8> Default = new ();
106+
public static MemoizationEqualityComparer<T1, T2, T3, T4, T5, T6, T7, T8> Default { get; } = new ();
107107
bool IEqualityComparer<(T1, T2, T3, T4, T5, T6, T7, T8)>.Equals((T1, T2, T3, T4, T5, T6, T7, T8) x, (T1, T2, T3, T4, T5, T6, T7, T8) y)
108108
{
109109
return x.Equals(y);

packages/Runtime/MemoizationUtils.cs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,44 @@
22

33
namespace Katuusagi.MemoizationForUnity.Utils
44
{
5-
public class MemoizationUtils
5+
public static class MemoizationUtils
66
{
7-
public static class TypeId<T>
7+
public class TypeId<T0>
8+
{
9+
public static readonly int Id = Interlocked.Increment(ref _counter);
10+
}
11+
12+
public class TypeId<T0, T1>
13+
{
14+
public static readonly int Id = Interlocked.Increment(ref _counter);
15+
}
16+
17+
public class TypeId<T0, T1, T2>
18+
{
19+
public static readonly int Id = Interlocked.Increment(ref _counter);
20+
}
21+
22+
public class TypeId<T0, T1, T2, T3>
23+
{
24+
public static readonly int Id = Interlocked.Increment(ref _counter);
25+
}
26+
27+
public class TypeId<T0, T1, T2, T3, T4>
28+
{
29+
public static readonly int Id = Interlocked.Increment(ref _counter);
30+
}
31+
32+
public class TypeId<T0, T1, T2, T3, T4, T5>
33+
{
34+
public static readonly int Id = Interlocked.Increment(ref _counter);
35+
}
36+
37+
public class TypeId<T0, T1, T2, T3, T4, T5, T6>
38+
{
39+
public static readonly int Id = Interlocked.Increment(ref _counter);
40+
}
41+
42+
public class TypeId<T0, T1, T2, T3, T4, T5, T6, T7>
843
{
944
public static readonly int Id = Interlocked.Increment(ref _counter);
1045
}

packages/Runtime/ParamsEqualityComparer.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Katuusagi.MemoizationForUnity
66
{
77
public sealed class ParamsEqualityComparer<T1> : IEqualityComparer<ValueTuple<T1[]>>
88
{
9-
public static ParamsEqualityComparer<T1> Default = new ();
9+
public static ParamsEqualityComparer<T1> Default { get; } = new ();
1010
bool IEqualityComparer<ValueTuple<T1[]>>.Equals(ValueTuple<T1[]> x, ValueTuple<T1[]> y)
1111
{
1212
return (x.Item1 ?? Array.Empty<T1>()).SequenceEqual(y.Item1 ?? Array.Empty<T1>());
@@ -27,7 +27,7 @@ int IEqualityComparer<ValueTuple<T1[]>>.GetHashCode(ValueTuple<T1[]> obj)
2727

2828
public sealed class ParamsEqualityComparer<T1, T2> : IEqualityComparer<(T1, T2[])>
2929
{
30-
public static ParamsEqualityComparer<T1, T2> Default = new ();
30+
public static ParamsEqualityComparer<T1, T2> Default { get; } = new ();
3131
bool IEqualityComparer<(T1, T2[])>.Equals((T1, T2[]) x, (T1, T2[]) y)
3232
{
3333
return EqualityComparer<T1>.Default.Equals(x.Item1, y.Item1) &&
@@ -50,7 +50,7 @@ public sealed class ParamsEqualityComparer<T1, T2> : IEqualityComparer<(T1, T2[]
5050

5151
public sealed class ParamsEqualityComparer<T1, T2, T3> : IEqualityComparer<(T1, T2, T3[])>
5252
{
53-
public static ParamsEqualityComparer<T1, T2, T3> Default = new ();
53+
public static ParamsEqualityComparer<T1, T2, T3> Default { get; } = new ();
5454
bool IEqualityComparer<(T1, T2, T3[])>.Equals((T1, T2, T3[]) x, (T1, T2, T3[]) y)
5555
{
5656
return EqualityComparer<T1>.Default.Equals(x.Item1, y.Item1) &&
@@ -75,7 +75,7 @@ public sealed class ParamsEqualityComparer<T1, T2, T3> : IEqualityComparer<(T1,
7575

7676
public sealed class ParamsEqualityComparer<T1, T2, T3, T4> : IEqualityComparer<(T1, T2, T3, T4[])>
7777
{
78-
public static ParamsEqualityComparer<T1, T2, T3, T4> Default = new ();
78+
public static ParamsEqualityComparer<T1, T2, T3, T4> Default { get; } = new ();
7979
bool IEqualityComparer<(T1, T2, T3, T4[])>.Equals((T1, T2, T3, T4[]) x, (T1, T2, T3, T4[]) y)
8080
{
8181
return EqualityComparer<T1>.Default.Equals(x.Item1, y.Item1) &&
@@ -102,7 +102,7 @@ public sealed class ParamsEqualityComparer<T1, T2, T3, T4> : IEqualityComparer<(
102102

103103
public sealed class ParamsEqualityComparer<T1, T2, T3, T4, T5> : IEqualityComparer<(T1, T2, T3, T4, T5[])>
104104
{
105-
public static ParamsEqualityComparer<T1, T2, T3, T4, T5> Default = new ();
105+
public static ParamsEqualityComparer<T1, T2, T3, T4, T5> Default { get; } = new ();
106106
bool IEqualityComparer<(T1, T2, T3, T4, T5[])>.Equals((T1, T2, T3, T4, T5[]) x, (T1, T2, T3, T4, T5[]) y)
107107
{
108108
return EqualityComparer<T1>.Default.Equals(x.Item1, y.Item1) &&
@@ -131,7 +131,7 @@ public sealed class ParamsEqualityComparer<T1, T2, T3, T4, T5> : IEqualityCompar
131131

132132
public sealed class ParamsEqualityComparer<T1, T2, T3, T4, T5, T6> : IEqualityComparer<(T1, T2, T3, T4, T5, T6[])>
133133
{
134-
public static ParamsEqualityComparer<T1, T2, T3, T4, T5, T6> Default = new ();
134+
public static ParamsEqualityComparer<T1, T2, T3, T4, T5, T6> Default { get; } = new ();
135135
bool IEqualityComparer<(T1, T2, T3, T4, T5, T6[])>.Equals((T1, T2, T3, T4, T5, T6[]) x, (T1, T2, T3, T4, T5, T6[]) y)
136136
{
137137
return EqualityComparer<T1>.Default.Equals(x.Item1, y.Item1) &&
@@ -162,7 +162,7 @@ public sealed class ParamsEqualityComparer<T1, T2, T3, T4, T5, T6> : IEqualityCo
162162

163163
public sealed class ParamsEqualityComparer<T1, T2, T3, T4, T5, T6, T7> : IEqualityComparer<(T1, T2, T3, T4, T5, T6, T7[])>
164164
{
165-
public static ParamsEqualityComparer<T1, T2, T3, T4, T5, T6, T7> Default = new ();
165+
public static ParamsEqualityComparer<T1, T2, T3, T4, T5, T6, T7> Default { get; } = new ();
166166
bool IEqualityComparer<(T1, T2, T3, T4, T5, T6, T7[])>.Equals((T1, T2, T3, T4, T5, T6, T7[]) x, (T1, T2, T3, T4, T5, T6, T7[]) y)
167167
{
168168
return EqualityComparer<T1>.Default.Equals(x.Item1, y.Item1) &&
@@ -195,7 +195,7 @@ public sealed class ParamsEqualityComparer<T1, T2, T3, T4, T5, T6, T7> : IEquali
195195

196196
public sealed class ParamsEqualityComparer<T1, T2, T3, T4, T5, T6, T7, T8> : IEqualityComparer<(T1, T2, T3, T4, T5, T6, T7, T8[])>
197197
{
198-
public static ParamsEqualityComparer<T1, T2, T3, T4, T5, T6, T7, T8> Default = new ();
198+
public static ParamsEqualityComparer<T1, T2, T3, T4, T5, T6, T7, T8> Default { get; } = new ();
199199
bool IEqualityComparer<(T1, T2, T3, T4, T5, T6, T7, T8[])>.Equals((T1, T2, T3, T4, T5, T6, T7, T8[]) x, (T1, T2, T3, T4, T5, T6, T7, T8[]) y)
200200
{
201201
return EqualityComparer<T1>.Default.Equals(x.Item1, y.Item1) &&

packages/Tests/Runtime/MemoizationTest.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ public void StaticGenericArgType()
164164
dic[10] = 100;
165165
var r = TestFunctions.StaticGetTable(dic, 10);
166166
Assert.AreEqual(l, r);
167+
168+
var dic2 = new Dictionary<int, long>() { { 10, 10 } };
169+
var l2 = TestFunctions.StaticGetTable(dic2, 10);
170+
dic[10] = 100;
171+
var r2 = TestFunctions.StaticGetTable(dic2, 10);
172+
Assert.AreEqual(l2, r2);
167173
}
168174

169175
[Test]
@@ -180,6 +186,13 @@ public void StaticGenericClearArgType()
180186
Assert.AreNotEqual(l, r);
181187
}
182188

189+
[Test]
190+
public void StaticManyParameter()
191+
{
192+
TestFunctions.StaticManyParameter(default, default, default, default, default, default, default, default, default);
193+
TestFunctions.StaticManyGenericParameter(default(float), default(float), default(float), default(float), default(float), default(float), default(float), default(float), default(float));
194+
}
195+
183196
[Test]
184197
public void InstanceAutoNaming()
185198
{
@@ -345,6 +358,12 @@ public void InstanceGenericArgType()
345358
dic[10] = 100;
346359
var r = funcs.InstanceGetTable(dic, 10);
347360
Assert.AreEqual(l, r);
361+
362+
var dic2 = new Dictionary<int, long>() { { 10, 10 } };
363+
var l2 = funcs.InstanceGetTable(dic2, 10);
364+
dic[10] = 100;
365+
var r2 = funcs.InstanceGetTable(dic2, 10);
366+
Assert.AreEqual(l2, r2);
348367
}
349368

350369
[Test]
@@ -361,6 +380,14 @@ public void InstanceGenericClearArgType()
361380
Assert.AreNotEqual(l, r);
362381
}
363382

383+
[Test]
384+
public void InstanceManyParameter()
385+
{
386+
var funcs = new TestFunctions();
387+
funcs.InstanceManyParameter(default, default, default, default, default, default, default, default, default);
388+
funcs.InstanceManyGenericParameter(default(float), default(float), default(float), default(float), default(float), default(float), default(float), default(float), default(float));
389+
}
390+
364391
[Test]
365392
public void Struct()
366393
{

packages/Tests/Runtime/TestFunctionsPartial.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,18 @@ public static TValue StaticClearableGetTableRaw<TKey, TValue>(Dictionary<TKey, T
138138
return table[key];
139139
}
140140

141+
[Memoization]
142+
public static int StaticManyParameterRaw(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
143+
{
144+
return default;
145+
}
146+
147+
[Memoization]
148+
public static int StaticManyGenericParameterRaw<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9)
149+
{
150+
return default;
151+
}
152+
141153
private int _instanceCounter = 0;
142154

143155
[Memoization]
@@ -271,5 +283,17 @@ public TValue InstanceClearableGetTableRaw<TKey, TValue>(Dictionary<TKey, TValue
271283
{
272284
return table[key];
273285
}
286+
287+
[Memoization]
288+
public int InstanceManyParameterRaw(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
289+
{
290+
return default;
291+
}
292+
293+
[Memoization]
294+
public int InstanceManyGenericParameterRaw<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9)
295+
{
296+
return default;
297+
}
274298
}
275299
}

packages/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "com.katuusagi.memoizationforunity",
33
"displayName": "MemoizationForUnity",
44
"description": "Libraries supporting Memoization. Powerful optimization features.",
5-
"version": "1.0.1",
5+
"version": "1.1.0",
66
"unity": "2021.3",
77
"dependencies": {
88
"com.unity.test-framework": "1.1.31",
@@ -18,5 +18,5 @@
1818
},
1919
"documentationUrl": "https://github.com/Katsuya100/MemoizationForUnity",
2020
"changelogUrl": "https://github.com/Katsuya100/MemoizationForUnity/releases",
21-
"licensesUrl": "https://github.com/Katsuya100/MemoizationForUnity/blob/v1.0.1/LICENSE"
21+
"licensesUrl": "https://github.com/Katsuya100/MemoizationForUnity/blob/v1.1.0/LICENSE"
2222
}

0 commit comments

Comments
 (0)