Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/metkit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,12 @@ if ( HAVE_GRIB )
codes/BUFRDecoder.h
codes/GRIBDecoder.cc
codes/GRIBDecoder.h
codes/CodesDataContent.cc
codes/CodesDataContent.h
codes/CodesContent.cc
codes/CodesContent.h
codes/BufrContent.cc
codes/BufrContent.h
codes/MallocCodesContent.cc
codes/MallocCodesContent.h
codes/CodesSplitter.cc
codes/CodesSplitter.h
codes/GribAccessor.cc
Expand Down
5 changes: 3 additions & 2 deletions src/metkit/codes/BUFRDecoder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,15 @@ void BUFRDecoder::getMetadata(const eckit::message::Message& msg, eckit::message
// https://confluence.ecmwf.int/display/ECC/bufr_keys_iterator
h->set("unpack", 1);

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

if (name == "subsetNumber") {
continue;
}

/* get key size to see if it is an array */
// Get key size to see if it is an array
// Only continue for scalar values
if (h->size(name) != 1) {
continue;
}
Expand Down
27 changes: 3 additions & 24 deletions src/metkit/codes/BufrContent.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,8 @@
* does it submit to any jurisdiction.
*/

/// @author Baudouin Raoult
/// @author Emanuele Danovaro
/// @date Mar 2022

#include "metkit/codes/BufrContent.h"

#include "metkit/codes/GribHandle.h"

#include "eccodes.h"

namespace metkit {
Expand All @@ -24,29 +18,14 @@ namespace codes {

//----------------------------------------------------------------------------------------------------------------------

BufrContent::BufrContent(codes_handle* handle, bool delete_handle) : CodesContent(handle, delete_handle) {}

BufrContent::BufrContent(const codes_handle* handle) : BufrContent(const_cast<codes_handle*>(handle), false) {}

BufrContent::~BufrContent() {}

BufrContent::BufrContent(std::unique_ptr<CodesHandle> handle) : CodesDataContent(std::move(handle)) {}

//----------------------------------------------------------------------------------------------------------------------

void BufrContent::transform(const eckit::OrderedStringDict& dict) {

std::vector<codes_values> values;

for (auto& kv : dict) {
codes_values v;
v.name = kv.first.c_str();
v.long_value = std::stol(kv.second);
v.type = GRIB_TYPE_LONG;

values.push_back(v);
for (const auto& [key, value] : dict) {
handle_->set(key, std::stol(value));
}

CODES_CALL(codes_set_values(handle_, values.data(), values.size()));
}


Expand Down
11 changes: 5 additions & 6 deletions src/metkit/codes/BufrContent.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,24 @@

#pragma once

#include "metkit/codes/CodesContent.h"
#include "metkit/codes/CodesDataContent.h"

namespace metkit {
namespace codes {


//----------------------------------------------------------------------------------------------------------------------

class BufrContent : public CodesContent {
class BufrContent : public CodesDataContent {
public:

BufrContent(codes_handle* handle, bool delete_handle);
explicit BufrContent(const codes_handle* handle);
BufrContent(std::unique_ptr<CodesHandle> handle);

~BufrContent();
virtual ~BufrContent() = default;

protected:

using CodesContent::transform;
using CodesDataContent::transform;
void transform(const eckit::OrderedStringDict& dict) override;
};

Expand Down
157 changes: 157 additions & 0 deletions src/metkit/codes/CodesDataContent.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/*
* (C) Copyright 2017- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
* In applying this licence, ECMWF does not waive the privileges and immunities
* granted to it by virtue of its status as an intergovernmental organisation nor
* does it submit to any jurisdiction.
*/

#include "metkit/codes/CodesDataContent.h"

#include "eccodes.h"

#include "eckit/exception/Exceptions.h"
#include "eckit/io/DataHandle.h"
#include "eckit/io/MemoryHandle.h"

#include "metkit/codes/GribHandle.h"

namespace metkit {
namespace codes {

//----------------------------------------------------------------------------------------------------------------------

CodesDataContent::CodesDataContent(std::unique_ptr<CodesHandle> handle) :
handle_(std::move(handle)), offset_(handle_->getLong("offset")) {}


CodesDataContent::CodesDataContent(std::unique_ptr<CodesHandle> handle, eckit::Offset offset) :
handle_(std::move(handle)), offset_(std::move(offset)) {}


//----------------------------------------------------------------------------------------------------------------------

size_t CodesDataContent::length() const {
return handle_->messageSize();
}


//----------------------------------------------------------------------------------------------------------------------

void CodesDataContent::write(eckit::DataHandle& handle) const {
auto data = handle_->messageData();
if (handle.write(data.data(), data.size()) != data.size()) {
std::ostringstream oss;
oss << "Write error to data handle " << handle;
throw eckit::WriteError(oss.str(), Here());
}
}


//----------------------------------------------------------------------------------------------------------------------

eckit::DataHandle* CodesDataContent::readHandle() const {
auto data = handle_->messageData();
return new eckit::MemoryHandle(data.data(), data.size());
}


//----------------------------------------------------------------------------------------------------------------------

void CodesDataContent::print(std::ostream& s) const {
s << "CodesDataContent[]";
}


//----------------------------------------------------------------------------------------------------------------------

std::string CodesDataContent::getString(const std::string& key) const {
return handle_->getString(key);
}

//----------------------------------------------------------------------------------------------------------------------

long CodesDataContent::getLong(const std::string& key) const {
return handle_->getLong(key);
}


//----------------------------------------------------------------------------------------------------------------------

double CodesDataContent::getDouble(const std::string& key) const {
return handle_->getDouble(key);
}


//----------------------------------------------------------------------------------------------------------------------

void CodesDataContent::getDoubleArray(const std::string& key, std::vector<double>& values) const {
values = handle_->getDoubleArray(key);
}

//----------------------------------------------------------------------------------------------------------------------

void CodesDataContent::getFloatArray(const std::string& key, std::vector<float>& values) const {
values = handle_->getFloatArray(key);
}


//----------------------------------------------------------------------------------------------------------------------

size_t CodesDataContent::getSize(const std::string& key) const {
return handle_->size(key);
}


//----------------------------------------------------------------------------------------------------------------------

void CodesDataContent::getDoubleArray(const std::string& key, double* data, size_t len) const {
auto arr = handle_->getDoubleArray(key);
ASSERT(len == arr.size());
std::copy(arr.begin(), arr.end(), data);
}

//----------------------------------------------------------------------------------------------------------------------

void CodesDataContent::getFloatArray(const std::string& key, float* data, size_t len) const {
auto arr = handle_->getFloatArray(key);
ASSERT(len == arr.size());
std::copy(arr.begin(), arr.end(), data);
}


//----------------------------------------------------------------------------------------------------------------------

void CodesDataContent::transform(const eckit::OrderedStringDict& dict) {
for (auto& [key, value] : dict) {
handle_->set(key, value);
}
}

//----------------------------------------------------------------------------------------------------------------------

eckit::Offset CodesDataContent::offset() const {
return offset_;
}

//----------------------------------------------------------------------------------------------------------------------

const void* CodesDataContent::data() const {
return handle_->messageData().data();
}

//----------------------------------------------------------------------------------------------------------------------

const CodesHandle& CodesDataContent::codesHandle() const {
return *handle_.get();
}

CodesHandle& CodesDataContent::codesHandle() {
return *handle_.get();
}


} // namespace codes
} // namespace metkit
65 changes: 65 additions & 0 deletions src/metkit/codes/CodesDataContent.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* (C) Copyright 2017- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
* In applying this licence, ECMWF does not waive the privileges and immunities
* granted to it by virtue of its status as an intergovernmental organisation nor
* does it submit to any jurisdiction.
*/

#pragma once

#include "eckit/io/Offset.h"
#include "metkit/codes/api/CodesAPI.h"

#include "eckit/message/MessageContent.h"

namespace metkit {
namespace codes {

//----------------------------------------------------------------------------------------------------------------------

class CodesDataContent : public eckit::message::MessageContent {
public:

CodesDataContent(std::unique_ptr<CodesHandle> handle, eckit::Offset offset);
CodesDataContent(std::unique_ptr<CodesHandle> handle);

virtual ~CodesDataContent() = default;

const CodesHandle& codesHandle() const;
CodesHandle& codesHandle();

protected:

std::unique_ptr<CodesHandle> handle_;
eckit::Offset offset_;

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

private:

size_t length() const override;
void write(eckit::DataHandle& handle) const override;
eckit::DataHandle* readHandle() const override;
void print(std::ostream& s) const override;
std::string getString(const std::string& key) const override;
long getLong(const std::string& key) const override;
double getDouble(const std::string& key) const override;
void getDoubleArray(const std::string& key, std::vector<double>& values) const override;
void getFloatArray(const std::string& key, std::vector<float>& values) const override;
size_t getSize(const std::string& key) const override;
void getDoubleArray(const std::string& key, double* data, size_t lenExpected) const override;
void getFloatArray(const std::string& key, float* data, size_t lenExpected) const override;

eckit::Offset offset() const override;
const void* data() const override;
};


//----------------------------------------------------------------------------------------------------------------------

} // namespace codes
} // namespace metkit
Loading
Loading