/// <summary> /// Merges two instances based on the stronger of both variabilities and the set union of their reaching definitions /// </summary> /// <param name="a">first instance</param> /// <param name="b">second instance</param> /// <returns>instance representing the merged information of both instances</returns> public static VariabilityInfo MergeDefs(VariabilityInfo a, VariabilityInfo b) { Contract.Requires(a.Definitions != null); Contract.Requires(b.Definitions != null); return(new VariabilityInfo( VariabilityOperations.Stronger(a.Variability, b.Variability), a.Definitions.Union(b.Definitions).Distinct().ToArray())); }
/// <summary> /// Two instances are defined to be equal iff they have the same variability and the same set of reaching definitions. /// </summary> /// <param name="obj">some object, possibly an instance of VariabilityInfo</param> /// <returns>whether both instances meet the equality criterion</returns> public override bool Equals(object obj) { VariabilityInfo vi = obj as VariabilityInfo; if (vi == null) { return(false); } return(Variability == vi.Variability && Definitions.SequenceEqual(vi.Definitions)); }
/// <summary> /// Merges two instances under assumption of a single reaching definition /// </summary> /// <param name="a">first instance</param> /// <param name="b">second instance</param> /// <param name="def">the one and only reaching definition</param> /// <returns>merged instance, based on the stronger of both variabilities</returns> public static VariabilityInfo MergeByNewDef(VariabilityInfo a, VariabilityInfo b, int def) { return(CreateBySingleDef( VariabilityOperations.Stronger(a.Variability, b.Variability), def)); }