Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Lazy.cs
Go to the documentation of this file.
4
5namespace System;
6
7[DebuggerTypeProxy(typeof(LazyDebugView<>))]
8[DebuggerDisplay("ThreadSafetyMode={Mode}, IsValueCreated={IsValueCreated}, IsValueFaulted={IsValueFaulted}, Value={ValueForDebugDisplay}")]
9public class Lazy<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T>
10{
11 private volatile LazyHelper _state;
12
13 private Func<T> _factory;
14
15 private T _value;
16
18 {
19 get
20 {
21 if (!IsValueCreated)
22 {
23 return default(T);
24 }
25 return _value;
26 }
27 }
28
30
32
33 public bool IsValueCreated => _state == null;
34
35 [DebuggerBrowsable(DebuggerBrowsableState.Never)]
36 public T Value
37 {
38 get
39 {
40 if (_state != null)
41 {
42 return CreateValue();
43 }
44 return _value;
45 }
46 }
47
48 private static T CreateViaDefaultConstructor()
49 {
50 return LazyHelper.CreateViaDefaultConstructor<T>();
51 }
52
53 public Lazy()
54 : this((Func<T>)null, LazyThreadSafetyMode.ExecutionAndPublication, useDefaultConstructor: true)
55 {
56 }
57
58 public Lazy(T value)
59 {
60 _value = value;
61 }
62
63 public Lazy(Func<T> valueFactory)
64 : this(valueFactory, LazyThreadSafetyMode.ExecutionAndPublication, useDefaultConstructor: false)
65 {
66 }
67
68 public Lazy(bool isThreadSafe)
69 : this((Func<T>)null, LazyHelper.GetModeFromIsThreadSafe(isThreadSafe), useDefaultConstructor: true)
70 {
71 }
72
74 : this((Func<T>)null, mode, useDefaultConstructor: true)
75 {
76 }
77
78 public Lazy(Func<T> valueFactory, bool isThreadSafe)
79 : this(valueFactory, LazyHelper.GetModeFromIsThreadSafe(isThreadSafe), useDefaultConstructor: false)
80 {
81 }
82
83 public Lazy(Func<T> valueFactory, LazyThreadSafetyMode mode)
84 : this(valueFactory, mode, useDefaultConstructor: false)
85 {
86 }
87
88 private Lazy(Func<T> valueFactory, LazyThreadSafetyMode mode, bool useDefaultConstructor)
89 {
90 if (valueFactory == null && !useDefaultConstructor)
91 {
92 throw new ArgumentNullException("valueFactory");
93 }
94 _factory = valueFactory;
95 _state = LazyHelper.Create(mode, useDefaultConstructor);
96 }
97
98 private void ViaConstructor()
99 {
101 _state = null;
102 }
103
105 {
106 try
107 {
108 Func<T> factory = _factory;
109 if (factory == null)
110 {
112 }
113 _factory = null;
114 _value = factory();
115 _state = null;
116 }
117 catch (Exception exception)
118 {
119 _state = new LazyHelper(mode, exception);
120 throw;
121 }
122 }
123
124 private void ExecutionAndPublication(LazyHelper executionAndPublication, bool useDefaultConstructor)
125 {
126 lock (executionAndPublication)
127 {
128 if (_state == executionAndPublication)
129 {
130 if (useDefaultConstructor)
131 {
133 }
134 else
135 {
136 ViaFactory(LazyThreadSafetyMode.ExecutionAndPublication);
137 }
138 }
139 }
140 }
141
142 private void PublicationOnly(LazyHelper publicationOnly, T possibleValue)
143 {
145 if (lazyHelper == publicationOnly)
146 {
147 _factory = null;
148 _value = possibleValue;
149 _state = null;
150 }
151 }
152
154 {
156 }
157
158 private void PublicationOnlyViaFactory(LazyHelper initializer)
159 {
160 Func<T> factory = _factory;
161 if (factory == null)
162 {
164 }
165 else
166 {
167 PublicationOnly(initializer, factory());
168 }
169 }
170
172 {
173 SpinWait spinWait = default(SpinWait);
174 while (_state != null)
175 {
176 spinWait.SpinOnce();
177 }
178 }
179
180 private T CreateValue()
181 {
183 if (state != null)
184 {
185 switch (state.State)
186 {
189 break;
190 case LazyState.NoneViaFactory:
192 break;
193 case LazyState.PublicationOnlyViaConstructor:
195 break;
196 case LazyState.PublicationOnlyViaFactory:
198 break;
199 case LazyState.PublicationOnlyWait:
201 break;
202 case LazyState.ExecutionAndPublicationViaConstructor:
203 ExecutionAndPublication(state, useDefaultConstructor: true);
204 break;
205 case LazyState.ExecutionAndPublicationViaFactory:
206 ExecutionAndPublication(state, useDefaultConstructor: false);
207 break;
208 default:
209 state.ThrowException();
210 break;
211 }
212 }
213 return Value;
214 }
215
216 public override string? ToString()
217 {
218 if (!IsValueCreated)
219 {
221 }
222 return Value.ToString();
223 }
224}
225public class Lazy<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] T, TMetadata> : Lazy<T>
226{
227 private readonly TMetadata _metadata;
228
229 public TMetadata Metadata => _metadata;
230
231 public Lazy(Func<T> valueFactory, TMetadata metadata)
232 : base(valueFactory)
233 {
234 _metadata = metadata;
235 }
236
237 public Lazy(TMetadata metadata)
238 {
239 _metadata = metadata;
240 }
241
242 public Lazy(TMetadata metadata, bool isThreadSafe)
243 : base(isThreadSafe)
244 {
245 _metadata = metadata;
246 }
247
248 public Lazy(Func<T> valueFactory, TMetadata metadata, bool isThreadSafe)
249 : base(valueFactory, isThreadSafe)
250 {
251 _metadata = metadata;
252 }
253
254 public Lazy(TMetadata metadata, LazyThreadSafetyMode mode)
255 : base(mode)
256 {
257 _metadata = metadata;
258 }
259
260 public Lazy(Func<T> valueFactory, TMetadata metadata, LazyThreadSafetyMode mode)
261 : base(valueFactory, mode)
262 {
263 _metadata = metadata;
264 }
265}
static bool GetIsValueFaulted(LazyHelper state)
Definition LazyHelper.cs:78
static readonly LazyHelper PublicationOnlyWaitForOtherThreadToPublish
Definition LazyHelper.cs:17
LazyThreadSafetyMode GetMode()
Definition LazyHelper.cs:51
static readonly LazyHelper NoneViaConstructor
Definition LazyHelper.cs:9
static LazyHelper Create(LazyThreadSafetyMode mode, bool useDefaultConstructor)
Definition LazyHelper.cs:83
T Value
Definition Lazy.cs:37
void PublicationOnlyWaitForOtherThreadToPublish()
Definition Lazy.cs:171
static T CreateViaDefaultConstructor()
Definition Lazy.cs:48
T CreateValue()
Definition Lazy.cs:180
void PublicationOnlyViaFactory(LazyHelper initializer)
Definition Lazy.cs:158
void PublicationOnly(LazyHelper publicationOnly, T possibleValue)
Definition Lazy.cs:142
Lazy(Func< T > valueFactory, TMetadata metadata)
Definition Lazy.cs:231
Lazy(Func< T > valueFactory, bool isThreadSafe)
Definition Lazy.cs:78
volatile LazyHelper _state
Definition Lazy.cs:11
Lazy(bool isThreadSafe)
Definition Lazy.cs:68
bool IsValueFaulted
Definition Lazy.cs:31
void PublicationOnlyViaConstructor(LazyHelper initializer)
Definition Lazy.cs:153
Lazy(Func< T > valueFactory, LazyThreadSafetyMode mode, bool useDefaultConstructor)
Definition Lazy.cs:88
bool IsValueCreated
Definition Lazy.cs:33
T _value
Definition Lazy.cs:15
void ViaFactory(LazyThreadSafetyMode mode)
Definition Lazy.cs:104
override? string ToString()
Definition Lazy.cs:216
Lazy(Func< T > valueFactory, TMetadata metadata, LazyThreadSafetyMode mode)
Definition Lazy.cs:260
Lazy(LazyThreadSafetyMode mode)
Definition Lazy.cs:73
Lazy(Func< T > valueFactory, TMetadata metadata, bool isThreadSafe)
Definition Lazy.cs:248
Func< T > _factory
Definition Lazy.cs:13
Lazy(Func< T > valueFactory)
Definition Lazy.cs:63
Lazy(T value)
Definition Lazy.cs:58
void ExecutionAndPublication(LazyHelper executionAndPublication, bool useDefaultConstructor)
Definition Lazy.cs:124
Lazy(Func< T > valueFactory, LazyThreadSafetyMode mode)
Definition Lazy.cs:83
Lazy(TMetadata metadata, bool isThreadSafe)
Definition Lazy.cs:242
readonly TMetadata _metadata
Definition Lazy.cs:227
T? ValueForDebugDisplay
Definition Lazy.cs:18
Lazy(TMetadata metadata, LazyThreadSafetyMode mode)
Definition Lazy.cs:254
void ViaConstructor()
Definition Lazy.cs:98
Lazy(TMetadata metadata)
Definition Lazy.cs:237
static string Lazy_Value_RecursiveCallsToValue
Definition SR.cs:1606
static string Lazy_ToString_ValueNotCreated
Definition SR.cs:1604
Definition SR.cs:7
static int CompareExchange(ref int location1, int value, int comparand)
LazyState
Definition LazyState.cs:4
@ PublicationOnlyViaConstructor