TuringSim
C++ framework to simulate abstract computing models
uidDispenser.h
1 #pragma once
2 
3 #include <utility>
4 
5 namespace TuringSim::Utils {
10  template<typename UID>
11  class UidDispenser {
12  public:
16  typedef UID UIDType;
17  static_assert(std::is_default_constructible_v<UID>);
18 
22 
26  UidDispenser(const UidDispenser& other) : uid(other.uid) {}
27 
31  UidDispenser(UidDispenser&& other) : uid(std::move(other.uid)) {}
32 
38  if(this != &other) {
39  uid = other.uid;
40  }
41  return *this;
42  }
48  if(this != &other) {
49  uid = std::move(other.uid);
50  }
51  return *this;
52  }
53 
57  UID operator()() {
58  return uid++;
59  }
60 
61  private:
62  UID uid {};
63  };
64 
69  template<typename Tag, typename UID>
70  class UidDispenser<std::pair<Tag, UID>> {
71  public:
75  typedef std::pair<Tag, UID> UIDType;
76  static_assert(std::is_default_constructible_v<UID>);
77 
81  UidDispenser(const Tag& tag) : tag(tag) {}
82 
86  UidDispenser(const UidDispenser& other) : tag(other.tag), uid(other.uid) {}
87 
91  UidDispenser(UidDispenser&& other) : tag(std::move(other.tag)), uid(std::move(other.uid)) {}
92 
98  if(this != &other) {
99  tag = other.tag;
100  uid = other.uid;
101  }
102  return *this;
103  }
104 
110  if(this != &other) {
111  tag = std::move(other.tag);
112  uid = std::move(other.uid);
113  }
114  return *this;
115  }
116 
121  return std::make_pair(tag, uid++);
122  }
123 
124  private:
125  Tag tag;
126  UID uid {};
127  };
128 
134  template<typename Tag, typename UID>
136  public:
140  typedef std::pair<Tag, UID> UIDType;
141  static_assert(std::is_default_constructible_v<UID>);
142 
147  return UidDispenser<UIDType>{tag++};
148  }
149  private:
150  Tag tag {};
151  };
152 }
TuringSim::Utils::UidDispenser< std::pair< Tag, UID > >::operator=
UidDispenser & operator=(const UidDispenser &other)
Copy a dispenser.
Definition: uidDispenser.h:97
TuringSim::Utils::UidDispenser< std::pair< Tag, UID > >::operator()
UIDType operator()()
Generate a new identifier.
Definition: uidDispenser.h:120
TuringSim::Utils::UidDispenser< std::pair< Tag, UID > >::UidDispenser
UidDispenser(const UidDispenser &other)
Copy a dispenser.
Definition: uidDispenser.h:86
TuringSim::Utils::UidDispenser::operator=
UidDispenser & operator=(const UidDispenser &other)
Copy a dispenser.
Definition: uidDispenser.h:37
TuringSim::Utils::TaggedUidDispenserFactory
Return a new UID dispenser at each invocation.
Definition: uidDispenser.h:135
TuringSim::Utils::UidDispenser< std::pair< Tag, UID > >::UidDispenser
UidDispenser(const Tag &tag)
Make a new dispenser given a tag.
Definition: uidDispenser.h:81
TuringSim::Utils::UidDispenser< std::pair< Tag, UID > >::UIDType
std::pair< Tag, UID > UIDType
Type of dispensed identifiers.
Definition: uidDispenser.h:75
TuringSim::Utils
The namespace for basic function, not specific to TuringSim.
TuringSim::Utils::TaggedUidDispenserFactory::operator()
UidDispenser< UIDType > operator()()
Generate the next uid dispenser.
Definition: uidDispenser.h:146
TuringSim::Utils::UidDispenser::UidDispenser
UidDispenser(const UidDispenser &other)
Copy a dispenser.
Definition: uidDispenser.h:26
TuringSim::Utils::UidDispenser::UidDispenser
UidDispenser(UidDispenser &&other)
Move a dispenser.
Definition: uidDispenser.h:31
TuringSim::Utils::UidDispenser::operator=
UidDispenser & operator=(UidDispenser &&other)
Move a dispenser.
Definition: uidDispenser.h:47
TuringSim::Utils::UidDispenser::operator()
UID operator()()
Generate a new identifier.
Definition: uidDispenser.h:57
TuringSim::Utils::UidDispenser< std::pair< Tag, UID > >::UidDispenser
UidDispenser(UidDispenser &&other)
Move a dispenser.
Definition: uidDispenser.h:91
TuringSim::Utils::TaggedUidDispenserFactory::UIDType
std::pair< Tag, UID > UIDType
Type of dispensed identifiers by dispensed dispensers.
Definition: uidDispenser.h:140
TuringSim::Utils::UidDispenser
A dispenser of unique identifier.
Definition: uidDispenser.h:11
TuringSim::Utils::UidDispenser::UIDType
UID UIDType
Type of dispensed identifiers.
Definition: uidDispenser.h:16
TuringSim::Utils::UidDispenser::UidDispenser
UidDispenser()
Make a new dispenser.
Definition: uidDispenser.h:21
TuringSim::Utils::UidDispenser< std::pair< Tag, UID > >::operator=
UidDispenser & operator=(UidDispenser &&other)
Move a dispenser.
Definition: uidDispenser.h:109