-
Notifications
You must be signed in to change notification settings - Fork 237
Expand file tree
/
Copy pathBindingContext.Pool.cs
More file actions
70 lines (56 loc) · 2.5 KB
/
BindingContext.Pool.cs
File metadata and controls
70 lines (56 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using HandlebarsDotNet.Compiler;
using HandlebarsDotNet.Pools;
namespace HandlebarsDotNet
{
public sealed partial class BindingContext
{
private static readonly BindingContextPool Pool = new BindingContextPool();
internal static BindingContext Create(ICompiledHandlebarsConfiguration configuration, object value)
{
return Pool.CreateContext(configuration, value, null, null);
}
internal static BindingContext Create(ICompiledHandlebarsConfiguration configuration, object value, BindingContext parent,
TemplateDelegate partialBlockTemplate)
{
return Pool.CreateContext(configuration, value, parent, partialBlockTemplate);
}
public void Dispose() => Pool.Return(this);
private class BindingContextPool : InternalObjectPool<BindingContext, BindingContextPool.BindingContextPolicy>
{
public BindingContextPool() : base(new BindingContextPolicy())
{
}
public BindingContext CreateContext(ICompiledHandlebarsConfiguration configuration, object value, BindingContext parent, TemplateDelegate partialBlockTemplate)
{
var context = Get();
context.Configuration = configuration;
context.Value = value;
context.ParentContext = parent;
context.PartialBlockTemplate = partialBlockTemplate;
context.PartialDepth = parent?.PartialDepth ?? 0;
context.Initialize();
return context;
}
internal struct BindingContextPolicy : IInternalObjectPoolPolicy<BindingContext>
{
public BindingContext Create() => new BindingContext();
public bool Return(BindingContext item)
{
item.Configuration = null;
item.Root = null;
item.Value = null;
item.ParentContext = null;
item.PartialBlockTemplate = null;
item.InlinePartialTemplates.Clear();
item.Helpers.Clear();
item.BlockHelpers.Clear();
item.Bag.Clear();
item.BlockParamsObject.OptionalClear();
item.ContextDataObject.OptionalClear();
item.Descriptor.Reset();
return true;
}
}
}
}
}