#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fluid { namespace client { class DataSetWriterClient : public FluidBaseClient, OfflineIn, OfflineOut { enum { kDataSet, kIDPrefix, kIDNumber, kBuffer }; static constexpr std::initializer_list idNumberDefaults{0, 0}; public: FLUID_DECLARE_PARAMS(DataSetClientRef::makeParam("dataSet", "DataSet ID"), StringParam("idPrefix", "ID Prefix"), LongArrayParam("idNumber", "ID Counter Offset", idNumberDefaults), BufferParam("buf", "Data Buffer")); DataSetWriterClient(ParamSetViewType &p) : mParams(p) {} template Result process(FluidContext &) { auto dataset = get().get(); if (auto datasetPtr = dataset.lock()) { std::string &idPrefix = get(); auto &idNumberArr = get(); if (idNumberArr.size() != 2) return {Result::Status::kError, "ID number malformed"}; if (idPrefix.size() == 0 && idNumberArr[0] == 0) return {Result::Status::kError, "No ID supplied"}; mStream.clear(); mStream.seekp(0); mStream << idPrefix; if (idNumberArr[0] > 0) mStream << idNumberArr[1]; auto buf = get(); return datasetPtr->setPoint(mStream.str(), buf); } else return {Result::Status::kError, "No DataSet"}; } private: std::ostringstream mStream; }; using NRTThreadedDataSetWriter = NRTThreadingAdaptor>; } // namespace client } // namespace fluid