< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 31
Coverable lines: 31
Total lines: 72
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 2
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%110%
Free()0%220%
ToStringAndFree()100%110%
.cctor()100%110%
CreatePool()100%110%
GetInstance()100%110%

File(s)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/src/libraries/System.Reflection.Metadata/src/System/Reflection/Internal/Utilities/PooledStringBuilder.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Diagnostics;
 5using System.Text;
 6
 7namespace System.Reflection.Internal
 8{
 9    /// <summary>
 10    /// The usage is:
 11    ///        var inst = PooledStringBuilder.GetInstance();
 12    ///        var sb = inst.builder;
 13    ///        ... Do Stuff...
 14    ///        ... sb.ToString() ...
 15    ///        inst.Free();
 16    /// </summary>
 17    internal sealed class PooledStringBuilder
 18    {
 019        public readonly StringBuilder Builder = new StringBuilder();
 20        private readonly ObjectPool<PooledStringBuilder> _pool;
 21
 022        private PooledStringBuilder(ObjectPool<PooledStringBuilder> pool)
 023        {
 024            Debug.Assert(pool != null);
 025            _pool = pool;
 026        }
 27
 28        public int Length
 29        {
 030            get { return this.Builder.Length; }
 31        }
 32
 33        public void Free()
 034        {
 035            var builder = this.Builder;
 36
 37            // do not store builders that are too large.
 038            if (builder.Capacity <= 1024)
 039            {
 040                builder.Clear();
 041                _pool.Free(this);
 042            }
 043        }
 44
 45        public string ToStringAndFree()
 046        {
 047            string result = this.Builder.ToString();
 048            this.Free();
 49
 050            return result;
 051        }
 52
 53        // global pool
 054        private static readonly ObjectPool<PooledStringBuilder> s_poolInstance = CreatePool();
 55
 56        // if someone needs to create a private pool;
 57        public static ObjectPool<PooledStringBuilder> CreatePool()
 058        {
 059            ObjectPool<PooledStringBuilder>? pool = null;
 060            pool = new ObjectPool<PooledStringBuilder>(() => new PooledStringBuilder(pool!), 32);
 061            return pool;
 062        }
 63
 64        public static PooledStringBuilder GetInstance()
 065        {
 066            var builder = s_poolInstance.Allocate();
 067            Debug.Assert(builder.Builder.Length == 0);
 068            return builder;
 069        }
 70    }
 71}
 72