/// <summary> /// Adds the fact that a path is produced by a given producer. /// </summary> public void Add(AbsolutePath path, PipStableId producer) { m_producedPaths.AddOrUpdate( producer, path, (pip, pathToAdd) => { var set = new HashSet <AbsolutePath> { pathToAdd }; m_pipProducers.TryAdd(pathToAdd, pip); return(set); }, (pip, pathToAdd, existingSet) => { if (existingSet.Add(pathToAdd)) { m_pipProducers.TryAdd(pathToAdd, pip); } return(existingSet); }); }
/// <summary> /// Tries to remove producer. /// </summary> public bool TryRemoveProducer(PipStableId producer) { if (m_producedPaths.ContainsKey(producer)) { m_producedPaths.AddOrUpdate( producer, (HashSet <AbsolutePath>)null, (p, nullValue) => new HashSet <AbsolutePath>(), (p, nullValue, existingSet) => { foreach (var path in existingSet) { m_pipProducers.TryRemove(path, out var dummyId); } return(new HashSet <AbsolutePath>()); }); return(true); } return(false); }
/// <summary> /// Tries to remove producer by path. /// </summary> public bool TryRemoveProducer(AbsolutePath path, out PipStableId producer) => m_pipProducers.TryGetValue(path, out producer) && TryRemoveProducer(producer);
/// <summary> /// Tries to get producer. /// </summary> public bool TryGetProducer(AbsolutePath path, out PipStableId producer) { return(m_pipProducers.TryGetValue(path, out producer)); }
/// <summary> /// Gets text format of pip stable id. /// </summary> public static string GetPipIdText(PipOrigins pipOrigins, PipStableId pipStableId) { Contract.Requires(pipOrigins != null); return(pipOrigins.TryGetFingerprint(pipStableId, out ContentFingerprint fingerprint) ? I($"FP:{fingerprint.ToString()}") : I($"PIP_ID:{pipStableId}")); }
/// <summary> /// Writes pip fingerprint, given its stable id. /// </summary> public static void WritePipFingerprint(TextWriter writer, PipOrigins pipOrigins, PipStableId pipStableId) { Contract.Requires(writer != null); Contract.Requires(pipOrigins != null); writer.Write(GetPipIdText(pipOrigins, pipStableId)); }
/// <summary> /// Writes <see cref="PipStableId"/>. /// </summary> internal static void Write(this BinaryWriter writer, PipStableId pipStableId) => writer.Write((int)pipStableId);