Skip to content

Commit d272d94

Browse files
authored
[libc++][NFC] Simplify the implementation of numeric_limits (#80425)
The cv specializations for `numeric_limits` inherited privately for some reason. We can simplify the implementation by inheriting publicly and removing the members that just replicate the values from the base class.
1 parent 544f610 commit d272d94

File tree

1 file changed

+5
-278
lines changed

1 file changed

+5
-278
lines changed

libcxx/include/limits

Lines changed: 5 additions & 278 deletions
Original file line numberDiff line numberDiff line change
@@ -436,8 +436,8 @@ protected:
436436
};
437437

438438
template <class _Tp>
439-
class _LIBCPP_TEMPLATE_VIS numeric_limits : private __libcpp_numeric_limits<__remove_cv_t<_Tp> > {
440-
typedef __libcpp_numeric_limits<__remove_cv_t<_Tp> > __base;
439+
class _LIBCPP_TEMPLATE_VIS numeric_limits : private __libcpp_numeric_limits<_Tp> {
440+
typedef __libcpp_numeric_limits<_Tp> __base;
441441
typedef typename __base::type type;
442442

443443
public:
@@ -530,286 +530,13 @@ template <class _Tp>
530530
_LIBCPP_CONSTEXPR const float_round_style numeric_limits<_Tp>::round_style;
531531

532532
template <class _Tp>
533-
class _LIBCPP_TEMPLATE_VIS numeric_limits<const _Tp> : private numeric_limits<_Tp> {
534-
typedef numeric_limits<_Tp> __base;
535-
typedef _Tp type;
536-
537-
public:
538-
static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
539-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __base::min(); }
540-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __base::max(); }
541-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return __base::lowest(); }
542-
543-
static _LIBCPP_CONSTEXPR const int digits = __base::digits;
544-
static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10;
545-
static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10;
546-
static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
547-
static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
548-
static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
549-
static _LIBCPP_CONSTEXPR const int radix = __base::radix;
550-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __base::epsilon(); }
551-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return __base::round_error(); }
533+
class _LIBCPP_TEMPLATE_VIS numeric_limits<const _Tp> : public numeric_limits<_Tp> {};
552534

553-
static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent;
554-
static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10;
555-
static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent;
556-
static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10;
557-
558-
static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
559-
static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
560-
static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
561-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
562-
static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
563-
static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
564-
_LIBCPP_SUPPRESS_DEPRECATED_POP
565-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return __base::infinity(); }
566-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return __base::quiet_NaN(); }
567-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return __base::signaling_NaN(); }
568-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return __base::denorm_min(); }
569-
570-
static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
571-
static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
572-
static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
573-
574-
static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
575-
static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
576-
static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
577-
};
578-
579-
template <class _Tp>
580-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_specialized;
581-
template <class _Tp>
582-
_LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits;
583-
template <class _Tp>
584-
_LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits10;
585-
template <class _Tp>
586-
_LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_digits10;
587-
template <class _Tp>
588-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_signed;
589-
template <class _Tp>
590-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_integer;
591-
template <class _Tp>
592-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_exact;
593-
template <class _Tp>
594-
_LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::radix;
595535
template <class _Tp>
596-
_LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent;
597-
template <class _Tp>
598-
_LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent10;
599-
template <class _Tp>
600-
_LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent;
601-
template <class _Tp>
602-
_LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent10;
603-
template <class _Tp>
604-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_infinity;
605-
template <class _Tp>
606-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_quiet_NaN;
607-
template <class _Tp>
608-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_signaling_NaN;
609-
template <class _Tp>
610-
_LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const _Tp>::has_denorm;
611-
template <class _Tp>
612-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_denorm_loss;
613-
template <class _Tp>
614-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_iec559;
615-
template <class _Tp>
616-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_bounded;
617-
template <class _Tp>
618-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_modulo;
619-
template <class _Tp>
620-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::traps;
621-
template <class _Tp>
622-
_LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::tinyness_before;
623-
template <class _Tp>
624-
_LIBCPP_CONSTEXPR const float_round_style numeric_limits<const _Tp>::round_style;
625-
626-
template <class _Tp>
627-
class _LIBCPP_TEMPLATE_VIS numeric_limits<volatile _Tp> : private numeric_limits<_Tp> {
628-
typedef numeric_limits<_Tp> __base;
629-
typedef _Tp type;
630-
631-
public:
632-
static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
633-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __base::min(); }
634-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __base::max(); }
635-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return __base::lowest(); }
636-
637-
static _LIBCPP_CONSTEXPR const int digits = __base::digits;
638-
static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10;
639-
static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10;
640-
static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
641-
static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
642-
static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
643-
static _LIBCPP_CONSTEXPR const int radix = __base::radix;
644-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __base::epsilon(); }
645-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return __base::round_error(); }
646-
647-
static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent;
648-
static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10;
649-
static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent;
650-
static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10;
651-
652-
static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
653-
static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
654-
static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
655-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
656-
static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
657-
static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
658-
_LIBCPP_SUPPRESS_DEPRECATED_POP
659-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return __base::infinity(); }
660-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return __base::quiet_NaN(); }
661-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return __base::signaling_NaN(); }
662-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return __base::denorm_min(); }
536+
class _LIBCPP_TEMPLATE_VIS numeric_limits<volatile _Tp> : public numeric_limits<_Tp> {};
663537

