void BufferedInvocation::begin(PointBuffer& buffer) { PointContext ctx = buffer.m_context; Dimension::IdList const& dims = ctx.dims(); for (auto di = dims.begin(); di != dims.end(); ++di) { Dimension::Id::Enum d = *di; Dimension::Detail *dd = ctx.dimDetail(d); void *data = malloc(dd->size() * buffer.size()); m_buffers.push_back(data); // Hold pointer for deallocation char *p = (char *)data; for (PointId idx = 0; idx < buffer.size(); ++idx) { buffer.getFieldInternal(d, idx, (void *)p); p += dd->size(); } std::string name = ctx.dimName(*di); insertArgument(name, (uint8_t *)data, dd->type(), buffer.size()); } }
void BufferedInvocation::end(PointBuffer& buffer) { // for each entry in the script's outs dictionary, // look up that entry's name in the schema and then // copy the data into the right dimension spot in the // buffer std::vector<std::string> names; getOutputNames(names); PointContext ctx = buffer.m_context; Dimension::IdList const& dims = ctx.dims(); for (auto di = dims.begin(); di != dims.end(); ++di) { Dimension::Id::Enum d = *di; Dimension::Detail *dd = ctx.dimDetail(d); std::string name = ctx.dimName(*di); auto found = std::find(names.begin(), names.end(), name); if (found == names.end()) continue; // didn't have this dim in the names assert(name == *found); assert(hasOutputVariable(name)); size_t size = dd->size(); void *data = extractResult(name, dd->type()); char *p = (char *)data; for (PointId idx = 0; idx < buffer.size(); ++idx) { buffer.setField(d, dd->type(), idx, (void *)p); p += size; } } for (auto bi = m_buffers.begin(); bi != m_buffers.end(); ++bi) free(*bi); m_buffers.clear(); }