/// <summary> /// A copy constructor that allocates an instance that is the same as the given template, except for its containing block. /// </summary> /// <param name="containingBlock">The containing block of the copied precondition. This should be different from the containing block of the template precondition.</param> /// <param name="template">The statement to copy.</param> private LoopInvariant(BlockStatement containingBlock, LoopInvariant template) : base(containingBlock, template) { }
/// <summary> /// Visits the specified loop invariant. /// </summary> /// <param name="loopInvariant">The loop invariant.</param> /// <returns></returns> protected virtual ILoopInvariant DeepCopy(LoopInvariant loopInvariant) { loopInvariant.Condition = this.Substitute(loopInvariant.Condition); if (loopInvariant.Description != null) loopInvariant.Description = this.Substitute(loopInvariant.Description); return loopInvariant; }
/// <summary> /// Get the mutable copy of a loop invariant. /// </summary> /// <param name="loopInvariant"></param> /// <returns></returns> public virtual LoopInvariant GetMutableCopy(ILoopInvariant loopInvariant) { object cachedValue; if (this.cache.TryGetValue(loopInvariant, out cachedValue)) return (LoopInvariant)cachedValue; var result = new LoopInvariant(loopInvariant); // Probably not necessary, no two loop invariants are shared. this.cache.Add(loopInvariant, result); this.cache.Add(result, result); return result; }
/// <summary> /// Rewrites the children of the given loop invariant. /// </summary> public virtual void RewriteChildren(LoopInvariant loopInvariant) { this.RewriteChildren((ContractElement)loopInvariant); }
/// <summary> /// Visits the specified loop invariant. /// </summary> /// <param name="loopInvariant">The loop invariant.</param> /// <returns></returns> public virtual ILoopInvariant Visit(LoopInvariant loopInvariant) { loopInvariant.Condition = this.Visit(loopInvariant.Condition); if (loopInvariant.Description != null) loopInvariant.Description = this.Visit(loopInvariant.Description); return loopInvariant; }
/// <summary> /// Visits the specified loop invariant. /// </summary> /// <param name="loopInvariant">The loop invariant.</param> /// <returns></returns> public virtual ILoopInvariant Visit(ILoopInvariant loopInvariant) { LoopInvariant mutableLoopInvariant = loopInvariant as LoopInvariant; if (!this.copyOnlyIfNotAlreadyMutable || mutableLoopInvariant == null) mutableLoopInvariant = new LoopInvariant(loopInvariant); return this.Visit(mutableLoopInvariant); }