creativity  v1.3.0
Agent-based model of creativity and piracy
Policy.hpp
1 #pragma once
2 #include <cstdint>
3 #include <string>
4 #include <eris/serialize/serializer.hpp>
5 
6 namespace creativity {
7 
12 class Policy final {
13 public:
15  constexpr Policy() : Policy(0) {};
16 
20  constexpr Policy(uint32_t policy_code) : code_{policy_code} {}
21 
29  constexpr Policy(
30  bool public_sharing,
31  bool public_voting,
32  bool catch_pirates) : code_{
33  public_sharing * POLICY_PUBLIC_SHARING +
34  public_voting * POLICY_PUBLIC_VOTING +
35  catch_pirates * POLICY_CATCH_PIRATES}
36  {}
37 
48  explicit Policy(const std::string &p);
49 
51  constexpr static Policy PublicSharing() { return POLICY_PUBLIC_SHARING; }
53  constexpr static Policy PublicVoting() { return POLICY_PUBLIC_VOTING; }
55  constexpr static Policy CatchPirates() { return POLICY_CATCH_PIRATES; }
57  constexpr static Policy All() { return Policy(true, true, true); }
58 
60  constexpr bool publicSharing() const { return code_ & POLICY_PUBLIC_SHARING; }
62  constexpr bool publicVoting() const { return code_ & POLICY_PUBLIC_VOTING; }
64  constexpr bool catchPirates() const { return code_ & POLICY_CATCH_PIRATES; }
65 
69  constexpr bool unknown() const { return code_ & ~(POLICY_PUBLIC_SHARING | POLICY_PUBLIC_VOTING | POLICY_CATCH_PIRATES); }
70 
72  constexpr bool all() const { return publicSharing() && publicVoting() && catchPirates(); }
73 
77  constexpr operator bool() const { return (publicSharing() || publicVoting() || catchPirates()) && !unknown(); }
78 
80  constexpr operator uint32_t() const { return code_; }
81 
83  constexpr bool operator==(const Policy &other) const { return code_ == other.code_; }
84 
86  constexpr bool operator!=(const Policy &other) const { return code_ != other.code_; }
87 
93  Policy& operator+=(const Policy &add);
94 
98  Policy& operator-=(const Policy &remove);
99 
102  constexpr Policy operator+(const Policy &plus) const {
103  return Policy(
104  publicSharing() || plus.publicSharing(),
105  publicVoting() || plus.publicVoting(),
106  catchPirates() || plus.catchPirates()
107  );
108  }
109 
110 private:
111  uint32_t code_;
112 
113  friend class eris::serialize::serializer<Policy>;
114  friend class eris::serialize::serializer<const Policy>;
115 
116  // The bits for the known policies:
117  constexpr static uint32_t
118  POLICY_PUBLIC_SHARING = 1 << 0,
119  POLICY_CATCH_PIRATES = 1 << 1,
120  POLICY_PUBLIC_VOTING = 1 << 2;
121 };
122 
123 }
124 
125 namespace eris { namespace serialize {
126 
128 template <> class serializer<creativity::Policy> : public serializer<uint32_t> {
129 public:
131  explicit serializer(creativity::Policy &p) : serializer<uint32_t>(p.code_) {}
132 };
134 template <> class serializer<const creativity::Policy> : public serializer<const uint32_t> {
135 public:
137  explicit serializer(const creativity::Policy &p) : serializer<const uint32_t>(p.code_) {}
138 };
139 
140 }}
constexpr bool publicVoting() const
Returns true if this policy has public sharing with voting enabled.
Definition: Policy.hpp:62
constexpr bool publicSharing() const
Returns true if this policy has basic public sharing enabled.
Definition: Policy.hpp:60
Primary namespace for all Creativity library code.
Definition: config.hpp:4
constexpr Policy()
Default construction results in an all-disabled policy.
Definition: Policy.hpp:15
constexpr Policy operator+(const Policy &plus) const
Returns a new Policy object with all policies enabled that are enabled in either argument.
Definition: Policy.hpp:102
constexpr bool operator==(const Policy &other) const
Returns true if the two policy objects represent the same policy choice.
Definition: Policy.hpp:83
Definition: Policy.hpp:125
static constexpr Policy PublicSharing()
Returns a constexpr Policy value for public sharing.
Definition: Policy.hpp:51
static constexpr Policy PublicVoting()
Returns a constexpr Policy value for public voting.
Definition: Policy.hpp:53
constexpr bool unknown() const
Returns true if the policy has some unknown policy enabled (that is, some policy code that isn&#39;t cons...
Definition: Policy.hpp:69
Policy & operator-=(const Policy &remove)
Modifies this Policy value by disabling any policies that are enabled in the given Policy...
constexpr Policy(bool public_sharing, bool public_voting, bool catch_pirates)
Constructs a Policy wrapper from booleans for each policy type.
Definition: Policy.hpp:29
static constexpr Policy CatchPirates()
Returns a constexpr Policy value for catch pirates.
Definition: Policy.hpp:55
constexpr bool catchPirates() const
Returns true if this policy has catching pirates enabled.
Definition: Policy.hpp:64
constexpr bool operator!=(const Policy &other) const
Negation of ==.
Definition: Policy.hpp:86
serializer(const creativity::Policy &p)
Constructs a serializer that serializes the policy&#39;s internal uint32_t policy code.
Definition: Policy.hpp:137
Class for interpreting and/or constructing encoded policy values.
Definition: Policy.hpp:12
constexpr bool all() const
Returns true if all (known) policies are enabled.
Definition: Policy.hpp:72
Policy & operator+=(const Policy &add)
Modifies this Policy value by enabling any policies enabled in the given Policy.
serializer(creativity::Policy &p)
Constructs a serializer that serializes the policy&#39;s internal uint32_t policy code.
Definition: Policy.hpp:131
static constexpr Policy All()
Returns a constexpr Policy value with all (known) policies enabled.
Definition: Policy.hpp:57
constexpr Policy(uint32_t policy_code)
Constructs a Policy wrapper from an encoded policy value.
Definition: Policy.hpp:20