Adapt variant serialization to four types

This commit is contained in:
Joakim Hove
2020-06-11 09:35:32 +02:00
parent baba9b6773
commit 754f74df01

View File

@@ -103,22 +103,22 @@ public:
The std::variant<> serialization is a first attempt and *not* particularly
general. In particular that implies:
1. It is hardcoded to hold exactly three alternative types T1, T2 and
1. It is hardcoded to hold exactly four alternative types T0, T1, T2 and
T3.
2. All the three types T1, T2 and T3 must implement the ::serializeOp( )
2. All the four types T0, T1, T2 and T3 must implement the ::serializeOp( )
method. This implies that a variant with a fundamental type like e.g.
std::variant<int, Opm::Well, Opm::Group> will *not* work in the
std::variant<int, double, Opm::Well, Opm::Group> will *not* work in the
current implementation.
*/
template<class T1, class T2, class T3>
void variant(const std::variant<T1,T2,T3>& _data)
template<class T0, class T1, class T2, class T3>
void variant(const std::variant<T0,T1,T2,T3>& _data)
{
auto handle = [&](auto& d) {
d.serializeOp(*this);
};
std::variant<T1,T2,T3>& data = const_cast<std::variant<T1,T2,T3>&>(_data);
std::variant<T0,T1,T2,T3>& data = const_cast<std::variant<T0,T1,T2,T3>&>(_data);
if (m_op == Operation::PACKSIZE) {
m_packSize += Mpi::packSize(data.index(), m_comm);
std::visit( [&] (auto& arg) { handle(arg); }, data);
@@ -130,16 +130,19 @@ public:
Mpi::unpack(index, m_buffer, m_position, m_comm);
if (index == 0) {
data = T1();
data = T0();
handle(std::get<0>(data));
} else if (index == 1) {
data = T2();
data = T1();
handle(std::get<1>(data));
} else if (index == 2) {
data = T3();
data = T2();
handle(std::get<2>(data));
} else if (index == 3) {
data = T3();
handle(std::get<3>(data));
} else
std::logic_error("Internal meltdown in std::variant<T1,T2,T3> unpack");
std::logic_error("Internal meltdown in std::variant<T0,T1,T2,T3> unpack");
}
}