Skip to content

Commit 2452fba

Browse files
refactor: Update casting templates to use std_numeric for improved type safety to resolve #17 compile problem
1 parent b0ad7f2 commit 2452fba

1 file changed

Lines changed: 15 additions & 5 deletions

File tree

src/conversion/underlying.cppm

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -303,42 +303,44 @@ constexpr auto numeric_risk(SrcRep value)
303303
return details::numeric_risk<DestRep>(value);
304304
}
305305

306-
template <numeric_underlying_type DestRep, numeric_underlying_type SrcRep>
306+
template <std_numeric DestRep, std_numeric SrcRep>
307307
requires details::statically_castable<DestRep, SrcRep>
308308
constexpr auto unchecked_cast(SrcRep value) noexcept
309309
-> std::remove_cvref_t<DestRep> {
310310
return details::unchecked_rep_cast<DestRep>(value);
311311
}
312312

313-
template <numeric_underlying_type DestRep, numeric_underlying_type SrcRep>
313+
template <std_numeric DestRep, std_numeric SrcRep>
314314
requires details::statically_castable<DestRep, SrcRep>
315315
constexpr auto checked_cast(SrcRep value)
316316
-> cast_result<std::remove_cvref_t<DestRep>> {
317317
return details::checked_rep_cast<DestRep>(value);
318318
}
319319

320-
template <numeric_underlying_type DestRep, numeric_underlying_type SrcRep>
320+
template <std_numeric DestRep, std_numeric SrcRep>
321321
requires details::statically_castable<DestRep, SrcRep>
322322
constexpr auto saturating_cast(SrcRep value) noexcept
323323
-> std::remove_cvref_t<DestRep> {
324324
return details::saturating_rep_cast<DestRep>(value);
325325
}
326326

327-
template <numeric_underlying_type DestRep, numeric_underlying_type SrcRep>
327+
template <std_numeric DestRep, std_numeric SrcRep>
328328
requires details::statically_castable<DestRep, SrcRep>
329329
constexpr auto truncating_cast(SrcRep value) noexcept
330330
-> std::remove_cvref_t<DestRep> {
331331
return details::truncating_rep_cast<DestRep>(value);
332332
}
333333

334-
template <numeric_underlying_type DestRep, numeric_underlying_type SrcRep>
334+
template <std_numeric DestRep, std_numeric SrcRep>
335335
requires details::statically_castable<DestRep, SrcRep>
336336
constexpr auto exact_cast(SrcRep value)
337337
-> cast_result<std::remove_cvref_t<DestRep>> {
338338
return details::exact_rep_cast<DestRep>(value);
339339
}
340340

341341
template <underlying_type Dest, underlying_type Src>
342+
requires(!details::builtin_numeric_pair<std::remove_cv_t<Dest>,
343+
std::remove_cv_t<Src>>)
342344
constexpr auto unchecked_cast(Src value) noexcept -> Dest {
343345
return details::cast_underlying_value<Dest>(
344346
value, []<typename DestRep, typename SrcRep>(SrcRep rep) {
@@ -347,6 +349,8 @@ constexpr auto unchecked_cast(Src value) noexcept -> Dest {
347349
}
348350

349351
template <underlying_type Dest, underlying_type Src>
352+
requires(!details::builtin_numeric_pair<std::remove_cv_t<Dest>,
353+
std::remove_cv_t<Src>>)
350354
constexpr auto checked_cast(Src value) -> cast_result<Dest> {
351355
return details::cast_underlying_result<Dest>(
352356
value, []<typename DestRep, typename SrcRep>(SrcRep rep) {
@@ -355,6 +359,8 @@ constexpr auto checked_cast(Src value) -> cast_result<Dest> {
355359
}
356360

357361
template <underlying_type Dest, underlying_type Src>
362+
requires(!details::builtin_numeric_pair<std::remove_cv_t<Dest>,
363+
std::remove_cv_t<Src>>)
358364
constexpr auto saturating_cast(Src value) noexcept -> Dest {
359365
return details::cast_underlying_value<Dest>(
360366
value, []<typename DestRep, typename SrcRep>(SrcRep rep) {
@@ -363,6 +369,8 @@ constexpr auto saturating_cast(Src value) noexcept -> Dest {
363369
}
364370

365371
template <underlying_type Dest, underlying_type Src>
372+
requires(!details::builtin_numeric_pair<std::remove_cv_t<Dest>,
373+
std::remove_cv_t<Src>>)
366374
constexpr auto truncating_cast(Src value) noexcept -> Dest {
367375
return details::cast_underlying_value<Dest>(
368376
value, []<typename DestRep, typename SrcRep>(SrcRep rep) {
@@ -371,6 +379,8 @@ constexpr auto truncating_cast(Src value) noexcept -> Dest {
371379
}
372380

373381
template <underlying_type Dest, underlying_type Src>
382+
requires(!details::builtin_numeric_pair<std::remove_cv_t<Dest>,
383+
std::remove_cv_t<Src>>)
374384
constexpr auto exact_cast(Src value) -> cast_result<Dest> {
375385
return details::cast_underlying_result<Dest>(
376386
value, []<typename DestRep, typename SrcRep>(SrcRep rep) {

0 commit comments

Comments
 (0)