public virtual int CopyTo(int offset, char[] destination, int destinationOffset, int length)
//^^ requires 0 <= offset;
//^^ requires 0 <= destinationOffset;
//^^ requires 0 <= length;
//^^ requires 0 <= offset+length;
//^^ requires 0 <= destinationOffset+length;
//^^ requires destinationOffset+length <= destination.Length;
//^^ ensures 0 <= result && result <= length && offset+result <= this.Length;
//^^ ensures result < length ==> offset+result == this.Length;
{
if (offset + length > this.Length) length = this.Length - offset;
ISourceDocument sourceDocument = this.SourceDocument;
//^ assume 0 <= length; //follows from the preconditions
int position = this.startIndex + offset;
//^ assume position <= sourceDocument.Length; //follows from invariant
int result = sourceDocument.CopyTo(position, destination, destinationOffset, length);
//^ assert 0 <= result;
//^ assume offset+length <= this.Length; //follows from the precondition
//^ assert result <= length;
//^ assert offset+result <= this.Length;
//^ assume false; //unsatisfied postcondition: ensures 0 <= result && result <= length && offset+result <= this.Length;
return result;
}