CPP-TOOLBOX
Loading...
Searching...
No Matches
unique_id_generator.hpp
Go to the documentation of this file.
1#ifndef UNIQUE_ID_GENERATOR_HPP
2#define UNIQUE_ID_GENERATOR_HPP
3
4#include <queue>
5#include <stdexcept>
6#include <unordered_set>
7#include <iostream>
8#include <sstream>
9
11 public:
12 virtual int get_id() = 0;
13 virtual void reclaim_id(int id) = 0;
14 virtual ~IDGenerator() {}
15};
16
18 public:
19 int get_id() override {
20 if (!reclaimed_ids.empty()) {
21 int id = reclaimed_ids.front();
22 reclaimed_ids.pop();
23 used_ids.insert(id);
24 return id;
25 }
26 int id = next_id++;
27 used_ids.insert(id);
28 return id;
29 }
30
31 void reclaim_id(int id_value) override {
32 if (used_ids.find(id_value) == used_ids.end()) {
33 throw std::invalid_argument("Invalid or already reclaimed ID");
34 }
35 used_ids.erase(id_value);
36 reclaimed_ids.push(id_value);
37 }
38
39 std::vector<int> get_used_ids() const { return std::vector<int>(used_ids.begin(), used_ids.end()); }
40
41 friend std::ostream &operator<<(std::ostream &os, const UniqueIDGenerator &generator) {
42 os << "Used IDs: [";
43 std::vector<int> ids = generator.get_used_ids();
44 for (size_t i = 0; i < ids.size(); ++i) {
45 os << ids[i];
46 if (i < ids.size() - 1) {
47 os << ", ";
48 }
49 }
50 os << "]";
51 return os;
52 }
53
54 int next_id = 0;
55 std::unordered_set<int> used_ids;
56 std::queue<int> reclaimed_ids;
57};
58
60 public:
61 explicit BoundedUniqueIDGenerator(int max_value) : max_value(max_value), next_id(0) {
62 if (max_value <= 0) {
63 throw std::invalid_argument("max_value must be greater than 0");
64 }
65
66 for (int i = 0; i < max_value; ++i) {
67 available_ids.push(i);
68 }
69 }
70
71 int get_id() override {
72 if (available_ids.empty()) {
73 throw std::runtime_error("Maximum ID limit reached");
74 }
75
76 int id = available_ids.front();
77 available_ids.pop();
78 used_ids.insert(id);
79 return id;
80 }
81
82 void reclaim_id(int id_value) override {
83 if (id_value < 0 || id_value >= max_value || used_ids.find(id_value) == used_ids.end()) {
84 throw std::invalid_argument("Invalid or already reclaimed ID: " + std::to_string(id_value));
85 }
86
87 used_ids.erase(id_value);
88 available_ids.push(id_value);
89 }
90
91 std::vector<int> get_free_ids() const {
92 std::vector<int> free_ids;
93 std::queue<int> temp_queue = available_ids;
94 while (!temp_queue.empty()) {
95 free_ids.push_back(temp_queue.front());
96 temp_queue.pop();
97 }
98 return free_ids;
99 }
100
101 std::vector<int> get_used_ids() const { return std::vector<int>(used_ids.begin(), used_ids.end()); }
102
103 double get_used_percentage() const { return (static_cast<double>(used_ids.size()) / max_value) * 100.0; }
104
105 std::string to_string() const {
106 std::ostringstream ss;
107 ss << "Used IDs: [";
108 std::vector<int> ids = get_used_ids();
109 for (size_t i = 0; i < ids.size(); ++i) {
110 ss << ids[i];
111 if (i < ids.size() - 1) {
112 ss << ", ";
113 }
114 }
115 ss << "] | Used: " << get_used_percentage() << "%";
116 return ss.str();
117 }
118
119 friend std::ostream &operator<<(std::ostream &os, const BoundedUniqueIDGenerator &generator) {
120 return os << generator.to_string();
121 }
122
123 private:
124 int max_value;
125 int next_id;
126 std::queue<int> available_ids;
127 std::unordered_set<int> used_ids;
128};
129
135 public:
140 static int get_id();
142
143 private:
144 static int current_id;
145};
146
147#endif // UNIQUE_ID_GENERATOR_HPP
std::vector< int > get_used_ids() const
Definition unique_id_generator.hpp:101
double get_used_percentage() const
Definition unique_id_generator.hpp:103
void reclaim_id(int id_value) override
Definition unique_id_generator.hpp:82
friend std::ostream & operator<<(std::ostream &os, const BoundedUniqueIDGenerator &generator)
Definition unique_id_generator.hpp:119
std::vector< int > get_free_ids() const
Definition unique_id_generator.hpp:91
std::string to_string() const
Definition unique_id_generator.hpp:105
int get_id() override
Definition unique_id_generator.hpp:71
BoundedUniqueIDGenerator(int max_value)
Definition unique_id_generator.hpp:61
A class for generating unique IDs.
Definition unique_id_generator.hpp:134
static int get_id()
Retrieves the next unique ID.
Definition unique_id_generator.cpp:6
static int last_generated_id
Definition unique_id_generator.hpp:141
Definition unique_id_generator.hpp:10
virtual void reclaim_id(int id)=0
virtual int get_id()=0
virtual ~IDGenerator()
Definition unique_id_generator.hpp:14
Definition unique_id_generator.hpp:17
friend std::ostream & operator<<(std::ostream &os, const UniqueIDGenerator &generator)
Definition unique_id_generator.hpp:41
int get_id() override
Definition unique_id_generator.hpp:19
std::unordered_set< int > used_ids
Definition unique_id_generator.hpp:55
std::vector< int > get_used_ids() const
Definition unique_id_generator.hpp:39
int next_id
Definition unique_id_generator.hpp:54
std::queue< int > reclaimed_ids
Definition unique_id_generator.hpp:56
void reclaim_id(int id_value) override
Definition unique_id_generator.hpp:31
@ i
Definition input_state.hpp:35