summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/include/turns/core/disposition.hpp21
-rw-r--r--core/include/turns/core/fwd.hpp2
-rw-r--r--core/include/turns/core/participant.hpp10
-rw-r--r--core/include/turns/core/turn_order.hpp2
-rw-r--r--core/src/disposition.cpp37
-rw-r--r--core/src/init.cpp5
-rw-r--r--core/src/participant.cpp10
-rw-r--r--core/src/turn_order.cpp2
-rw-r--r--core/tests/disposition.cpp12
-rw-r--r--core/tests/participant.cpp22
-rw-r--r--core/tests/turn_order.cpp2
-rw-r--r--core/tests/turn_order_bugs.cpp2
12 files changed, 85 insertions, 42 deletions
diff --git a/core/include/turns/core/disposition.hpp b/core/include/turns/core/disposition.hpp
index 92a7d03..89a2cb0 100644
--- a/core/include/turns/core/disposition.hpp
+++ b/core/include/turns/core/disposition.hpp
@@ -2,13 +2,15 @@
#define TURNS_CORE_DISPOSITION_HPP
#include <glibmm/ustring.h>
+#include <glibmm/value.h>
+
+#include <glib-object.h>
#include <cstdint>
namespace turns::core
{
-
- enum struct disposition : std::uint8_t
+ enum struct Disposition : std::uint8_t
{
neutral,
friendly,
@@ -19,8 +21,19 @@ namespace turns::core
END
};
- auto presentation_name_for(disposition value) -> Glib::ustring;
-
+ auto presentation_name_for(Disposition value) -> Glib::ustring;
} // namespace turns::core
+namespace Glib
+{
+ template<>
+ class Value<turns::core::Disposition> : public Glib::Value_Enum<turns::core::Disposition>
+ {
+ GType static constinit inline gtype_{};
+
+ public:
+ auto static value_type() -> GType;
+ };
+} // namespace Glib
+
#endif \ No newline at end of file
diff --git a/core/include/turns/core/fwd.hpp b/core/include/turns/core/fwd.hpp
index 612e8c8..48380e3 100644
--- a/core/include/turns/core/fwd.hpp
+++ b/core/include/turns/core/fwd.hpp
@@ -5,7 +5,7 @@
namespace turns::core
{
- enum struct disposition : std::uint8_t;
+ enum struct Disposition : std::uint8_t;
struct Participant;
struct turn_order;
diff --git a/core/include/turns/core/participant.hpp b/core/include/turns/core/participant.hpp
index d2f2035..0edc421 100644
--- a/core/include/turns/core/participant.hpp
+++ b/core/include/turns/core/participant.hpp
@@ -16,21 +16,21 @@ namespace turns::core
{
struct Participant : Glib::Object
{
- auto static create(Glib::ustring name, float priority, disposition disposition) -> Glib::RefPtr<Participant>;
+ auto static create(Glib::ustring name, float priority, Disposition disposition) -> Glib::RefPtr<Participant>;
auto static create(nlohmann::json const & serialized) -> Glib::RefPtr<Participant>;
Participant();
- Participant(Glib::ustring name, float priority, disposition disposition);
+ Participant(Glib::ustring name, float priority, Disposition disposition);
auto operator<=>(Participant const & other) const noexcept -> std::partial_ordering;
- [[nodiscard]] auto get_disposition() const -> disposition;
+ [[nodiscard]] auto get_disposition() const -> Disposition;
[[nodiscard]] auto get_is_active() const -> bool;
[[nodiscard]] auto get_is_defeated() const -> bool;
[[nodiscard]] auto get_name() const -> Glib::ustring;
[[nodiscard]] auto get_priority() const -> float;
- auto set_disposition(disposition value) -> void;
+ auto set_disposition(Disposition value) -> void;
auto set_is_active(bool value) -> void;
auto set_is_defeated(bool value) -> void;
auto set_name(Glib::ustring const & value) -> void;
@@ -45,7 +45,7 @@ namespace turns::core
auto serialize() -> nlohmann::json;
private:
- Glib::Property<core::disposition> m_disposition{*this, "disposition", core::disposition::neutral};
+ Glib::Property<core::Disposition> m_disposition{*this, "disposition", core::Disposition::neutral};
Glib::Property<bool> m_is_active{*this, "is-active", false};
Glib::Property<bool> m_is_defeated{*this, "is-defeated", false};
Glib::Property<Glib::ustring> m_name{*this, "name", ""};
diff --git a/core/include/turns/core/turn_order.hpp b/core/include/turns/core/turn_order.hpp
index 6a0ee43..030f4c9 100644
--- a/core/include/turns/core/turn_order.hpp
+++ b/core/include/turns/core/turn_order.hpp
@@ -57,7 +57,7 @@ namespace turns::core
auto skip_defeated() -> Glib::PropertyProxy<skip_defeated_type>;
/** Element Modifications */
- auto add(Glib::ustring const & name, float priority, disposition disposition) -> void;
+ auto add(Glib::ustring const & name, float priority, Disposition disposition) -> void;
auto clear() -> void;
auto remove(unsigned index) -> void;
diff --git a/core/src/disposition.cpp b/core/src/disposition.cpp
index 81fb410..4a1a496 100644
--- a/core/src/disposition.cpp
+++ b/core/src/disposition.cpp
@@ -3,24 +3,49 @@
#include <glibmm/i18n.h>
#include <glibmm/ustring.h>
+#include <glib-object.h>
+
+#include <array>
+#include <atomic>
+
namespace turns::core
{
- auto presentation_name_for(disposition value) -> Glib::ustring
+ auto presentation_name_for(Disposition value) -> Glib::ustring
{
switch (value)
{
- case disposition::neutral:
+ case Disposition::neutral:
return _("Neutral");
- case disposition::friendly:
+ case Disposition::friendly:
return _("Friendly");
- case disposition::hostile:
+ case Disposition::hostile:
return _("Hostile");
- case disposition::secret:
+ case Disposition::secret:
return _("Secret");
default:
return _("Unknown disposition value");
}
}
-} // namespace turns::core \ No newline at end of file
+} // namespace turns::core
+
+namespace Glib
+{
+ auto Value<turns::core::Disposition>::value_type() -> GType
+ {
+ auto static is_initialized = std::atomic_flag{false};
+ auto static const values = std::array{
+ GEnumValue{static_cast<int>(turns::core::Disposition::neutral), "TURNS_DISPOSITION_NEUTRAL", "neutral" },
+ GEnumValue{static_cast<int>(turns::core::Disposition::friendly), "TURNS_DISPOSITION_FRIENDLY", "friendly"},
+ GEnumValue{static_cast<int>(turns::core::Disposition::hostile), "TURNS_DISPOSITION_HOSTILE", "hostile" },
+ GEnumValue{static_cast<int>(turns::core::Disposition::secret), "TURNS_DISPOSITION_SECRET", "secret" },
+ GEnumValue{0, nullptr, nullptr },
+ };
+ if (!is_initialized.test_and_set())
+ {
+ gtype_ = g_enum_register_static("TurnsDisposition", values.data());
+ }
+ return gtype_;
+ }
+} // namespace Glib \ No newline at end of file
diff --git a/core/src/init.cpp b/core/src/init.cpp
index 3991248..3434f91 100644
--- a/core/src/init.cpp
+++ b/core/src/init.cpp
@@ -1,8 +1,11 @@
#include "turns/core/init.hpp"
+#include "turns/core/disposition.hpp"
#include "turns/core/participant.hpp"
#include "turns/core/turn_order.hpp"
+#include <glib-object.h>
+
namespace turns::core
{
@@ -10,6 +13,8 @@ namespace turns::core
{
static_cast<void>(Participant{});
static_cast<void>(turn_order{});
+
+ g_type_ensure(Glib::Value<Disposition>::value_type());
}
} // namespace turns::core \ No newline at end of file
diff --git a/core/src/participant.cpp b/core/src/participant.cpp
index 343d461..242b1b2 100644
--- a/core/src/participant.cpp
+++ b/core/src/participant.cpp
@@ -15,14 +15,14 @@
namespace turns::core
{
- auto Participant::create(Glib::ustring name, float priority, core::disposition disposition) -> Glib::RefPtr<Participant>
+ auto Participant::create(Glib::ustring name, float priority, core::Disposition disposition) -> Glib::RefPtr<Participant>
{
return Glib::make_refptr_for_instance(new Participant{name, priority, disposition});
}
auto Participant::create(nlohmann::json const & serialized) -> Glib::RefPtr<Participant>
{
- auto disposition = serialized.value("disposition", disposition::neutral);
+ auto disposition = serialized.value("disposition", Disposition::neutral);
auto priority = serialized.value("priority", 0.0f);
auto name = serialized.value("name", std::string{});
@@ -40,7 +40,7 @@ namespace turns::core
{
}
- Participant::Participant(Glib::ustring name, float priority, core::disposition disposition)
+ Participant::Participant(Glib::ustring name, float priority, core::Disposition disposition)
: Participant()
{
m_name = name;
@@ -53,7 +53,7 @@ namespace turns::core
return m_priority <=> other.m_priority;
}
- auto Participant::get_disposition() const -> disposition
+ auto Participant::get_disposition() const -> Disposition
{
return m_disposition.get_value();
}
@@ -78,7 +78,7 @@ namespace turns::core
return m_priority.get_value();
}
- auto Participant::set_disposition(disposition value) -> void
+ auto Participant::set_disposition(Disposition value) -> void
{
return m_disposition.set_value(value);
}
diff --git a/core/src/turn_order.cpp b/core/src/turn_order.cpp
index ef7bde6..669f746 100644
--- a/core/src/turn_order.cpp
+++ b/core/src/turn_order.cpp
@@ -100,7 +100,7 @@ namespace turns::core
/** Modifiers */
- auto turn_order::add(Glib::ustring const & name, float priority, disposition disposition) -> void
+ auto turn_order::add(Glib::ustring const & name, float priority, Disposition disposition) -> void
{
auto entry = Participant::create(name, priority, disposition);
entry->property_priority().signal_changed().connect(sigc::bind(sigc::mem_fun(*this, &turn_order::handle_priority_changed), entry));
diff --git a/core/tests/disposition.cpp b/core/tests/disposition.cpp
index fda605c..dfab1f7 100644
--- a/core/tests/disposition.cpp
+++ b/core/tests/disposition.cpp
@@ -16,14 +16,14 @@ namespace turns::core::tests
TEST_CASE("to_presentation_name returns the correct string for the current language", "[disposition]")
{
- auto [value, name] = GENERATE(std::pair{disposition::neutral, Glib::ustring{_("Neutral")}},
- std::pair{disposition::friendly, Glib::ustring{_("Friendly")}},
- std::pair{disposition::hostile, Glib::ustring{_("Hostile")}},
- std::pair{disposition::secret, Glib::ustring{_("Secret")}},
- std::pair{static_cast<disposition>(std::numeric_limits<std::underlying_type_t<disposition>>::max()),
+ auto [value, name] = GENERATE(std::pair{Disposition::neutral, Glib::ustring{_("Neutral")}},
+ std::pair{Disposition::friendly, Glib::ustring{_("Friendly")}},
+ std::pair{Disposition::hostile, Glib::ustring{_("Hostile")}},
+ std::pair{Disposition::secret, Glib::ustring{_("Secret")}},
+ std::pair{static_cast<Disposition>(std::numeric_limits<std::underlying_type_t<Disposition>>::max()),
Glib::ustring{_("Unknown disposition value")}});
- SECTION(std::format("the presentation name for '{}' is '{}'", static_cast<std::underlying_type_t<disposition>>(value), name.c_str()))
+ SECTION(std::format("the presentation name for '{}' is '{}'", static_cast<std::underlying_type_t<Disposition>>(value), name.c_str()))
{
REQUIRE(presentation_name_for(value) == name);
}
diff --git a/core/tests/participant.cpp b/core/tests/participant.cpp
index 8c7c230..b3ae5e9 100644
--- a/core/tests/participant.cpp
+++ b/core/tests/participant.cpp
@@ -16,7 +16,7 @@ namespace turns::core::tests
{
auto constexpr name = "Participant #1";
auto constexpr priority = 17;
- auto constexpr disposition = disposition::friendly;
+ auto constexpr disposition = Disposition::friendly;
auto json = nlohmann::json::parse(R"(
{
@@ -33,7 +33,7 @@ namespace turns::core::tests
auto instance = Participant{};
REQUIRE(instance.property_name() == "");
REQUIRE(instance.property_priority() == 0);
- REQUIRE(instance.property_disposition() == disposition::neutral);
+ REQUIRE(instance.property_disposition() == Disposition::neutral);
REQUIRE(!instance.property_is_active());
REQUIRE(!instance.property_is_defeated());
}
@@ -73,21 +73,21 @@ namespace turns::core::tests
{
auto constexpr name = "Participant #2";
auto constexpr priority = 10;
- auto constexpr disposition = disposition::hostile;
+ auto constexpr disposition = Disposition::hostile;
auto instance = Participant{name, priority, disposition};
SECTION("Setting '::disposition' via proxy changes the 'disposition' value")
{
auto old = instance.property_disposition().get_value();
- instance.property_disposition() = static_cast<core::disposition>(static_cast<int>(disposition) - 1);
+ instance.property_disposition() = static_cast<core::Disposition>(static_cast<int>(disposition) - 1);
REQUIRE(instance.property_disposition() != old);
}
SECTION("Setting '::disposition' via glib changes the 'disposition' value")
{
auto old = instance.property_disposition().get_value();
- instance.set_property("disposition", static_cast<core::disposition>(static_cast<int>(disposition) - 1));
+ instance.set_property("disposition", static_cast<core::Disposition>(static_cast<int>(disposition) - 1));
REQUIRE(instance.property_disposition() != old);
}
@@ -152,7 +152,7 @@ namespace turns::core::tests
{
auto constexpr constructed_name = "Vana Thistletop";
auto constexpr constructed_priority = 17;
- auto constexpr constructed_disposition = disposition::friendly;
+ auto constexpr constructed_disposition = Disposition::friendly;
auto instance = Participant{constructed_name, constructed_priority, constructed_disposition};
SECTION("can be created")
@@ -175,8 +175,8 @@ namespace turns::core::tests
SECTION("allowing to set it")
{
- instance.property_disposition() = disposition::hostile;
- REQUIRE(instance.property_disposition() == disposition::hostile);
+ instance.property_disposition() = Disposition::hostile;
+ REQUIRE(instance.property_disposition() == Disposition::hostile);
}
}
@@ -250,7 +250,7 @@ namespace turns::core::tests
TEST_CASE("Serializing a participant")
{
- auto instance = Participant::create("Participant #0", 17.2, disposition::friendly);
+ auto instance = Participant::create("Participant #0", 17.2, Disposition::friendly);
auto serialized = instance->serialize();
SECTION("the active state is serialized correctly")
@@ -260,7 +260,7 @@ namespace turns::core::tests
SECTION("the disposition is serialized correctly")
{
- REQUIRE(serialized.at("disposition") == disposition::friendly);
+ REQUIRE(serialized.at("disposition") == Disposition::friendly);
}
SECTION("the name is serialized correctly")
@@ -293,7 +293,7 @@ namespace turns::core::tests
SECTION("the disposition is de-serialized correctly")
{
- REQUIRE(instance->property_disposition() == disposition::hostile);
+ REQUIRE(instance->property_disposition() == Disposition::hostile);
}
SECTION("the name is de-serialized correctly")
diff --git a/core/tests/turn_order.cpp b/core/tests/turn_order.cpp
index a7a0be0..a7af8d0 100644
--- a/core/tests/turn_order.cpp
+++ b/core/tests/turn_order.cpp
@@ -61,7 +61,7 @@ namespace turns::core::tests
GIVEN("a participant has been added to a turn_order")
{
- instance->add("Participant #0", 0, disposition::neutral);
+ instance->add("Participant #0", 0, Disposition::neutral);
THEN("get_n_items() returns 1")
{
diff --git a/core/tests/turn_order_bugs.cpp b/core/tests/turn_order_bugs.cpp
index d5502bc..2e8937c 100644
--- a/core/tests/turn_order_bugs.cpp
+++ b/core/tests/turn_order_bugs.cpp
@@ -19,7 +19,7 @@ namespace turns::core::tests
{
auto instance = turn_order::create();
- instance->add("A", 0, disposition::neutral);
+ instance->add("A", 0, Disposition::neutral);
WHEN("it is started and then stepped forward, backward, forward")
{