18 std::variant<BarrierLog*, BcastLog*, ReduceLog*, AllreduceLog*>;
27 log = std::move(o.log);
28 variant = std::move(o.variant);
33 template <
typename LogT,
typename... Args>
35 auto l = std::make_unique<LogT>(args...);
41 i, serialize::read<size_t>(i),
42 std::make_index_sequence<std::variant_size_v<CollectiveLogVariant>>{}
46 void serialize(std::ostream& o)
const {
48 serialize::write<size_t>(o, variant.index());
49 serialize::write(o, *log);
52 operator bool()
const {
return !!log; }
59 return log->idx() <=> o->idx();
61 auto operator<=>(
const int& i)
const {
63 return log->idx() <=> i;
65 auto operator==(
const int& i)
const {
67 return log->idx() == i;
71 template <
size_t... I>
72 void read_log(std::istream& input,
size_t type, std::index_sequence<I...>) {
73 ((read_log<I>(input, type)), ...);
79 void read_log(std::istream& input,
size_t type) {
80 if (type != I)
return;
81 using LogT = std::remove_pointer_t<
82 std::variant_alternative_t<I, CollectiveLogVariant>>;
83 log = std::make_unique<LogT>(input);
84 variant.emplace<I>(
static_cast<LogT*
>(log.get()));
87 std::unique_ptr<CollectiveLog> log;
88 CollectiveLogVariant variant;
92 std::unique_ptr<CollectiveLog>&& m_log, CollectiveLogVariant&& m_variant
94 : log(std::move(m_log)), variant(std::move(m_variant)) {}