summaryrefslogtreecommitdiff
path: root/lib/src/turns-turn-order.cpp
blob: 287e19cbd8e191dab092f6ec15dbf6e0d8808e82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include "turns-turn-order.h"

#include <glib-object.h>
#include <glib.h>

#include <array>
#include <cstddef>
#include <limits>

G_BEGIN_DECLS

struct _TurnsTurnOrder
{
  GObject parent_instance;

  gsize participant_count;
  gboolean running;
};

G_DEFINE_FINAL_TYPE(TurnsTurnOrder, turns_turn_order, G_TYPE_OBJECT);

G_END_DECLS

namespace
{
  enum struct property
  {
    ParticipantCount = 1,
    Running,
    N_PROPERTIES,
  };

  auto static constinit properties = std::array<GParamSpec *, static_cast<std::size_t>(property::N_PROPERTIES)>{};

  auto get_property(GObject * self, guint id, GValue * value, GParamSpec * specification) -> void
  {
    auto instance = TURNS_TURN_ORDER(self);

    switch (static_cast<property>(id))
    {
    case property::ParticipantCount:
      return g_value_set_uint64(value, turns_turn_order_get_participant_count(instance));
    case property::Running:
      return g_value_set_boolean(value, turns_turn_order_get_running(instance));
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID(self, id, specification);
    }
  }

}  // namespace

G_BEGIN_DECLS

static void turns_turn_order_class_init(TurnsTurnOrderClass * klass)
{
  auto object_class = G_OBJECT_CLASS(klass);

  object_class->get_property = get_property;

  properties[static_cast<std::size_t>(property::ParticipantCount)] =
      g_param_spec_uint64("participant-count",
                          "Participant Count",
                          "The number of participants in this turn order.",
                          0,
                          std::numeric_limits<gsize>::max(),
                          0,
                          static_cast<GParamFlags>(G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY));

  properties[static_cast<std::size_t>(property::Running)] =
      g_param_spec_boolean("running",
                           "Running",
                           "Whether or not the turn order is running (e.g. has been started)",
                           false,
                           static_cast<GParamFlags>(G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY));

  g_object_class_install_properties(object_class, properties.size(), properties.data());
}

static void turns_turn_order_init(TurnsTurnOrder * self)
{
  self->participant_count = 0;
  self->running = false;
}

TurnsTurnOrder * turns_turn_order_new()
{
  return TURNS_TURN_ORDER(g_object_new(TURNS_TYPE_TURN_ORDER, nullptr));
}

gsize turns_turn_order_get_participant_count(TurnsTurnOrder const * self)
{
  g_return_val_if_fail(TURNS_IS_TURN_ORDER(const_cast<TurnsTurnOrder *>(self)), 0);
  return self->participant_count;
}

gboolean turns_turn_order_get_running(TurnsTurnOrder const * self)
{
  g_return_val_if_fail(TURNS_IS_TURN_ORDER(const_cast<TurnsTurnOrder *>(self)), false);
  return self->running;
}

G_END_DECLS