Skip to content

Commit 5652030

Browse files
committed
feat(random): Allow any 2 types as long as they're both integer or floating type
1 parent 55cf6c3 commit 5652030

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

src/listfetcher/ListFetcher.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ void ListFetcher::getRandomNormalListLevel(GJDifficulty difficulty, geode::Resul
103103
);
104104
}
105105

106-
auto randomIdx = rl::utils::randomNumber<std::size_t>(0, response.levels.size() - 1);
106+
auto randomIdx = rl::utils::randomNumber(0, response.levels.size() - 1);
107107
result = geode::Ok(level_pair_t{
108108
response.levels[randomIdx],
109109
rl::utils::getCreatorFromLevelResponse(response.creators, response.levels[randomIdx])
@@ -127,7 +127,7 @@ void ListFetcher::getRandomNormalListLevel(GJDifficulty difficulty, geode::Resul
127127
.bodyString(
128128
fmt::format("secret={}&type={}&star={}&page={}&len={}{}",
129129
GJ_SECRET, 0, 1,
130-
rl::utils::randomNumber<std::uint16_t>(
130+
rl::utils::randomNumber(
131131
1,
132132
CacheManager::get().getValue<CMKey::NORMAL_LIST_MAX_PAGES, int>(difficulty, 1)
133133
),
@@ -170,7 +170,7 @@ void ListFetcher::getRandomDemonListLevel(geode::Result<level_pair_t>& result)
170170

171171
std::size_t randomIndex;
172172
do {
173-
randomIndex = rl::utils::randomNumber<std::size_t>(0, array.size() - 1);
173+
randomIndex = rl::utils::randomNumber(0, array.size() - 1);
174174
} while (array[randomIndex]["level_id"].isNull());
175175

176176
int levelId = array[randomIndex].template get<int>("level_id").unwrapOr(-1);
@@ -203,7 +203,7 @@ void ListFetcher::getRandomDemonListLevel(geode::Result<level_pair_t>& result)
203203
"{}/?limit=100&after={}",
204204
DEMONLIST_URL,
205205
rl::utils::randomNumber(
206-
static_cast<unsigned short>(0),
206+
0,
207207
rl::constants::list_fetcher::DEMON_LIST_MAX_PAGE
208208
)
209209
)
@@ -243,7 +243,7 @@ void ListFetcher::getRandomChallengeListLevel(geode::Result<level_pair_t>& resul
243243

244244
std::uint16_t randomIndex;
245245
do {
246-
randomIndex = rl::utils::randomNumber<std::uint16_t>(0, array.size() - 1);
246+
randomIndex = rl::utils::randomNumber(0, array.size() - 1);
247247
} while (array[randomIndex]["level_id"].isNull());
248248

249249
int levelId = array[randomIndex].template get<int>("level_id").unwrapOr(-1);
@@ -276,7 +276,7 @@ void ListFetcher::getRandomChallengeListLevel(geode::Result<level_pair_t>& resul
276276
"{}/?limit=100&after={}",
277277
CHALLENGELIST_URL,
278278
rl::utils::randomNumber(
279-
static_cast<unsigned short>(0),
279+
0,
280280
rl::constants::list_fetcher::CHALLENGE_LIST_MAX_PAGE
281281
)
282282
)

src/utils/utils.hpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,17 @@ namespace rl
3333
*
3434
* @tparam T type of number, floating type or integer type
3535
*/
36-
template <typename T>
37-
inline T randomNumber(T min, T max) requires (std::is_arithmetic_v<T>)
36+
template <typename T1, typename T2>
37+
inline T2 randomNumber(T1 min, T2 max) requires (std::is_arithmetic_v<T1> && std::is_arithmetic_v<T2> && std::is_convertible_v<T1, T2>)
3838
{
39+
static_assert(
40+
(std::is_integral_v<T1> && std::is_integral_v<T2>) ||
41+
(std::is_floating_point_v<T1> && std::is_floating_point_v<T2>),
42+
"Both min and max should be either floating type or integer type!"
43+
);
44+
3945
return std::conditional_t<
40-
std::is_integral_v<T>, std::uniform_int_distribution<T>, std::uniform_real_distribution<T>
46+
std::is_integral_v<T2>, std::uniform_int_distribution<T2>, std::uniform_real_distribution<T2>
4147
>(min, max)(impl::rand_generator);
4248
}
4349

0 commit comments

Comments
 (0)