| 462 | } |
| 463 | |
| 464 | Status Literal::MoveFrom(Literal&& src_literal, |
| 465 | const ShapeIndex& dest_shape_index) { |
| 466 | const Shape& dest_subshape = |
| 467 | ShapeUtil::GetSubshape(shape(), dest_shape_index); |
| 468 | if (!ShapeUtil::Equal(dest_subshape, src_literal.shape())) { |
| 469 | return InvalidArgument( |
| 470 | "Destination subshape not equal to source shape: %s vs %s", |
| 471 | ShapeUtil::HumanString(dest_subshape), |
| 472 | ShapeUtil::HumanString(src_literal.shape())); |
| 473 | } |
| 474 | |
| 475 | src_literal.root_piece_->ForEachSubpiece( |
| 476 | [&](const ShapeIndex& src_index, const Piece& src_piece) { |
| 477 | if (!src_piece.subshape().IsArray()) { |
| 478 | return; |
| 479 | } |
| 480 | |
| 481 | ShapeIndex dest_index = dest_shape_index; |
| 482 | for (int64 i : src_index) { |
| 483 | dest_index.push_back(i); |
| 484 | } |
| 485 | Piece& dest_piece = piece(dest_index); |
| 486 | tensorflow::port::AlignedFree(dest_piece.buffer()); |
| 487 | dest_piece.set_buffer(src_piece.buffer()); |
| 488 | }); |
| 489 | |
| 490 | src_literal.shape_ = absl::make_unique<Shape>(ShapeUtil::MakeNil()); |
| 491 | delete src_literal.root_piece_; |
| 492 | src_literal.root_piece_ = new LiteralBase::Piece(); |
| 493 | src_literal.root_piece_->set_subshape(src_literal.shape_.get()); |
| 494 | |
| 495 | return Status::OK(); |
| 496 | } |
| 497 | |
| 498 | Status MutableLiteralBase::CopySliceFrom(const LiteralSlice& src_literal, |
| 499 | absl::Span<const int64> src_base, |
no test coverage detected