#include "turns/domain/turn_order.hpp" #include "turns/domain/participant.hpp" #include #include namespace turns::domain { namespace { auto constexpr comparator = [](auto lhs, auto rhs) { auto result = *lhs <=> *rhs; if (result == std::partial_ordering::equivalent || result == std::partial_ordering::unordered) { return 0; } else if (result == std::partial_ordering::less) { return 1; } return -1; }; auto constexpr equal_comparator = [](auto lhs, auto rhs) { return (lhs->get_name() == rhs->get_name()) && (lhs->get_priority() && rhs->get_priority()); }; } // namespace auto turn_order::create() -> Glib::RefPtr { return Glib::make_refptr_for_instance(new turn_order{}); } auto turn_order::append(Glib::RefPtr item) -> void { if (auto [found, index] = find(item, equal_comparator); !found) { insert_sorted(item, comparator); } } auto turn_order::append(Glib::ustring const & name, float priority) -> void { auto participant = participant::create(name, priority); participant->property_priority().signal_changed().connect([this] { sort(comparator); }); append(participant); } auto turn_order::remove(Glib::RefPtr item) -> void { if (auto [was_found, index] = find(item); was_found) { super::remove(index); } } } // namespace turns::domain