| // Copyright ©2015 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // TODO(kortschak): Generate this file from shadow.go when all complex type are available. |
| |
| package mat |
| |
| import "gonum.org/v1/gonum/blas/cblas128" |
| |
| // checkOverlapComplex returns false if the receiver does not overlap data elements |
| // referenced by the parameter and panics otherwise. |
| // |
| // checkOverlapComplex methods return a boolean to allow the check call to be added to a |
| // boolean expression, making use of short-circuit operators. |
| func checkOverlapComplex(a, b cblas128.General) bool { |
| if cap(a.Data) == 0 || cap(b.Data) == 0 { |
| return false |
| } |
| |
| off := offsetComplex(a.Data[:1], b.Data[:1]) |
| |
| if off == 0 { |
| // At least one element overlaps. |
| if a.Cols == b.Cols && a.Rows == b.Rows && a.Stride == b.Stride { |
| panic(regionIdentity) |
| } |
| panic(regionOverlap) |
| } |
| |
| if off > 0 && len(a.Data) <= off { |
| // We know a is completely before b. |
| return false |
| } |
| if off < 0 && len(b.Data) <= -off { |
| // We know a is completely after b. |
| return false |
| } |
| |
| if a.Stride != b.Stride && a.Stride != 1 && b.Stride != 1 { |
| // Too hard, so assume the worst; if either stride |
| // is one it will be caught in rectanglesOverlap. |
| panic(mismatchedStrides) |
| } |
| |
| if off < 0 { |
| off = -off |
| a.Cols, b.Cols = b.Cols, a.Cols |
| } |
| if rectanglesOverlap(off, a.Cols, b.Cols, min(a.Stride, b.Stride)) { |
| panic(regionOverlap) |
| } |
| return false |
| } |
| |
| func (m *CDense) checkOverlapComplex(a cblas128.General) bool { |
| return checkOverlapComplex(m.RawCMatrix(), a) |
| } |
| |
| func (m *CDense) checkOverlapMatrix(a CMatrix) bool { |
| if m == a { |
| return false |
| } |
| var amat cblas128.General |
| switch ar := a.(type) { |
| default: |
| return false |
| case RawCMatrixer: |
| amat = ar.RawCMatrix() |
| } |
| return m.checkOverlapComplex(amat) |
| } |