0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-09 05:29:00 +02:00

ircd::rand: Modernize interface.

This commit is contained in:
Jason Volk 2018-02-15 12:53:00 -08:00
parent d6ad4ce45e
commit 7b0c53501a
2 changed files with 10 additions and 41 deletions

View file

@ -33,22 +33,11 @@ namespace ircd::rand
// Random character from dictionary
char character(const std::string &dict = dict::alnum);
// Random string of len from dictionary; char buffers null terminated, uchar not.
template<size_t size> string_view string(const std::string &dict, const size_t &len, char (&buf)[size]);
string_view string(const std::string &dict, const size_t &len, char *const &buf, const size_t &max);
string_view string(const std::string &dict, const size_t &len, uint8_t *const &buf);
// Random string from dictionary
string_view string(const std::string &dict, const mutable_buffer &out);
std::string string(const std::string &dict, const size_t &len);
}
template<size_t size>
ircd::string_view
ircd::rand::string(const std::string &dict,
const size_t &len,
char (&buf)[size])
{
return string(dict, len, buf, size);
}
// Random character from dictionary
inline char
ircd::rand::character(const std::string &dict)

View file

@ -48,47 +48,27 @@ std::string
ircd::rand::string(const std::string &dict,
const size_t &len)
{
std::string ret(len, char());
string(dict, len, reinterpret_cast<uint8_t *>(&ret.front()));
return ret;
}
ircd::string_view
ircd::rand::string(const std::string &dict,
const size_t &len,
char *const &buf,
const size_t &max)
{
if(unlikely(!max))
return { buf, max };
const auto size
return ircd::util::string(len, [&dict]
(const mutable_buffer &buf)
{
std::min(len, max - 1)
};
buf[size] = '\0';
return string(dict, size, reinterpret_cast<uint8_t *>(buf));
return string(dict, buf);
});
}
ircd::string_view
ircd::rand::string(const std::string &dict,
const size_t &len,
uint8_t *const &buf)
const mutable_buffer &out)
{
std::uniform_int_distribution<size_t> dist
{
0, dict.size() - 1
};
std::generate(buf, buf + len, [&dict, &dist]
() -> uint8_t
std::generate(data(out), data(out) + size(out), [&dict, &dist]
() -> char
{
return dict.at(dist(mt));
});
return string_view
{
reinterpret_cast<const char *>(buf), len
};
return out;
}