Fix array length==1 bug

This commit is contained in:
2018-07-13 09:50:26 +02:00
parent 2808087c14
commit 7f72be086a
3 changed files with 47 additions and 8 deletions
+9 -5
View File
@@ -9,7 +9,12 @@ using namespace std;
namespace pt = boost::property_tree;
HeaderDataType::HeaderDataType(const std::string& type, size_t shape) :
type(type), value_shape(shape), endianness("little") {
type(type), value_shape(shape), endianness("little"), is_array(true) {
value_bytes_size = get_type_byte_size(type);
}
HeaderDataType::HeaderDataType(const std::string& type) :
type(type), value_shape(1), endianness("little"), is_array(false) {
value_bytes_size = get_type_byte_size(type);
}
@@ -220,10 +225,7 @@ shared_ptr<char> get_value_from_json(const pt::ptree& json_header, const string&
{
char* buffer = new char[header_data_type.value_bytes_size * header_data_type.value_shape];
if (header_data_type.value_shape == 1) {
copy_value_to_buffer(buffer, 0, json_header.get_child(name), header_data_type);
} else {
if (header_data_type.is_array) {
size_t index = 0;
for (const auto& item : json_header.get_child(name)) {
@@ -233,6 +235,8 @@ shared_ptr<char> get_value_from_json(const pt::ptree& json_header, const string&
++index;
}
} else {
copy_value_to_buffer(buffer, 0, json_header.get_child(name), header_data_type);
}
return shared_ptr<char>(buffer, default_delete<char[]>());
+6 -2
View File
@@ -20,8 +20,10 @@ struct HeaderDataType
size_t value_shape;
std::string endianness;
size_t value_bytes_size;
bool is_array;
HeaderDataType(const std::string& type, size_t shape=1);
HeaderDataType(const std::string& type);
HeaderDataType(const std::string& type, size_t shape);
};
size_t get_type_byte_size(const std::string& type);
@@ -45,7 +47,7 @@ class ZmqReceiver
std::shared_ptr<std::unordered_map<std::string, HeaderDataType>> header_values_type = NULL;
std::shared_ptr<FrameMetadata> read_json_header(const std::string& header);
@@ -57,6 +59,8 @@ class ZmqReceiver
void connect();
std::shared_ptr<FrameMetadata> read_json_header(const std::string& header);
std::pair<std::shared_ptr<FrameMetadata>, char*> receive();
const std::shared_ptr<std::unordered_map<std::string, HeaderDataType>> get_header_values_type() const;
+32 -1
View File
@@ -1,4 +1,5 @@
#include "../src/ZmqReceiver.hpp"
#include "../src/ZmqReceiver.hpp"
using namespace std;
namespace pt = boost::property_tree;
@@ -33,7 +34,7 @@ TEST(ZmqReceiver, get_value_from_json)
uint64_t frame_number = 1234567890;
json_header.add("frame_number", frame_number);
HeaderDataType header_data_type_scalar("uint64", 1);
HeaderDataType header_data_type_scalar("uint64");
auto scalar_buffer = get_value_from_json(json_header, "frame_number", header_data_type_scalar);
auto scalar_value = reinterpret_cast<uint64_t*>(scalar_buffer.get());
@@ -59,4 +60,34 @@ TEST(ZmqReceiver, get_value_from_json)
for (int i=0; i<3; i++) {
ASSERT_TRUE(array_values[i] == modules_number[i]);
}
}
TEST(ZmqReceiver, read_json_header)
{
int n_modules = 1;
auto header_values = shared_ptr<unordered_map<string, HeaderDataType>>(new unordered_map<string, HeaderDataType> {
{"pulse_id", HeaderDataType("uint64")},
{"frame", HeaderDataType("uint64")},
{"is_good_frame", HeaderDataType("uint64")},
{"daq_rec", HeaderDataType("int64")},
{"pulse_id_diff", HeaderDataType("int64", n_modules)},
{"framenum_diff", HeaderDataType("int64", n_modules)},
{"missing_packets_1", HeaderDataType("uint64", n_modules)},
{"missing_packets_2", HeaderDataType("uint64", n_modules)},
{"daq_recs", HeaderDataType("uint64", n_modules)},
{"pulse_ids", HeaderDataType("uint64", n_modules)},
{"framenums", HeaderDataType("uint64", n_modules)},
{"module_number", HeaderDataType("uint64", n_modules)}
});
ZmqReceiver receiver("something", 1, 1, header_values);
auto header_string = "{\"missing_packets_2\":[0],\"missing_packets_1\":[0],\"frame\":0,\"daq_recs\":[3840],\"module_number\":[0],\"shape\":[512,1024],\"pulse_id\":6021771850,\"framenum_diff\":[0],\"pulse_ids\":[6021771850],\"is_good_frame\":1,\"framenums\":[193],\"pulse_id_diff\":[0],\"daq_rec\":3840,\"type\":\"uint16\",\"htype\":\"array-1.0\"}";
auto frame_metadata = receiver.read_json_header(header_string);
}