1
1
using System ;
2
2
using System . Collections ;
3
+ using System . Threading ;
3
4
4
5
namespace QRCoder
5
6
{
@@ -12,30 +13,27 @@ private static partial class ModulePlacer
12
13
/// </summary>
13
14
public struct BlockedModules : IDisposable
14
15
{
15
- private readonly bool [ , ] _blockedModules ;
16
+ private readonly bool [ ] [ ] _blockedModules ;
16
17
17
- [ ThreadStatic ]
18
- private static bool [ , ] _staticBlockedModules ;
18
+ private static bool [ ] [ ] _staticBlockedModules ;
19
19
20
20
/// <summary>
21
21
/// Initializes a new instance of the <see cref="BlockedModules"/> struct with a specified capacity.
22
22
/// </summary>
23
23
/// <param name="capacity">The initial capacity of the blocked modules list.</param>
24
24
public BlockedModules ( int size )
25
25
{
26
- if ( _staticBlockedModules != null && _staticBlockedModules . GetUpperBound ( 0 ) >= ( size - 1 ) )
26
+ _blockedModules = Interlocked . Exchange ( ref _staticBlockedModules , null ) ;
27
+ if ( _blockedModules != null && _blockedModules . Length >= size )
27
28
{
28
- _blockedModules = _staticBlockedModules ;
29
- _staticBlockedModules = null ;
30
- #if NET6_0_OR_GREATER
31
- Array . Clear ( _blockedModules ) ;
32
- #else
33
- Array . Clear ( _blockedModules , 0 , _blockedModules . Length ) ;
34
- #endif
29
+ for ( int i = 0 ; i < size ; i ++ )
30
+ Array . Clear ( _blockedModules [ i ] , 0 , size ) ;
35
31
}
36
32
else
37
33
{
38
- _blockedModules = new bool [ size , size ] ;
34
+ _blockedModules = new bool [ size ] [ ] ;
35
+ for ( int i = 0 ; i < size ; i ++ )
36
+ _blockedModules [ i ] = new bool [ size ] ;
39
37
}
40
38
}
41
39
@@ -46,7 +44,7 @@ public BlockedModules(int size)
46
44
/// <param name="y">The y-coordinate of the module.</param>
47
45
public void Add ( int x , int y )
48
46
{
49
- _blockedModules [ y , x ] = true ;
47
+ _blockedModules [ y ] [ x ] = true ;
50
48
}
51
49
52
50
/// <summary>
@@ -59,7 +57,7 @@ public void Add(Rectangle rect)
59
57
{
60
58
for ( int x = rect . X ; x < rect . X + rect . Width ; x ++ )
61
59
{
62
- _blockedModules [ y , x ] = true ;
60
+ _blockedModules [ y ] [ x ] = true ;
63
61
}
64
62
}
65
63
}
@@ -72,7 +70,7 @@ public void Add(Rectangle rect)
72
70
/// <returns><c>true</c> if the coordinates are blocked; otherwise, <c>false</c>.</returns>
73
71
public bool IsBlocked ( int x , int y )
74
72
{
75
- return _blockedModules [ y , x ] ;
73
+ return _blockedModules [ y ] [ x ] ;
76
74
}
77
75
78
76
/// <summary>
@@ -86,7 +84,7 @@ public bool IsBlocked(Rectangle r1)
86
84
{
87
85
for ( int x = r1 . X ; x < r1 . X + r1 . Width ; x ++ )
88
86
{
89
- if ( _blockedModules [ y , x ] )
87
+ if ( _blockedModules [ y ] [ x ] )
90
88
return true ;
91
89
}
92
90
}
@@ -95,10 +93,7 @@ public bool IsBlocked(Rectangle r1)
95
93
96
94
public void Dispose ( )
97
95
{
98
- if ( _staticBlockedModules == null || _staticBlockedModules . GetUpperBound ( 0 ) < _blockedModules . GetUpperBound ( 0 ) )
99
- {
100
- _staticBlockedModules = _blockedModules ;
101
- }
96
+ Interlocked . CompareExchange ( ref _staticBlockedModules , _blockedModules , null ) ;
102
97
}
103
98
}
104
99
}
0 commit comments