Skip to content

Commit 86f2a5a

Browse files
committed
Use unique_ptr<CodesHandle> in CodesContent; Remove MallocCodesContent
1 parent c381622 commit 86f2a5a

File tree

13 files changed

+102
-251
lines changed

13 files changed

+102
-251
lines changed

src/metkit/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,6 @@ if ( HAVE_GRIB )
137137
codes/UserDataContent.h
138138
codes/DataContent.cc
139139
codes/DataContent.h
140-
codes/MallocCodesContent.cc
141-
codes/MallocCodesContent.h
142140
codes/CodesSplitter.cc
143141
codes/CodesSplitter.h
144142
codes/GribAccessor.cc

src/metkit/codes/BUFRDecoder.cc

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,15 @@ void BUFRDecoder::getMetadata(const eckit::message::Message& msg, eckit::message
8989
// https://confluence.ecmwf.int/display/ECC/bufr_keys_iterator
9090
h->set("unpack", 1);
9191

92-
for (auto& k : h->keys()) {
92+
for (const auto& k : h->keys()) {
9393
auto name = k.name();
9494

9595
if (name == "subsetNumber") {
9696
continue;
9797
}
9898

99-
/* get key size to see if it is an array */
99+
// Get key size to see if it is an array
100+
// Only continue for scalar values
100101
if (h->size(name) != 1) {
101102
continue;
102103
}
@@ -113,6 +114,13 @@ void BUFRDecoder::getMetadata(const eckit::message::Message& msg, eckit::message
113114
if constexpr (std::is_same_v<Type, std::string> || std::is_arithmetic_v<Type>) {
114115
gather.setValue(name, std::forward<decltype(v)>(v));
115116
}
117+
else {
118+
// Unhandled types are all array types - the prior call checking `size != 1` only allows for
119+
// scalars.
120+
throw eckit::Exception(
121+
std::string("Unexpected type when accessing BURF message metadata ") + typeid(v).name(),
122+
Here());
123+
}
116124
},
117125
k.get());
118126
break;

src/metkit/codes/BufrContent.cc

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,8 @@
88
* does it submit to any jurisdiction.
99
*/
1010

11-
/// @author Baudouin Raoult
12-
/// @author Emanuele Danovaro
13-
/// @date Mar 2022
14-
1511
#include "metkit/codes/BufrContent.h"
1612

17-
#include "metkit/codes/GribHandle.h"
18-
1913
#include "eccodes.h"
2014

2115
namespace metkit {
@@ -24,29 +18,14 @@ namespace codes {
2418

2519
//----------------------------------------------------------------------------------------------------------------------
2620

27-
BufrContent::BufrContent(codes_handle* handle, bool delete_handle) : CodesContent(handle, delete_handle) {}
28-
29-
BufrContent::BufrContent(const codes_handle* handle) : BufrContent(const_cast<codes_handle*>(handle), false) {}
30-
31-
BufrContent::~BufrContent() {}
32-
21+
BufrContent::BufrContent(std::unique_ptr<CodesHandle> handle) : CodesContent(std::move(handle)) {}
3322

3423
//----------------------------------------------------------------------------------------------------------------------
3524

3625
void BufrContent::transform(const eckit::OrderedStringDict& dict) {
37-
38-
std::vector<codes_values> values;
39-
40-
for (auto& kv : dict) {
41-
codes_values v;
42-
v.name = kv.first.c_str();
43-
v.long_value = std::stol(kv.second);
44-
v.type = GRIB_TYPE_LONG;
45-
46-
values.push_back(v);
26+
for (const auto& [key, value] : dict) {
27+
handle_->set(key, std::stol(value));
4728
}
48-
49-
CODES_CALL(codes_set_values(handle_, values.data(), values.size()));
5029
}
5130

5231

src/metkit/codes/BufrContent.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@ namespace codes {
2525
class BufrContent : public CodesContent {
2626
public:
2727

28-
BufrContent(codes_handle* handle, bool delete_handle);
29-
explicit BufrContent(const codes_handle* handle);
28+
BufrContent(std::unique_ptr<CodesHandle> handle);
3029

31-
~BufrContent();
30+
virtual ~BufrContent() = default;
3231

3332
protected:
3433

src/metkit/codes/CodesContent.cc

Lines changed: 22 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
* does it submit to any jurisdiction.
99
*/
1010

11-
/// @author Baudouin Raoult
12-
/// @date Jun 2020
13-
1411
#include "metkit/codes/CodesContent.h"
1512

1613
#include "eccodes.h"
@@ -19,46 +16,28 @@
1916
#include "eckit/io/DataHandle.h"
2017
#include "eckit/io/MemoryHandle.h"
2118

22-
#include "eckit/memory/Zero.h"
23-
2419
#include "metkit/codes/GribHandle.h"
2520

2621
namespace metkit {
2722
namespace codes {
2823

2924
//----------------------------------------------------------------------------------------------------------------------
3025

31-
CodesContent::CodesContent(codes_handle* handle, bool delete_handle) : handle_(handle), delete_handle_(delete_handle) {
32-
ASSERT(handle_);
33-
}
34-
35-
CodesContent::CodesContent(const codes_handle* handle) : CodesContent(const_cast<codes_handle*>(handle), false) {}
36-
37-
38-
CodesContent::~CodesContent() {
39-
if (delete_handle_) {
40-
codes_handle_delete(handle_);
41-
}
42-
}
26+
CodesContent::CodesContent(std::unique_ptr<CodesHandle> handle) : handle_(std::move(handle)) {}
4327

4428

4529
//----------------------------------------------------------------------------------------------------------------------
4630

4731
size_t CodesContent::length() const {
48-
size_t size;
49-
const void* data;
50-
CODES_CALL(codes_get_message(handle_, &data, &size));
51-
return size;
32+
return handle_->messageSize();
5233
}
5334

5435

5536
//----------------------------------------------------------------------------------------------------------------------
5637

5738
void CodesContent::write(eckit::DataHandle& handle) const {
58-
size_t size;
59-
const void* data;
60-
CODES_CALL(codes_get_message(handle_, &data, &size));
61-
if (handle.write(data, size) != size) {
39+
auto data = handle_->messageData();
40+
if (handle.write(data.data(), data.size()) != data.size()) {
6241
std::ostringstream oss;
6342
oss << "Write error to data handle " << handle;
6443
throw eckit::WriteError(oss.str(), Here());
@@ -69,10 +48,8 @@ void CodesContent::write(eckit::DataHandle& handle) const {
6948
//----------------------------------------------------------------------------------------------------------------------
7049

7150
eckit::DataHandle* CodesContent::readHandle() const {
72-
size_t size;
73-
const void* data;
74-
CODES_CALL(codes_get_message(handle_, &data, &size));
75-
return new eckit::MemoryHandle(data, size);
51+
auto data = handle_->messageData();
52+
return new eckit::MemoryHandle(data.data(), data.size());
7653
}
7754

7855

@@ -86,128 +63,79 @@ void CodesContent::print(std::ostream& s) const {
8663
//----------------------------------------------------------------------------------------------------------------------
8764

8865
std::string CodesContent::getString(const std::string& key) const {
89-
char values[10240];
90-
size_t len = sizeof(values);
91-
92-
values[0] = 0;
93-
94-
CODES_CALL(codes_get_string(handle_, key.c_str(), values, &len));
95-
// ASSERT(err)
96-
97-
return values;
66+
return handle_->getString(key);
9867
}
9968

10069
//----------------------------------------------------------------------------------------------------------------------
10170

10271
long CodesContent::getLong(const std::string& key) const {
103-
long v = 0;
104-
CODES_CALL(codes_get_long(handle_, key.c_str(), &v));
105-
return v;
72+
return handle_->getLong(key);
10673
}
10774

10875

10976
//----------------------------------------------------------------------------------------------------------------------
11077

11178
double CodesContent::getDouble(const std::string& key) const {
112-
double v = 0;
113-
CODES_CALL(codes_get_double(handle_, key.c_str(), &v));
114-
return v;
79+
return handle_->getDouble(key);
11580
}
11681

11782

11883
//----------------------------------------------------------------------------------------------------------------------
11984

12085
void CodesContent::getDoubleArray(const std::string& key, std::vector<double>& values) const {
121-
size_t size = 0;
122-
CODES_CALL(codes_get_size(handle_, key.c_str(), &size));
123-
124-
size_t count = size;
125-
values.resize(count);
126-
CODES_CALL(codes_get_double_array(handle_, key.c_str(), &values[0], &count));
127-
ASSERT(count == size);
86+
values = handle_->getDoubleArray(key);
12887
}
12988

13089
//----------------------------------------------------------------------------------------------------------------------
13190

13291
void CodesContent::getFloatArray(const std::string& key, std::vector<float>& values) const {
133-
size_t size = 0;
134-
CODES_CALL(codes_get_size(handle_, key.c_str(), &size));
135-
136-
size_t count = size;
137-
values.resize(count);
138-
CODES_CALL(codes_get_float_array(handle_, key.c_str(), &values[0], &count));
139-
ASSERT(count == size);
92+
values = handle_->getFloatArray(key);
14093
}
14194

14295

14396
//----------------------------------------------------------------------------------------------------------------------
14497

14598
size_t CodesContent::getSize(const std::string& key) const {
146-
size_t size = 0;
147-
CODES_CALL(codes_get_size(handle_, key.c_str(), &size));
148-
return size;
99+
return handle_->size(key);
149100
}
150101

151102

152103
//----------------------------------------------------------------------------------------------------------------------
153104

154105
void CodesContent::getDoubleArray(const std::string& key, double* data, size_t len) const {
155-
size_t count = len;
156-
CODES_CALL(codes_get_double_array(handle_, key.c_str(), data, &count));
157-
ASSERT(count == len);
106+
auto arr = handle_->getDoubleArray(key);
107+
ASSERT(len == arr.size());
108+
std::copy(arr.begin(), arr.end(), data);
158109
}
159110

160111
//----------------------------------------------------------------------------------------------------------------------
161112

162113
void CodesContent::getFloatArray(const std::string& key, float* data, size_t len) const {
163-
size_t count = len;
164-
CODES_CALL(codes_get_float_array(handle_, key.c_str(), data, &count));
165-
ASSERT(count == len);
114+
auto arr = handle_->getFloatArray(key);
115+
ASSERT(len == arr.size());
116+
std::copy(arr.begin(), arr.end(), data);
166117
}
167118

168119

169120
//----------------------------------------------------------------------------------------------------------------------
170121

171122
void CodesContent::transform(const eckit::OrderedStringDict& dict) {
172-
173-
std::vector<codes_values> values;
174-
values.reserve(dict.size());
175-
176-
for (auto& kv : dict) {
177-
codes_values v;
178-
v.name = kv.first.c_str();
179-
v.string_value = kv.second.c_str();
180-
v.type = GRIB_TYPE_STRING;
181-
182-
values.push_back(v);
123+
for (auto& [key, value] : dict) {
124+
handle_->set(key, value);
183125
}
184-
185-
CODES_CALL(codes_set_values(handle_, values.data(), values.size()));
186126
}
187127

188128
//----------------------------------------------------------------------------------------------------------------------
189129

190130
eckit::Offset CodesContent::offset() const {
191-
long pos;
192-
CODES_CALL(codes_get_long(handle_, "offset", &pos));
193-
return pos;
194-
}
195-
196-
197-
//----------------------------------------------------------------------------------------------------------------------
198-
199-
const codes_handle* CodesContent::codesHandle() const {
200-
return handle_;
131+
return handle_->getLong("offset");
201132
}
202133

203134

204135
//----------------------------------------------------------------------------------------------------------------------
205136

206137
const void* CodesContent::data() const {
207-
size_t size;
208-
const void* data;
209-
CODES_CALL(codes_get_message(handle_, &data, &size));
210-
return data;
138+
return handle_->messageData().data();
211139
}
212140

213141

src/metkit/codes/CodesContent.h

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,31 @@
1313

1414
#pragma once
1515

16-
#include "eckit/message/MessageContent.h"
16+
#include "metkit/codes/api/CodesAPI.h"
1717

18-
typedef struct grib_handle codes_handle;
18+
#include "eckit/message/MessageContent.h"
1919

2020
namespace metkit {
2121
namespace codes {
2222

23-
2423
//----------------------------------------------------------------------------------------------------------------------
2524

2625
class CodesContent : public eckit::message::MessageContent {
2726
public:
2827

29-
CodesContent(codes_handle* handle, bool delete_handle);
30-
explicit CodesContent(const codes_handle* handle);
28+
CodesContent(std::unique_ptr<CodesHandle> handle);
3129

32-
~CodesContent();
30+
virtual ~CodesContent() = default;
3331

3432
protected:
3533

36-
codes_handle* handle_;
34+
std::unique_ptr<CodesHandle> handle_;
3735

3836
using eckit::message::MessageContent::transform;
3937
void transform(const eckit::OrderedStringDict&) override;
4038

4139
private:
4240

43-
bool delete_handle_;
44-
4541
size_t length() const override;
4642
void write(eckit::DataHandle& handle) const override;
4743
eckit::DataHandle* readHandle() const override;
@@ -56,7 +52,6 @@ class CodesContent : public eckit::message::MessageContent {
5652
void getFloatArray(const std::string& key, float* data, size_t lenExpected) const override;
5753

5854
eckit::Offset offset() const override;
59-
const codes_handle* codesHandle() const;
6055
const void* data() const override;
6156
};
6257

0 commit comments

Comments
 (0)