diff --git a/.github/workflows/add_to_project.yml b/.github/workflows/add_to_project.yml deleted file mode 100644 index fa9413b0..00000000 --- a/.github/workflows/add_to_project.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Add to Project - -on: - pull_request_target: - types: [opened, reopened] - issues: - types: - - opened - -jobs: - add-to-project: - name: Add issues and PRs to formulation project - runs-on: ubuntu-latest - steps: - - uses: actions/add-to-project@v0.6.1 - with: - project-url: https://github.com/orgs/NOAA-OWP/projects/30 - github-token: ${{ secrets.FORMULATION_PROJECT_ADD_TOKEN }} diff --git a/include/bmi_serialization.h b/include/bmi_serialization.h index f0f6c600..56a9a6d3 100644 --- a/include/bmi_serialization.h +++ b/include/bmi_serialization.h @@ -8,7 +8,7 @@ extern "C" { #include "bmi.h" int free_serialized_cfe(Bmi* bmi); -int load_serialized_cfe(Bmi* bmi, const char* data); +int load_serialized_cfe(Bmi* bmi, char* data); int new_serialized_cfe(Bmi* bmi); #ifdef __cplusplus diff --git a/include/vecbuf.hpp b/include/vecbuf.hpp index 6db982cc..a20bc70e 100644 --- a/include/vecbuf.hpp +++ b/include/vecbuf.hpp @@ -28,6 +28,9 @@ class vecbuf : public std::basic_streambuf { // Forwarder for std::vector::clear() constexpr void clear() { vector_.clear(); } + // Forwarder for std::vector::resize(size) + constexpr void resize(size_type size) { vector_.resize(size); } + // Forwarder for std::vector::reserve constexpr void reserve(size_type capacity) { vector_.reserve(capacity); setp_from_vector(); } @@ -35,7 +38,7 @@ class vecbuf : public std::basic_streambuf { constexpr void reserve_additional(size_type additional_capacity) { reserve(size() + additional_capacity); } // Forwarder for std::vector::data - constexpr const value_type* data() const { return vector_.data(); } + constexpr value_type* data() { return vector_.data(); } // Forwarder for std::vector::size constexpr size_type size() const { return vector_.size(); } @@ -112,4 +115,11 @@ class vecbuf : public std::basic_streambuf { }; +class membuf : public std::streambuf { +public: + membuf(char *begin, size_t size) { + this->setg(begin, begin, begin + size); + } +}; + #endif diff --git a/src/bmi_serialization.cxx b/src/bmi_serialization.cxx index a2dcabeb..1856eaa6 100644 --- a/src/bmi_serialization.cxx +++ b/src/bmi_serialization.cxx @@ -116,9 +116,12 @@ int free_serialized_cfe(Bmi* bmi) { return BMI_SUCCESS; } -int load_serialized_cfe(Bmi* bmi, const char* data) { +int load_serialized_cfe(Bmi* bmi, char* data) { CfeSerializer serializer(bmi); - std::istringstream stream(data); + // get size of data from header + uint64_t size; + memcpy(&size, data, sizeof(uint64_t)); + membuf stream(data + sizeof(uint64_t), size); boost::archive::binary_iarchive archive(stream); try { archive >> serializer; @@ -146,7 +149,8 @@ int new_serialized_cfe(Bmi* bmi) { free(model->serialized); } // set size and allocate memory - model->serialized_length = stream.size(); + uint64_t serialized_size = stream.size(); + model->serialized_length = sizeof(uint64_t) + serialized_size; model->serialized = (char*)malloc(model->serialized_length); // make sure memory could be allocated if (model->serialized == NULL) { @@ -155,7 +159,8 @@ int new_serialized_cfe(Bmi* bmi) { return BMI_FAILURE; } // copy stream data to new allocation - memcpy(model->serialized, stream.data(), model->serialized_length); + memcpy(model->serialized, &serialized_size, sizeof(uint64_t)); + memcpy(model->serialized + sizeof(uint64_t), stream.data(), serialized_size); return BMI_SUCCESS; }