/// <summary> /// Add the given string to the cache or return the existing string if it is already /// in the cache. /// Constant time operation. /// </summary> public string Add(string key, XmlDocument document) { if (key.Length == 0) { return(String.Empty); } // see Microsoft.Build.BackEnd.BuildRequestConfiguration.CreateUniqueGlobalProperty if (key.StartsWith(MSBuildConstants.MSBuildDummyGlobalPropertyHeader, StringComparison.Ordinal)) { return(key); } lock (_locker) { VerifyState(); StringCacheEntry entry; HashSet <StringCacheEntry> entries; bool seenString = _strings.TryGetValue(key, out entry); bool seenDocument = _documents.TryGetValue(document, out entries); if (!seenString) { entry = new StringCacheEntry(key); _strings.Add(entry); } if (!seenDocument) { entries = new HashSet <StringCacheEntry>(); _documents.Add(document, entries); } bool seenStringInThisDocument = seenString && seenDocument && entries.Contains(entry); if (!seenStringInThisDocument) { entries.Add(entry); // We've been referred to by a new document, so increment our ref count. entry.Increment(); } VerifyState(); return(entry.CachedString); } }
/// <summary> /// Add the given string to the cache or return the existing string if it is already /// in the cache. /// Constant time operation. /// </summary> public string Add(string key, XmlDocument document) { if (key.Length == 0) { return(String.Empty); } lock (_locker) { VerifyState(); StringCacheEntry entry; HashSet <StringCacheEntry> entries; bool seenString = _strings.TryGetValue(key, out entry); bool seenDocument = _documents.TryGetValue(document, out entries); if (!seenString) { entry = new StringCacheEntry(key); _strings.Add(entry); } if (!seenDocument) { entries = new HashSet <StringCacheEntry>(); _documents.Add(document, entries); } bool seenStringInThisDocument = seenString && seenDocument && entries.Contains(entry); if (!seenStringInThisDocument) { entries.Add(entry); // We've been referred to by a new document, so increment our ref count. entry.Increment(); } VerifyState(); return(entry.CachedString); } }
/// <summary> /// Add the given string to the cache or return the existing string if it is already /// in the cache. /// Constant time operation. /// </summary> public string Add(string key, XmlDocument document) { if (key.Length == 0) { return String.Empty; } lock (_locker) { VerifyState(); StringCacheEntry entry; HashSet<StringCacheEntry> entries; bool seenString = _strings.TryGetValue(key, out entry); bool seenDocument = _documents.TryGetValue(document, out entries); if (!seenString) { entry = new StringCacheEntry(key); _strings.Add(entry); } if (!seenDocument) { entries = new HashSet<StringCacheEntry>(); _documents.Add(document, entries); } bool seenStringInThisDocument = seenString && seenDocument && entries.Contains(entry); if (!seenStringInThisDocument) { entries.Add(entry); // We've been referred to by a new document, so increment our ref count. entry.Increment(); } VerifyState(); return entry.CachedString; } }