|
276 | 276 | <span class="source-line-no">263</span><span id="line-263"> private ComputableValue<T> createComputableValue( @Nonnull final Object... args )</span> |
277 | 277 | <span class="source-line-no">264</span><span id="line-264"> {</span> |
278 | 278 | <span class="source-line-no">265</span><span id="line-265"> final Component component = Arez.areNativeComponentsEnabled() ? _component : null;</span> |
279 | | -<span class="source-line-no">266</span><span id="line-266"> final String name = Arez.areNamesEnabled() ? _name + "." + _nextIndex++ : null;</span> |
280 | | -<span class="source-line-no">267</span><span id="line-267"> final SafeFunction<T> function = () -> {</span> |
281 | | -<span class="source-line-no">268</span><span id="line-268"> Arez.context().registerHook( "$MC$", null, () -> disposeComputableValue( args ) );</span> |
282 | | -<span class="source-line-no">269</span><span id="line-269"> return _function.call( args );</span> |
283 | | -<span class="source-line-no">270</span><span id="line-270"> };</span> |
284 | | -<span class="source-line-no">271</span><span id="line-271"> final ComputableValue<T> computable = getContext().computable( component, name, function, _flags );</span> |
285 | | -<span class="source-line-no">272</span><span id="line-272"> for ( final Object arg : args )</span> |
286 | | -<span class="source-line-no">273</span><span id="line-273"> {</span> |
287 | | -<span class="source-line-no">274</span><span id="line-274"> if ( arg instanceof DisposeNotifier )</span> |
288 | | -<span class="source-line-no">275</span><span id="line-275"> {</span> |
289 | | -<span class="source-line-no">276</span><span id="line-276"> DisposeNotifier.asDisposeNotifier( arg ).addOnDisposeListener( "MemoizeCache", computable::dispose );</span> |
290 | | -<span class="source-line-no">277</span><span id="line-277"> }</span> |
291 | | -<span class="source-line-no">278</span><span id="line-278"> }</span> |
292 | | -<span class="source-line-no">279</span><span id="line-279"> return computable;</span> |
293 | | -<span class="source-line-no">280</span><span id="line-280"> }</span> |
294 | | -<span class="source-line-no">281</span><span id="line-281"></span> |
295 | | -<span class="source-line-no">282</span><span id="line-282"> /**</span> |
296 | | -<span class="source-line-no">283</span><span id="line-283"> * Method invoked to dispose memoized value.</span> |
297 | | -<span class="source-line-no">284</span><span id="line-284"> * This is called from deactivate hook so there should always by a cached value present</span> |
298 | | -<span class="source-line-no">285</span><span id="line-285"> * and thus we never check for missing elements in chain.</span> |
299 | | -<span class="source-line-no">286</span><span id="line-286"> *</span> |
300 | | -<span class="source-line-no">287</span><span id="line-287"> * @param args the arguments originally passed to the memoized function.</span> |
301 | | -<span class="source-line-no">288</span><span id="line-288"> */</span> |
302 | | -<span class="source-line-no">289</span><span id="line-289"> @SuppressWarnings( "unchecked" )</span> |
303 | | -<span class="source-line-no">290</span><span id="line-290"> void disposeComputableValue( @Nonnull final Object... args )</span> |
304 | | -<span class="source-line-no">291</span><span id="line-291"> {</span> |
305 | | -<span class="source-line-no">292</span><span id="line-292"> if ( Arez.shouldCheckInvariants() )</span> |
306 | | -<span class="source-line-no">293</span><span id="line-293"> {</span> |
307 | | -<span class="source-line-no">294</span><span id="line-294"> invariant( () -> args.length == _argCount,</span> |
308 | | -<span class="source-line-no">295</span><span id="line-295"> () -> "Arez-0163: MemoizeCache.disposeComputableValue called with " + args.length +</span> |
309 | | -<span class="source-line-no">296</span><span id="line-296"> " argument(s) but expected " + _argCount + " argument(s)." );</span> |
310 | | -<span class="source-line-no">297</span><span id="line-297"> }</span> |
311 | | -<span class="source-line-no">298</span><span id="line-298"> if ( _disposed )</span> |
312 | | -<span class="source-line-no">299</span><span id="line-299"> {</span> |
313 | | -<span class="source-line-no">300</span><span id="line-300"> return;</span> |
314 | | -<span class="source-line-no">301</span><span id="line-301"> }</span> |
315 | | -<span class="source-line-no">302</span><span id="line-302"> final Stack<Map<Object, ?>> stack = new Stack<>();</span> |
316 | | -<span class="source-line-no">303</span><span id="line-303"> stack.push( _cache );</span> |
317 | | -<span class="source-line-no">304</span><span id="line-304"> final int size = args.length - 1;</span> |
318 | | -<span class="source-line-no">305</span><span id="line-305"> for ( int i = 0; i < size; i++ )</span> |
319 | | -<span class="source-line-no">306</span><span id="line-306"> {</span> |
320 | | -<span class="source-line-no">307</span><span id="line-307"> stack.push( (Map<Object, ?>) stack.peek().get( args[ i ] ) );</span> |
321 | | -<span class="source-line-no">308</span><span id="line-308"> }</span> |
322 | | -<span class="source-line-no">309</span><span id="line-309"> final ComputableValue<T> computableValue = (ComputableValue<T>) stack.peek().remove( args[ size ] );</span> |
323 | | -<span class="source-line-no">310</span><span id="line-310"> if ( Arez.shouldCheckInvariants() )</span> |
324 | | -<span class="source-line-no">311</span><span id="line-311"> {</span> |
325 | | -<span class="source-line-no">312</span><span id="line-312"> invariant( () -> null != computableValue,</span> |
326 | | -<span class="source-line-no">313</span><span id="line-313"> () -> "Arez-0193: MemoizeCache.disposeComputableValue called with args " + Arrays.asList( args ) +</span> |
327 | | -<span class="source-line-no">314</span><span id="line-314"> " but unable to locate corresponding ComputableValue." );</span> |
328 | | -<span class="source-line-no">315</span><span id="line-315"> }</span> |
329 | | -<span class="source-line-no">316</span><span id="line-316"> assert null != computableValue;</span> |
330 | | -<span class="source-line-no">317</span><span id="line-317"> getContext().task( Arez.areNamesEnabled() ? computableValue.getName() + ".dispose" : null,</span> |
331 | | -<span class="source-line-no">318</span><span id="line-318"> computableValue::dispose,</span> |
332 | | -<span class="source-line-no">319</span><span id="line-319"> Task.Flags.PRIORITY_HIGHEST | Task.Flags.DISPOSE_ON_COMPLETE | Task.Flags.NO_WRAP_TASK );</span> |
333 | | -<span class="source-line-no">320</span><span id="line-320"> while ( stack.size() > 1 )</span> |
334 | | -<span class="source-line-no">321</span><span id="line-321"> {</span> |
335 | | -<span class="source-line-no">322</span><span id="line-322"> final Map<Object, ?> map = stack.pop();</span> |
336 | | -<span class="source-line-no">323</span><span id="line-323"> if ( map.isEmpty() )</span> |
337 | | -<span class="source-line-no">324</span><span id="line-324"> {</span> |
338 | | -<span class="source-line-no">325</span><span id="line-325"> stack.peek().remove( args[ stack.size() - 1 ] );</span> |
339 | | -<span class="source-line-no">326</span><span id="line-326"> }</span> |
340 | | -<span class="source-line-no">327</span><span id="line-327"> else</span> |
341 | | -<span class="source-line-no">328</span><span id="line-328"> {</span> |
342 | | -<span class="source-line-no">329</span><span id="line-329"> return;</span> |
343 | | -<span class="source-line-no">330</span><span id="line-330"> }</span> |
344 | | -<span class="source-line-no">331</span><span id="line-331"> }</span> |
345 | | -<span class="source-line-no">332</span><span id="line-332"> }</span> |
346 | | -<span class="source-line-no">333</span><span id="line-333"></span> |
347 | | -<span class="source-line-no">334</span><span id="line-334"> @OmitSymbol</span> |
348 | | -<span class="source-line-no">335</span><span id="line-335"> Map<Object, Object> getCache()</span> |
349 | | -<span class="source-line-no">336</span><span id="line-336"> {</span> |
350 | | -<span class="source-line-no">337</span><span id="line-337"> return _cache;</span> |
351 | | -<span class="source-line-no">338</span><span id="line-338"> }</span> |
352 | | -<span class="source-line-no">339</span><span id="line-339"></span> |
353 | | -<span class="source-line-no">340</span><span id="line-340"> @OmitSymbol</span> |
354 | | -<span class="source-line-no">341</span><span id="line-341"> int getNextIndex()</span> |
355 | | -<span class="source-line-no">342</span><span id="line-342"> {</span> |
356 | | -<span class="source-line-no">343</span><span id="line-343"> return _nextIndex;</span> |
357 | | -<span class="source-line-no">344</span><span id="line-344"> }</span> |
358 | | -<span class="source-line-no">345</span><span id="line-345"></span> |
359 | | -<span class="source-line-no">346</span><span id="line-346"> @OmitSymbol</span> |
360 | | -<span class="source-line-no">347</span><span id="line-347"> int getFlags()</span> |
361 | | -<span class="source-line-no">348</span><span id="line-348"> {</span> |
362 | | -<span class="source-line-no">349</span><span id="line-349"> return _flags;</span> |
363 | | -<span class="source-line-no">350</span><span id="line-350"> }</span> |
364 | | -<span class="source-line-no">351</span><span id="line-351">}</span> |
| 279 | +<span class="source-line-no">266</span><span id="line-266"> final int id = _nextIndex++;</span> |
| 280 | +<span class="source-line-no">267</span><span id="line-267"> final String name = Arez.areNamesEnabled() ? _name + "." + id : null;</span> |
| 281 | +<span class="source-line-no">268</span><span id="line-268"> final SafeFunction<T> function = () -> {</span> |
| 282 | +<span class="source-line-no">269</span><span id="line-269"> Arez.context().registerHook( "$MC$", null, () -> disposeComputableValue( args ) );</span> |
| 283 | +<span class="source-line-no">270</span><span id="line-270"> return _function.call( args );</span> |
| 284 | +<span class="source-line-no">271</span><span id="line-271"> };</span> |
| 285 | +<span class="source-line-no">272</span><span id="line-272"> final ComputableValue<T> computable = getContext().computable( component, name, function, _flags );</span> |
| 286 | +<span class="source-line-no">273</span><span id="line-273"> for ( final Object arg : args )</span> |
| 287 | +<span class="source-line-no">274</span><span id="line-274"> {</span> |
| 288 | +<span class="source-line-no">275</span><span id="line-275"> if ( arg instanceof DisposeNotifier )</span> |
| 289 | +<span class="source-line-no">276</span><span id="line-276"> {</span> |
| 290 | +<span class="source-line-no">277</span><span id="line-277"> DisposeNotifier.asDisposeNotifier( arg ).addOnDisposeListener( "MemoizeCache" + id, computable::dispose );</span> |
| 291 | +<span class="source-line-no">278</span><span id="line-278"> }</span> |
| 292 | +<span class="source-line-no">279</span><span id="line-279"> }</span> |
| 293 | +<span class="source-line-no">280</span><span id="line-280"> return computable;</span> |
| 294 | +<span class="source-line-no">281</span><span id="line-281"> }</span> |
| 295 | +<span class="source-line-no">282</span><span id="line-282"></span> |
| 296 | +<span class="source-line-no">283</span><span id="line-283"> /**</span> |
| 297 | +<span class="source-line-no">284</span><span id="line-284"> * Method invoked to dispose memoized value.</span> |
| 298 | +<span class="source-line-no">285</span><span id="line-285"> * This is called from deactivate hook so there should always by a cached value present</span> |
| 299 | +<span class="source-line-no">286</span><span id="line-286"> * and thus we never check for missing elements in chain.</span> |
| 300 | +<span class="source-line-no">287</span><span id="line-287"> *</span> |
| 301 | +<span class="source-line-no">288</span><span id="line-288"> * @param args the arguments originally passed to the memoized function.</span> |
| 302 | +<span class="source-line-no">289</span><span id="line-289"> */</span> |
| 303 | +<span class="source-line-no">290</span><span id="line-290"> @SuppressWarnings( "unchecked" )</span> |
| 304 | +<span class="source-line-no">291</span><span id="line-291"> void disposeComputableValue( @Nonnull final Object... args )</span> |
| 305 | +<span class="source-line-no">292</span><span id="line-292"> {</span> |
| 306 | +<span class="source-line-no">293</span><span id="line-293"> if ( Arez.shouldCheckInvariants() )</span> |
| 307 | +<span class="source-line-no">294</span><span id="line-294"> {</span> |
| 308 | +<span class="source-line-no">295</span><span id="line-295"> invariant( () -> args.length == _argCount,</span> |
| 309 | +<span class="source-line-no">296</span><span id="line-296"> () -> "Arez-0163: MemoizeCache.disposeComputableValue called with " + args.length +</span> |
| 310 | +<span class="source-line-no">297</span><span id="line-297"> " argument(s) but expected " + _argCount + " argument(s)." );</span> |
| 311 | +<span class="source-line-no">298</span><span id="line-298"> }</span> |
| 312 | +<span class="source-line-no">299</span><span id="line-299"> if ( _disposed )</span> |
| 313 | +<span class="source-line-no">300</span><span id="line-300"> {</span> |
| 314 | +<span class="source-line-no">301</span><span id="line-301"> return;</span> |
| 315 | +<span class="source-line-no">302</span><span id="line-302"> }</span> |
| 316 | +<span class="source-line-no">303</span><span id="line-303"> final Stack<Map<Object, ?>> stack = new Stack<>();</span> |
| 317 | +<span class="source-line-no">304</span><span id="line-304"> stack.push( _cache );</span> |
| 318 | +<span class="source-line-no">305</span><span id="line-305"> final int size = args.length - 1;</span> |
| 319 | +<span class="source-line-no">306</span><span id="line-306"> for ( int i = 0; i < size; i++ )</span> |
| 320 | +<span class="source-line-no">307</span><span id="line-307"> {</span> |
| 321 | +<span class="source-line-no">308</span><span id="line-308"> stack.push( (Map<Object, ?>) stack.peek().get( args[ i ] ) );</span> |
| 322 | +<span class="source-line-no">309</span><span id="line-309"> }</span> |
| 323 | +<span class="source-line-no">310</span><span id="line-310"> final ComputableValue<T> computableValue = (ComputableValue<T>) stack.peek().remove( args[ size ] );</span> |
| 324 | +<span class="source-line-no">311</span><span id="line-311"> if ( Arez.shouldCheckInvariants() )</span> |
| 325 | +<span class="source-line-no">312</span><span id="line-312"> {</span> |
| 326 | +<span class="source-line-no">313</span><span id="line-313"> invariant( () -> null != computableValue,</span> |
| 327 | +<span class="source-line-no">314</span><span id="line-314"> () -> "Arez-0193: MemoizeCache.disposeComputableValue called with args " + Arrays.asList( args ) +</span> |
| 328 | +<span class="source-line-no">315</span><span id="line-315"> " but unable to locate corresponding ComputableValue." );</span> |
| 329 | +<span class="source-line-no">316</span><span id="line-316"> }</span> |
| 330 | +<span class="source-line-no">317</span><span id="line-317"> assert null != computableValue;</span> |
| 331 | +<span class="source-line-no">318</span><span id="line-318"> getContext().task( Arez.areNamesEnabled() ? computableValue.getName() + ".dispose" : null,</span> |
| 332 | +<span class="source-line-no">319</span><span id="line-319"> computableValue::dispose,</span> |
| 333 | +<span class="source-line-no">320</span><span id="line-320"> Task.Flags.PRIORITY_HIGHEST | Task.Flags.DISPOSE_ON_COMPLETE | Task.Flags.NO_WRAP_TASK );</span> |
| 334 | +<span class="source-line-no">321</span><span id="line-321"> while ( stack.size() > 1 )</span> |
| 335 | +<span class="source-line-no">322</span><span id="line-322"> {</span> |
| 336 | +<span class="source-line-no">323</span><span id="line-323"> final Map<Object, ?> map = stack.pop();</span> |
| 337 | +<span class="source-line-no">324</span><span id="line-324"> if ( map.isEmpty() )</span> |
| 338 | +<span class="source-line-no">325</span><span id="line-325"> {</span> |
| 339 | +<span class="source-line-no">326</span><span id="line-326"> stack.peek().remove( args[ stack.size() - 1 ] );</span> |
| 340 | +<span class="source-line-no">327</span><span id="line-327"> }</span> |
| 341 | +<span class="source-line-no">328</span><span id="line-328"> else</span> |
| 342 | +<span class="source-line-no">329</span><span id="line-329"> {</span> |
| 343 | +<span class="source-line-no">330</span><span id="line-330"> return;</span> |
| 344 | +<span class="source-line-no">331</span><span id="line-331"> }</span> |
| 345 | +<span class="source-line-no">332</span><span id="line-332"> }</span> |
| 346 | +<span class="source-line-no">333</span><span id="line-333"> }</span> |
| 347 | +<span class="source-line-no">334</span><span id="line-334"></span> |
| 348 | +<span class="source-line-no">335</span><span id="line-335"> @OmitSymbol</span> |
| 349 | +<span class="source-line-no">336</span><span id="line-336"> Map<Object, Object> getCache()</span> |
| 350 | +<span class="source-line-no">337</span><span id="line-337"> {</span> |
| 351 | +<span class="source-line-no">338</span><span id="line-338"> return _cache;</span> |
| 352 | +<span class="source-line-no">339</span><span id="line-339"> }</span> |
| 353 | +<span class="source-line-no">340</span><span id="line-340"></span> |
| 354 | +<span class="source-line-no">341</span><span id="line-341"> @OmitSymbol</span> |
| 355 | +<span class="source-line-no">342</span><span id="line-342"> int getNextIndex()</span> |
| 356 | +<span class="source-line-no">343</span><span id="line-343"> {</span> |
| 357 | +<span class="source-line-no">344</span><span id="line-344"> return _nextIndex;</span> |
| 358 | +<span class="source-line-no">345</span><span id="line-345"> }</span> |
| 359 | +<span class="source-line-no">346</span><span id="line-346"></span> |
| 360 | +<span class="source-line-no">347</span><span id="line-347"> @OmitSymbol</span> |
| 361 | +<span class="source-line-no">348</span><span id="line-348"> int getFlags()</span> |
| 362 | +<span class="source-line-no">349</span><span id="line-349"> {</span> |
| 363 | +<span class="source-line-no">350</span><span id="line-350"> return _flags;</span> |
| 364 | +<span class="source-line-no">351</span><span id="line-351"> }</span> |
| 365 | +<span class="source-line-no">352</span><span id="line-352">}</span> |
365 | 366 |
|
366 | 367 |
|
367 | 368 |
|
|
0 commit comments