| 422 | |
| 423 | template <class Shape> |
| 424 | void TensorShapeBase<Shape>::UnsafeAddDim(int64 size, int64 new_num_elements) { |
| 425 | const int nd = ndims_byte(); |
| 426 | if (tag() == REP16 && nd < 6 && size < kMaxRep16) { |
| 427 | as16()->dims_[nd] = |
| 428 | kIsPartial && size < 0 ? kUnknownRep16 : static_cast<uint16>(size); |
| 429 | } else if (tag() == REP32 && nd < 3 && size < kMaxRep32) { |
| 430 | as32()->dims_[nd] = |
| 431 | kIsPartial && size < 0 ? kUnknownRep32 : static_cast<uint32>(size); |
| 432 | } else if (tag() == REP_OUT_OF_LINE) { |
| 433 | as64()->dims_->push_back(size); |
| 434 | } else { |
| 435 | // Need to change representation |
| 436 | gtl::InlinedVector<int64, 8> vals; |
| 437 | AppendTo(*this, &vals); |
| 438 | vals.push_back(size); |
| 439 | // We know we can't be REP16. See if we have a small enough |
| 440 | // number of dimensions and each dimension's size is small enough |
| 441 | // to allow REP32. |
| 442 | bool can_be_rep32 = (vals.size() <= 3); |
| 443 | if (can_be_rep32) { |
| 444 | for (size_t i = 0; i < vals.size(); i++) { |
| 445 | if (vals[i] >= kMaxRep32) { |
| 446 | can_be_rep32 = false; |
| 447 | break; |
| 448 | } |
| 449 | } |
| 450 | } |
| 451 | if (can_be_rep32) { |
| 452 | set_tag(REP32); |
| 453 | for (size_t d = 0; d < vals.size(); d++) { |
| 454 | as32()->dims_[d] = kIsPartial && vals[d] < 0 |
| 455 | ? kUnknownRep32 |
| 456 | : static_cast<uint32>(vals[d]); |
| 457 | } |
| 458 | } else { |
| 459 | set_tag(REP_OUT_OF_LINE); |
| 460 | as64()->dims_ = |
| 461 | new gtl::InlinedVector<int64, 4>(vals.begin(), vals.end()); |
| 462 | } |
| 463 | } |
| 464 | set_ndims_byte(nd + 1); |
| 465 | set_num_elements(new_num_elements); |
| 466 | } |
| 467 | |
| 468 | template <class Shape> |
| 469 | void TensorShapeBase<Shape>::AppendShape(const TensorShapeBase& shape) { |