// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package flate // forwardCopy is like the built-in copy function except that it always goes // forward from the start, even if the dst and src overlap. // It is equivalent to: // for i := 0; i < n; i++ { // mem[dst+i] = mem[src+i] // } func forwardCopy(mem []byte, dst, src, n int) { if dst <= src { copy(mem[dst:dst+n], mem[src:src+n]) return } for { if dst >= src+n { copy(mem[dst:dst+n], mem[src:src+n]) return } // There is some forward overlap. The destination // will be filled with a repeated pattern of mem[src:src+k]. // We copy one instance of the pattern here, then repeat. // Each time around this loop k will double. k := dst - src copy(mem[dst:dst+k], mem[src:src+k]) n -= k dst += k } }