/// <summary> /// Makes a copy of this contract, changing the containing block to the given block. /// </summary> public LoopContract MakeCopyFor(BlockStatement containingBlock) { if (this.containingBlock == containingBlock) return this; LoopContract result = new LoopContract(this); result.SetContainingBlock(containingBlock); return result; }
/// <summary> /// A copy constructor that allocates an instance that is the same as the given template. /// </summary> /// <param name="template">The template to copy.</param> private LoopContract(LoopContract template) { if (template.invariants != EmptyListOfInvariants) this.invariants = new List<LoopInvariant>(template.invariants); else this.invariants = template.invariants; if (template.writes != null) this.writes = new List<Expression>(template.writes); if (template.variants != EmptyListOfVariants) this.variants = new List<Expression>(template.variants); else this.variants = template.variants; }
/// <summary> /// Visits the specified loop contract. /// </summary> /// <param name="loopContract">The loop contract.</param> /// <returns></returns> protected virtual ILoopContract DeepCopy(LoopContract loopContract) { loopContract.Invariants = this.DeepCopy(loopContract.Invariants); loopContract.Writes = this.DeepCopy(loopContract.Writes); return loopContract; }
/// <summary> /// Rewrites the children of the given loop contract. /// </summary> public virtual void RewriteChildren(LoopContract loopContract) { loopContract.Invariants = this.Rewrite(loopContract.Invariants); loopContract.Variants = this.Rewrite(loopContract.Variants); loopContract.Writes = this.Rewrite(loopContract.Writes); }
/// <summary> /// Visits the specified loop contract. /// </summary> /// <param name="loopContract">The loop contract.</param> /// <returns></returns> public virtual ILoopContract Visit(LoopContract loopContract) { loopContract.Invariants = this.Visit(loopContract.Invariants); loopContract.Writes = this.Visit(loopContract.Writes); return loopContract; }
/// <summary> /// Visits the specified loop contract. /// </summary> /// <param name="loopContract">The loop contract.</param> /// <returns></returns> public virtual ILoopContract Visit(ILoopContract loopContract) { LoopContract mutableLoopContract = loopContract as LoopContract; if (!this.copyOnlyIfNotAlreadyMutable || mutableLoopContract == null) mutableLoopContract = new LoopContract(loopContract); return this.Visit(mutableLoopContract); }