| 543 | |
| 544 | template <class TFeaturesColumn> |
| 545 | static void CheckDataSizes( |
| 546 | ui32 objectCount, |
| 547 | const TFeaturesLayout& featuresLayout, |
| 548 | const EFeatureType featureType, |
| 549 | const TVector<THolder<TFeaturesColumn>>& featuresData |
| 550 | ) { |
| 551 | CheckDataSize( |
| 552 | featuresData.size(), |
| 553 | (size_t)featuresLayout.GetFeatureCount(featureType), |
| 554 | TStringBuilder() << "ObjectDataProvider's " << featureType << " features", |
| 555 | false, |
| 556 | TStringBuilder() << "featureLayout's " << featureType << " features size", |
| 557 | true |
| 558 | ); |
| 559 | |
| 560 | for (auto featureIdx : xrange(featuresData.size())) { |
| 561 | TString dataDescription = |
| 562 | TStringBuilder() << "ObjectDataProvider's " << featureType << " feature #" << featureIdx; |
| 563 | |
| 564 | auto dataPtr = featuresData[featureIdx].Get(); |
| 565 | bool isAvailable = featuresLayout.GetInternalFeatureMetaInfo(featureIdx, featureType).IsAvailable; |
| 566 | if (isAvailable) { |
| 567 | CB_ENSURE_INTERNAL( |
| 568 | dataPtr, |
| 569 | dataDescription << " is null despite being available in featuresLayout" |
| 570 | ); |
| 571 | CheckDataSize( |
| 572 | dataPtr->GetSize(), |
| 573 | objectCount, |
| 574 | dataDescription, |
| 575 | /*dataCanBeEmpty*/ false, |
| 576 | "object count", |
| 577 | /*internalCheck*/ true |
| 578 | ); |
| 579 | } |
| 580 | } |
| 581 | } |
| 582 | |
| 583 | |
| 584 | void NCB::TRawObjectsData::Check( |
no test coverage detected