std::shared_ptr<base::IDataArray> BlockFS::createDataArray(const std::string &name, const std::string &type, nix::DataType data_type, const NDSize &shape) { if (name.empty()) { throw EmptyString("Block::createDataArray empty name provided!"); } if (hasDataArray(name)) { throw DuplicateName("Block::createDataArray: an entity with the same name already exists!"); } std::string id = util::createId(); DataArrayFS da(file(), block(), data_array_dir.location(), id, type, name); da.createData(data_type, shape); return std::make_shared<DataArrayFS>(da); }
void BaseTagHDF5::references(const std::vector<DataArray> &refs_new) { // extract vectors of names from vectors of new & old references std::vector<std::string> names_new(refs_new.size()); transform(refs_new.begin(), refs_new.end(), names_new.begin(), util::toName<DataArray>); //FIXME: issue 473 std::vector<DataArray> refs_old(static_cast<size_t>(referenceCount())); for (size_t i = 0; i < refs_old.size(); i++) refs_old[i] = getReference(i); std::vector<std::string> names_old(refs_old.size()); transform(refs_old.begin(), refs_old.end(), names_old.begin(), util::toName<DataArray>); // sort them std::sort(names_new.begin(), names_new.end()); std::sort(names_new.begin(), names_new.end()); // get names only in names_new (add), names only in names_old (remove) & ignore rest std::vector<std::string> names_add; std::vector<std::string> names_rem; std::set_difference(names_new.begin(), names_new.end(), names_old.begin(), names_old.end(), std::inserter(names_add, names_add.begin())); std::set_difference(names_old.begin(), names_old.end(), names_new.begin(), names_new.end(), std::inserter(names_rem, names_rem.begin())); // check if all new references exist & add sources auto blck = dynamic_pointer_cast<BlockHDF5>(block()); for (auto name : names_add) { if (!blck->hasDataArray(name)) throw std::runtime_error("One or more data arrays do not exist in this block!"); addReference(blck->getDataArray(name)->id()); } // remove references for (auto name : names_rem) { if (!blck->hasDataArray(name)) removeReference(blck->getDataArray(name)->id()); } }