DataView retrieveFeatureData(const Tag &tag, size_t feature_index) { if (tag.featureCount() == 0) { throw nix::OutOfBounds("There are no features associated with this tag!", 0); } if (feature_index > tag.featureCount()) { throw nix::OutOfBounds("Feature index out of bounds.", 0); } Feature feat = tag.getFeature(feature_index); DataArray data = feat.data(); if (data == nix::none) { throw nix::UninitializedEntity(); //return NDArray(nix::DataType::Float,{0}); } if (feat.linkType() == nix::LinkType::Tagged) { NDSize offset, count; getOffsetAndCount(tag, data, offset, count); if (!positionAndExtentInData(data, offset, count)) { throw nix::OutOfBounds("Requested data slice out of the extent of the Feature!", 0); } DataView io = DataView(data, count, offset); return io; } // for untagged and indexed return the full data NDSize offset(data.dataExtent().size(), 0); DataView io = DataView(data, data.dataExtent(), offset); return io; }
void OpMsg::replaceFlags(Message* message, uint32_t flags) { invariant(!message->empty()); invariant(message->operation() == dbMsg); invariant(message->dataSize() >= static_cast<int>(sizeof(uint32_t))); DataView(message->singleData().data()).write<LittleEndian<uint32_t>>(flags); }
Message OpMsgBuilder::finish() { invariant(_state == kBody); invariant(_bodyStart); invariant(!_openBuilder); _state = kDone; // TODO figure out where checksums should be calculated. It needs to be *after* we set the // messageID and replyTo fields in the header, which is currently done deep in the network // stack. That will either need to move closer to here, or the checksumming will need to be // done there. invariant(!(_flags & OpMsg::kChecksumPresent)); // TODO SERVER-28679 compute checksum. // If this fails, it means some internal user set an invalid flag. invariant(!containsUnknownRequiredFlags(_flags)); DataView(_buf.buf()) .write<LittleEndian<uint32_t>>(_flags, /*offset=*/sizeof(MSGHEADER::Layout)); const auto size = _buf.len(); MSGHEADER::View header(_buf.buf()); header.setMessageLength(size); // header.setRequestMsgId(...); // These are currently filled in by the networking layer. // header.setResponseToMsgId(...); header.setOpCode(dbMsg); return Message(_buf.release()); }
void OpMsgBuilder::finishDocumentStream(DocSequenceBuilder* docSequenceBuilder) { invariant(_state == kDocSequence); invariant(_openBuilder); _openBuilder = false; const int32_t size = _buf.len() - docSequenceBuilder->_sizeOffset; invariant(size > 0); DataView(_buf.buf()).write<LittleEndian<int32_t>>(size, docSequenceBuilder->_sizeOffset); }
DataView retrieveFeatureData(const MultiTag &tag, size_t position_index, size_t feature_index) { if (tag.featureCount() == 0) { throw nix::OutOfBounds("There are no features associated with this tag!", 0); } if (feature_index >= tag.featureCount()) { throw nix::OutOfBounds("Feature index out of bounds.", 0); } Feature feat = tag.getFeature(feature_index); DataArray data = feat.data(); if (data == nix::none) { throw nix::UninitializedEntity(); //return NDArray(nix::DataType::Float,{0}); } if (feat.linkType() == nix::LinkType::Tagged) { NDSize offset, count; getOffsetAndCount(tag, data, position_index, offset, count); if (!positionAndExtentInData(data, offset, count)) { throw nix::OutOfBounds("Requested data slice out of the extent of the Feature!", 0); } DataView io = DataView(data, count, offset); return io; } else if (feat.linkType() == nix::LinkType::Indexed) { //FIXME does the feature data to have a setdimension in the first dimension for the indexed case? //For now it will just be a slice across the first dim. if (position_index > data.dataExtent()[0]){ throw nix::OutOfBounds("Position is larger than the data stored in the feature.", 0); } NDSize offset(data.dataExtent().size(), 0); offset[0] = position_index; NDSize count(data.dataExtent()); count[0] = 1; if (!positionAndExtentInData(data, offset, count)) { throw nix::OutOfBounds("Requested data slice out of the extent of the Feature!", 0); } DataView io = DataView(data, count, offset); return io; } // FIXME is this expected behavior? In the untagged case all data is returned NDSize offset(data.dataExtent().size(), 0); DataView io = DataView(data, data.dataExtent(), offset); return io; }
TEST(DataRangeCursor, ConstDataRangeCursor) { char buf[14]; DataView(buf).write<uint16_t>(1); DataView(buf).write<LittleEndian<uint32_t>>(2, sizeof(uint16_t)); DataView(buf).write<BigEndian<uint64_t>>(3, sizeof(uint16_t) + sizeof(uint32_t)); ConstDataRangeCursor cdrc(buf, buf + sizeof(buf)); ConstDataRangeCursor backup(cdrc); ASSERT_EQUALS(static_cast<uint16_t>(1), cdrc.readAndAdvance<uint16_t>()); ASSERT_EQUALS(static_cast<uint32_t>(2), cdrc.readAndAdvance<LittleEndian<uint32_t>>()); ASSERT_EQUALS(static_cast<uint64_t>(3), cdrc.readAndAdvance<BigEndian<uint64_t>>()); ASSERT_NOT_OK(cdrc.readAndAdvanceNoThrow<char>()); // test skip() cdrc = backup; ASSERT_OK(cdrc.skipNoThrow<uint32_t>()); ASSERT_OK(cdrc.advanceNoThrow(10)); ASSERT_NOT_OK(cdrc.readAndAdvanceNoThrow<char>()); }
TEST(DataRangeCursor, ConstDataRangeCursor) { char buf[14]; DataView(buf).write<uint16_t>(1); DataView(buf).write<LittleEndian<uint32_t>>(2, sizeof(uint16_t)); DataView(buf).write<BigEndian<uint64_t>>(3, sizeof(uint16_t) + sizeof(uint32_t)); ConstDataRangeCursor cdrc(buf, buf + sizeof(buf)); ConstDataRangeCursor backup(cdrc); ASSERT_EQUALS(static_cast<uint16_t>(1), cdrc.readAndAdvance<uint16_t>().getValue()); ASSERT_EQUALS(static_cast<uint32_t>(2), cdrc.readAndAdvance<LittleEndian<uint32_t>>().getValue()); ASSERT_EQUALS(static_cast<uint64_t>(3), cdrc.readAndAdvance<BigEndian<uint64_t>>().getValue()); ASSERT_EQUALS(false, cdrc.readAndAdvance<char>().isOK()); // test skip() cdrc = backup; ASSERT_EQUALS(true, cdrc.skip<uint32_t>().isOK()); ; ASSERT_EQUALS(true, cdrc.advance(10).isOK()); ASSERT_EQUALS(false, cdrc.readAndAdvance<char>().isOK()); }
void writeDocument(char* start) const { char* buf = start; memcpy(buf, _frame.objdata(), _frame.objsize() - 1); // don't copy final EOO DataView(buf).write<LittleEndian<int>>(documentSize()); buf += (_frame.objsize() - 1); buf[0] = (char)Object; buf[1] = 'o'; buf[2] = 0; memcpy(buf + 3, _oField.objdata(), _oField.objsize()); buf += 3 + _oField.objsize(); buf[0] = EOO; verify(static_cast<size_t>((buf + 1) - start) == documentSize()); // DEV? }
DataView retrieveData(const Tag &tag, size_t reference_index) { vector<double> positions = tag.position(); vector<double> extents = tag.extent(); vector<DataArray> refs = tag.references(); if (refs.size() == 0) { throw nix::OutOfBounds("There are no references in this tag!", 0); } if (!(reference_index < tag.referenceCount())) { throw nix::OutOfBounds("Reference index out of bounds.", 0); } size_t dimension_count = refs[reference_index].dimensionCount(); if (positions.size() != dimension_count || (extents.size() > 0 && extents.size() != dimension_count)) { throw nix::IncompatibleDimensions("Number of dimensions in position or extent do not match dimensionality of data","util::retrieveData"); } NDSize offset, count; getOffsetAndCount(tag, refs[reference_index], offset, count); if (!positionAndExtentInData(refs[reference_index], offset, count)) { throw nix::OutOfBounds("Referenced data slice out of the extent of the DataArray!", 0); } DataView io = DataView(refs[reference_index], count, offset); return io; }
DataView retrieveData(const MultiTag &tag, size_t position_index, size_t reference_index) { DataArray positions = tag.positions(); DataArray extents = tag.extents(); vector<DataArray> refs = tag.references(); if (refs.size() == 0) { // Do I need this? throw nix::OutOfBounds("There are no references in this tag!", 0); } if (position_index >= positions.dataExtent()[0] || (extents && position_index >= extents.dataExtent()[0])) { throw nix::OutOfBounds("Index out of bounds of positions or extents!", 0); } if (!(reference_index < tag.referenceCount())) { throw nix::OutOfBounds("Reference index out of bounds.", 0); } size_t dimension_count = refs[reference_index].dimensionCount(); if (positions.dataExtent().size() == 1 && dimension_count != 1) { throw nix::IncompatibleDimensions("Number of dimensions in position or extent do not match dimensionality of data", "util::retrieveData"); } else if (positions.dataExtent().size() > 1) { if (positions.dataExtent()[1] > dimension_count || (extents && extents.dataExtent()[1] > dimension_count)) { throw nix::IncompatibleDimensions("Number of dimensions in position or extent do not match dimensionality of data", "util::retrieveData"); } } NDSize offset, count; getOffsetAndCount(tag, refs[reference_index], position_index, offset, count); if (!positionAndExtentInData(refs[reference_index], offset, count)) { throw nix::OutOfBounds("References data slice out of the extent of the DataArray!", 0); } DataView io = DataView(refs[reference_index], count, offset); return io; }