664-
static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
665-
static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
666-
static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
667-
668-
static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
669-
static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
670-
static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
671-
};
672-
673-
template <class _Tp>
674-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_specialized;
675-
template <class _Tp>
676-
_LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits;
677-
template <class _Tp>
678-
_LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits10;
679-
template <class _Tp>
680-
_LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_digits10;
681-
template <class _Tp>
682-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_signed;
683-
template <class _Tp>
684-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_integer;
685-
template <class _Tp>
686-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_exact;
687-
template <class _Tp>
688-
_LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::radix;
689-
template <class _Tp>
690-
_LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent;
691-
template <class _Tp>
692-
_LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent10;
693-
template <class _Tp>
694-
_LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent;
695-
template <class _Tp>
696-
_LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent10;
697-
template <class _Tp>
698-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_infinity;
699-
template <class _Tp>
700-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_quiet_NaN;
701-
template <class _Tp>
702-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_signaling_NaN;
703-
template <class _Tp>
704-
_LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<volatile _Tp>::has_denorm;
705-
template <class _Tp>
706-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_denorm_loss;
707-
template <class _Tp>
708-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_iec559;
709-
template <class _Tp>
710-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_bounded;
711-
template <class _Tp>
712-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_modulo;
713-
template <class _Tp>
714-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::traps;
715-
template <class _Tp>
716-
_LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::tinyness_before;
717-
template <class _Tp>
718-
_LIBCPP_CONSTEXPR const float_round_style numeric_limits<volatile _Tp>::round_style;
719-
720-
template <class _Tp>
721-
class _LIBCPP_TEMPLATE_VIS numeric_limits<const volatile _Tp> : private numeric_limits<_Tp> {
722-
typedef numeric_limits<_Tp> __base;
723-
typedef _Tp type;
724-
725-
public:
726-
static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
727-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __base::min(); }
728-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __base::max(); }
729-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return __base::lowest(); }
730-
731-
static _LIBCPP_CONSTEXPR const int digits = __base::digits;
732-
static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10;
733-
static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10;
734-
static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
735-
static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
736-
static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
737-
static _LIBCPP_CONSTEXPR const int radix = __base::radix;
738-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __base::epsilon(); }
739-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return __base::round_error(); }
740-
741-
static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent;
742-
static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10;
743-
static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent;
744-
static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10;
745-
746-
static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
747-
static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
748-
static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
749-
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
750-
static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
751-
static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
752-
_LIBCPP_SUPPRESS_DEPRECATED_POP
753-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return __base::infinity(); }
754-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return __base::quiet_NaN(); }
755-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return __base::signaling_NaN(); }
756-
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return __base::denorm_min(); }
757-
758-
static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
759-
static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
760-
static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
761-
762-
static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
763-
static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
764-
static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
765-
};
766-
767-
template <class _Tp>
768-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_specialized;
769-
template <class _Tp>
770-
_LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits;
771-
template <class _Tp>
772-
_LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits10;
773-
template <class _Tp>
774-
_LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_digits10;
775-
template <class _Tp>
776-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_signed;
777-
template <class _Tp>
778-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_integer;
779-
template <class _Tp>
780-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_exact;
781-
template <class _Tp>
782-
_LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::radix;
783-
template <class _Tp>
784-
_LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent;
785-
template <class _Tp>
786-
_LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent10;
787-
template <class _Tp>
788-
_LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent;
789-
template <class _Tp>
790-
_LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent10;
791-
template <class _Tp>
792-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_infinity;
793-
template <class _Tp>
794-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_quiet_NaN;
795-
template <class _Tp>
796-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_signaling_NaN;
797-
template <class _Tp>
798-
_LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const volatile _Tp>::has_denorm;
799-
template <class _Tp>
800-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_denorm_loss;
801-
template <class _Tp>
802-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_iec559;
803-
template <class _Tp>
804-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_bounded;
805-
template <class _Tp>
806-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_modulo;
807-
template <class _Tp>
808-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::traps;
809-
template <class _Tp>
810-
_LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::tinyness_before;
811538
template <class _Tp>
812-
_LIBCPP_CONSTEXPR const float_round_style numeric_limits<const volatile _Tp>::round_style;
539+
class _LIBCPP_TEMPLATE_VIS numeric_limits<const volatile _Tp> : public numeric_limits<_Tp> {};
813540

814541
_LIBCPP_END_NAMESPACE_STD
815542

0 commit comments

Comments
 (0)