mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Merge pull request #2733 from joakim-hove/serialize-variant
Serialize variant
This commit is contained in:
commit
9829bfd61a
@ -97,7 +97,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! \brief Handler for std::variant<> with three types
|
//! \brief Handler for std::variant<> with four types
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The std::variant<> serialization is a first attempt and *not* particularly
|
The std::variant<> serialization is a first attempt and *not* particularly
|
||||||
@ -147,6 +147,52 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! \brief Handler for std::variant<> with two fundamental types
|
||||||
|
|
||||||
|
/*
|
||||||
|
This std::variant serialization is highly specialized:
|
||||||
|
|
||||||
|
1. It is hardcoded to take exactly two types T0 and T1.
|
||||||
|
|
||||||
|
2. Both T0 and T1 must be basic types where Mpi::pack(T, ...) overloads
|
||||||
|
must exist.
|
||||||
|
|
||||||
|
*/
|
||||||
|
template<class T0, class T1>
|
||||||
|
void variant(std::variant<T0,T1>& data)
|
||||||
|
{
|
||||||
|
auto pack_size = [&](auto& d) {
|
||||||
|
m_packSize += Mpi::packSize(d, m_comm);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto pack = [&](auto& d) {
|
||||||
|
Mpi::pack(d, m_buffer, m_position, m_comm);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (m_op == Operation::PACKSIZE) {
|
||||||
|
m_packSize += Mpi::packSize(data.index(), m_comm);
|
||||||
|
std::visit( [&] (auto& arg) { pack_size(arg); }, data);
|
||||||
|
} else if (m_op == Operation::PACK) {
|
||||||
|
Mpi::pack(data.index(), m_buffer, m_position, m_comm);
|
||||||
|
std::visit([&](auto& arg) { pack(arg); }, data);
|
||||||
|
} else if (m_op == Operation::UNPACK) {
|
||||||
|
size_t index;
|
||||||
|
Mpi::unpack(index, m_buffer, m_position, m_comm);
|
||||||
|
|
||||||
|
if (index == 0) {
|
||||||
|
T0 t0;
|
||||||
|
Mpi::unpack(t0, m_buffer, m_position, m_comm);
|
||||||
|
data = t0;
|
||||||
|
} else if (index == 1) {
|
||||||
|
T1 t1;
|
||||||
|
Mpi::unpack(t1, m_buffer, m_position, m_comm);
|
||||||
|
data = t1;
|
||||||
|
} else
|
||||||
|
throw std::logic_error("Internal meltdown in std::variant<T0,T1> unpack loaded index=" + std::to_string(index) + " allowed range: [0,1]");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//! \brief Handler for maps.
|
//! \brief Handler for maps.
|
||||||
//! \tparam Map map type
|
//! \tparam Map map type
|
||||||
//! \tparam complexType Whether or not Data in map is a complex type
|
//! \tparam complexType Whether or not Data in map is a complex type
|
||||||
|
Loading…
Reference in New Issue
Block a user