robot_name: iteration 2

This commit is contained in:
Dmitry Kokorin 2016-03-06 18:31:50 +03:00
parent 7339e6a8bc
commit 287152896a

View file

@ -1,6 +1,7 @@
#include "robot_name.h" #include "robot_name.h"
#include <algorithm> #include <algorithm>
#include <set>
namespace robot_name { namespace robot_name {
@ -13,6 +14,7 @@ namespace {
const size_t alpha_part_size = 2; const size_t alpha_part_size = 2;
const size_t digit_part_size = 3; const size_t digit_part_size = 3;
string random_string(size_t size, char from_char, char to_char) string random_string(size_t size, char from_char, char to_char)
{ {
auto random_char = [from_char, to_char]() -> char { auto random_char = [from_char, to_char]() -> char {
@ -35,8 +37,21 @@ robot::robot()
void robot::reset() void robot::reset()
{ {
name_ = random_string(alpha_part_size, 'A', 'Z') static set<name_t> used_names;
+ random_string(digit_part_size, '0', '9'); static const size_t name_capacity = pow('Z' - 'A' + 1, alpha_part_size)
* pow('9' - '0' + 1, digit_part_size);
string new_name;
do {
new_name = random_string(alpha_part_size, 'A', 'Z')
+ random_string(digit_part_size, '0', '9');
} while (used_names.size() < name_capacity && used_names.count(new_name));
used_names.erase(name_);
name_ = new_name;
used_names.insert(name_);
} }
const name_t &robot::name() const const name_t &robot::name() const