Skip to content

Commit

Permalink
[共通] String::choice() #1253
Browse files Browse the repository at this point in the history
  • Loading branch information
Reputeless committed Aug 7, 2024
1 parent b8429b2 commit 6644bbf
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 0 deletions.
26 changes: 26 additions & 0 deletions Siv3D/include/Siv3D/String.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,32 @@ namespace s3d
[[nodiscard]]
String capitalized()&&;

/// @brief 文字列の要素を 1 つランダムに返します。
/// @return 文字列からランダムに選ばれた要素への参照
[[nodiscard]]
value_type& choice();

/// @brief 文字列の要素を 1 つランダムに返します。
/// @return 文字列からランダムに選ばれた要素への参照
[[nodiscard]]
const value_type& choice() const;

/// @brief 指定した乱数エンジンを用いて、文字列の要素を 1 つランダムに返します。
/// @tparam URBG 使用する乱数エンジンの型
/// @param rbg 使用する乱数エンジン
/// @return 文字列からランダムに選ばれた要素への参照
SIV3D_CONCEPT_URBG
[[nodiscard]]
value_type& choice(URBG&& rbg);

/// @brief 指定した乱数エンジンを用いて、文字列の要素を 1 つランダムに返します。
/// @tparam URBG 使用する乱数エンジンの型
/// @param rbg 使用する乱数エンジン
/// @return 文字列からランダムに選ばれた要素への参照
SIV3D_CONCEPT_URBG
[[nodiscard]]
const value_type& choice(URBG&& rbg) const;

/// @brief 指定した値と等しい要素の個数を返します。
/// @param ch 検索する値
/// @return 指定した値と等しい要素の個数
Expand Down
26 changes: 26 additions & 0 deletions Siv3D/include/Siv3D/detail/String.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -642,6 +642,32 @@ namespace s3d
return std::any_of(m_string.begin(), m_string.end(), f);
}

SIV3D_CONCEPT_URBG_
inline String::value_type& String::choice(URBG&& rbg)
{
const size_t size = m_string.size();

if (size == 0)
{
throw std::out_of_range{ "String::choice(): String is empty" };
}

return m_string[RandomClosedOpen<size_t>(0, size, std::forward<URBG>(rbg))];
}

SIV3D_CONCEPT_URBG_
inline const String::value_type& String::choice(URBG&& rbg) const
{
const size_t size = m_string.size();

if (size == 0)
{
throw std::out_of_range{ "String::choice(): String is empty" };
}

return m_string[RandomClosedOpen<size_t>(0, size, std::forward<URBG>(rbg))];
}

template <class Fty, std::enable_if_t<std::is_invocable_r_v<bool, Fty, char32>>*>
inline size_t String::count_if(Fty f) const
{
Expand Down
10 changes: 10 additions & 0 deletions Siv3D/src/Siv3D/String/SivString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,16 @@ namespace s3d
return std::move(*this);
}

String::value_type& String::choice()
{
return choice(GetDefaultRNG());
}

const String::value_type& String::choice() const
{
return choice(GetDefaultRNG());
}

size_t String::count(const value_type ch) const noexcept
{
return std::count(m_string.begin(), m_string.end(), ch);
Expand Down

0 comments on commit 6644bbf

Please sign in to comment.