8#ifndef INCLUDED_BSLALG_NUMERICFORMATTERUTIL
9#define INCLUDED_BSLALG_NUMERICFORMATTERUTIL
377#include <bslscm_version.h>
415 static char *toCharsImpl(
char *first,
431 char *toCharsImpl(
char *first,
433 unsigned long long int value,
448 template <
class TYPE>
449 static char *toCharsIntegral(
char *first,
461 static char *toCharsDecimal(
char *first,
464 static char *toCharsDecimal(
char *first,
475 static char *toCharsScientific(
char *first,
478 static char *toCharsScientific(
char *first,
489 static char *toCharsGeneral(
char *first,
492 static char *toCharsGeneral(
char *first,
503 static char *toCharsHex(
char *first,
506 static char *toCharsHex(
char *first,
518 static char *toCharsDecimalPrec(
char *first,
522 static char *toCharsDecimalPrec(
char *first,
535 static char *toCharsScientificPrec(
char *first,
540 static char *toCharsScientificPrec(
char *first,
554 static char *toCharsGeneralPrec(
char *first,
558 static char *toCharsGeneralPrec(
char *first,
571 static char *toCharsHexPrec(
char *first,
575 static char *toCharsHexPrec(
char *first,
594 enum { k_MAXLEN_ARG_DEFAULT = -256 };
607 template <
class FLT_TYPE,
int FORMAT>
618 template <
bool IS_SIGNED,
unsigned SIZEOF,
int BASE>
626 template <
class TYPE>
627 struct IsSupportedFloatingPoint;
634 template <
class TYPE>
635 struct IsSupportedIntegral;
665 template <
class TYPE,
int ARG = k_MAXLEN_ARG_DEFAULT>
666 struct ToCharsMaxLength;
688 char *toChars(
char *first,
693 char *toChars(
char *first,
698 char *toChars(
char *first,
703 char *toChars(
char *first,
705 signed short int value,
708 char *toChars(
char *first,
710 unsigned short int value,
713 char *toChars(
char *first,
718 char *toChars(
char *first,
723 char *toChars(
char *first,
725 signed long int value,
728 char *toChars(
char *first,
730 unsigned long int value,
733 char *toChars(
char *first,
735 signed long long int value,
738 char *toChars(
char *first,
740 unsigned long long int value,
756 char *toChars(
char *first,
760 char *toChars(
char *first,
781 char *toChars(
char *first,
786 char *toChars(
char *first,
804 char *toChars(
char *first,
810 char *toChars(
char *first,
823 template <class t_FLOATING>
830template <class t_FLOATING>
841 if (-1 == precision) {
842 precision = (e_HEX == format) ? 13 : 6;
846 case e_FIXED:
return 311 + precision;
847 case e_SCIENTIFIC:
return 8 + precision;
848 case e_HEX:
return 22 + precision;
849 case e_GENERAL:
return 8 + precision;
864 if (-1 == precision) {
869 case e_FIXED:
return 41 + precision;
870 case e_SCIENTIFIC:
return 7 + precision;
871 case e_HEX:
return 8 + precision;
872 case e_GENERAL:
return 7 + precision;
883template <
class FLT_TYPE,
int FORMAT>
884struct NumericFormatterUtil::FltMaxLen {
924struct NumericFormatterUtil::FltMaxLen<
927: NumericFormatterUtil::FltMaxLen<double, NumericFormatterUtil::e_SCIENTIFIC> {
964struct NumericFormatterUtil::FltMaxLen<
967: NumericFormatterUtil::FltMaxLen<float, NumericFormatterUtil::e_SCIENTIFIC> {
974#define BSLALG_NUMERICFORMATTERUTIL_INTMAXLEN_ONE(issigned, bytes, \
975 val02, val03, val04, val05, val06, val07, val08, val09, val10, \
976 val11, val12, val13, val14, val15, val16, val17, val18, val19, val20, \
977 val21, val22, val23, val24, val25, val26, val27, val28, val29, val30, \
978 val31, val32, val33, val34, val35, val36) \
979 template <int BASE> \
980 struct NumericFormatterUtil::IntMaxLen<issigned, bytes, BASE> { \
982 k_VALUE = (BASE == 2) ? val02 \
983 : (BASE == 3) ? val03 \
984 : (BASE == 4) ? val04 \
985 : (BASE == 5) ? val05 \
986 : (BASE == 6) ? val06 \
987 : (BASE == 7) ? val07 \
988 : (BASE == 8) ? val08 \
989 : (BASE == 9) ? val09 \
990 : (BASE == 10) ? val10 \
991 : (BASE == 11) ? val11 \
992 : (BASE == 12) ? val12 \
993 : (BASE == 13) ? val13 \
994 : (BASE == 14) ? val14 \
995 : (BASE == 15) ? val15 \
996 : (BASE == 16) ? val16 \
997 : (BASE == 17) ? val17 \
998 : (BASE == 18) ? val18 \
999 : (BASE == 19) ? val19 \
1000 : (BASE == 20) ? val20 \
1001 : (BASE == 21) ? val21 \
1002 : (BASE == 22) ? val22 \
1003 : (BASE == 23) ? val23 \
1004 : (BASE == 24) ? val24 \
1005 : (BASE == 25) ? val25 \
1006 : (BASE == 26) ? val26 \
1007 : (BASE == 27) ? val27 \
1008 : (BASE == 28) ? val28 \
1009 : (BASE == 29) ? val29 \
1010 : (BASE == 30) ? val30 \
1011 : (BASE == 31) ? val31 \
1012 : (BASE == 32) ? val32 \
1013 : (BASE == 33) ? val33 \
1014 : (BASE == 34) ? val34 \
1015 : (BASE == 35) ? val35 \
1016 : (BASE == 36) ? val36 \
1320#undef BSLALG_NUMERICFORMATTERUTIL_INTMAXLEN_ONE
1326template <
class TYPE>
1327struct NumericFormatterUtil::IsSupportedFloatingPoint {
1345template <
class TYPE>
1346struct NumericFormatterUtil::IsSupportedIntegral {
1374template <
class TYPE,
int ARG>
1381 typedef const bool Cbool;
1386 static Cbool k_INTEGRAL_TYPE = IsSupportedIntegral<TYPE>::k_SUPPORTED;
1387 static Cbool k_FLOAT_TYPE = IsSupportedFloatingPoint<TYPE>::k_SUPPORTED;
1389 static Cbool k_UNSUPPORTED_INPUT_TYPE = !k_INTEGRAL_TYPE && !k_FLOAT_TYPE;
1393 static Cbool k_ARG_NOT_BASE = (ARG < 2 || ARG > 36);
1394 static Cbool k_ARG_NOT_FORMAT = (ARG != e_FIXED && ARG != e_SCIENTIFIC &&
1395 ARG != e_GENERAL && ARG != e_HEX);
1397 static Cbool k_ARGUMENT_VALUE_IS_WRONG = !(
1399 (ARG == k_MAXLEN_ARG_DEFAULT) ||
1402 (k_INTEGRAL_TYPE && !k_ARG_NOT_BASE) ||
1405 (k_FLOAT_TYPE && !k_ARG_NOT_FORMAT) ||
1408 (k_UNSUPPORTED_INPUT_TYPE && !(k_ARG_NOT_BASE && k_ARG_NOT_FORMAT)));
1421 k_VALUE = k_INTEGRAL_TYPE
1422 ? IntMaxLen<std::numeric_limits<TYPE>::is_signed,
1423 static_cast<unsigned>(
sizeof(TYPE)),
1426 ? FltMaxLen<TYPE, ARG>::k_VALUE
1440template <
class TYPE>
1442char *NumericFormatterUtil::toCharsIntegral(
char *first,
1452 BSLMF_ASSERT(
sizeof(TYPE) <=
sizeof(
unsigned long long int));
1455 unsigned long long int,
1456 unsigned>::type VirtualUnsignedType;
1458 if (first == last) {
1469 VirtualUnsignedType uValue = value;
1472 uValue = ~uValue + 1;
1477 return toCharsImpl(first, last, uValue, base);
1482char *NumericFormatterUtil::toChars(
char *first,
1487 return toCharsIntegral(first, last, value, base);
1491char *NumericFormatterUtil::toChars(
char *first,
1496 return toCharsIntegral(first, last, value, base);
1500char *NumericFormatterUtil::toChars(
char *first,
1502 unsigned char value,
1505 return toCharsIntegral(first, last, value, base);
1510NumericFormatterUtil::toChars(
char *first,
1512 signed short int value,
1515 return toCharsIntegral(first, last, value, base);
1519char *NumericFormatterUtil::toChars(
char *first,
1521 unsigned short int value,
1525 return toCharsIntegral(first, last, value, base);
1529char *NumericFormatterUtil::toChars(
char *first,
1534 return toCharsIntegral(first, last, value, base);
1538char *NumericFormatterUtil::toChars(
char *first,
1543 return toCharsIntegral(first, last, value, base);
1547char *NumericFormatterUtil::toChars(
char *first,
1549 signed long int value,
1553 return toCharsIntegral(first, last, value, base);
1557char *NumericFormatterUtil::toChars(
char *first,
1559 unsigned long int value,
1563 return toCharsIntegral(first, last, value, base);
1567char *NumericFormatterUtil::toChars(
char *first,
1569 signed long long int value,
1573 return toCharsIntegral(first, last, value, base);
1577char *NumericFormatterUtil::toChars(
char *first,
1579 unsigned long long int value,
1583 return toCharsIntegral(first, last, value, base);
1587char *NumericFormatterUtil::toChars(
char *first,
1593 case e_FIXED:
return toCharsDecimal(first, last, value);
1594 case e_SCIENTIFIC:
return toCharsScientific(first, last, value);
1595 case e_GENERAL:
return toCharsGeneral(first, last, value);
1596 case e_HEX:
return toCharsHex(first, last, value);
1604char *NumericFormatterUtil::toChars(
char *first,
1610 case e_FIXED:
return toCharsDecimal(first, last, value);
1611 case e_SCIENTIFIC:
return toCharsScientific(first, last, value);
1612 case e_GENERAL:
return toCharsGeneral(first, last, value);
1613 case e_HEX:
return toCharsHex(first, last, value);
1621char *NumericFormatterUtil::toChars(
char *first,
1629 return toCharsDecimalPrec(first, last, value, precision);
1632 return toCharsScientificPrec(first, last, value, precision);
1635 return toCharsGeneralPrec(first, last, value, precision);
1638 return toCharsHexPrec(first, last, value, precision);
1647char *NumericFormatterUtil::toChars(
char *first,
1655 return toCharsDecimalPrec(first, last, value, precision);
1658 return toCharsScientificPrec(first, last, value, precision);
1661 return toCharsGeneralPrec(first, last, value, precision);
1664 return toCharsHexPrec(first, last, value, precision);
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_ASSERT_UNREACHABLE(X)
Definition bsls_assert.h:1996
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_CONSTEXPR_CPP14
Definition bsls_keyword.h:631
#define BSLS_KEYWORD_DELETED
Definition bsls_keyword.h:651
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
Definition bdlc_flathashmap.h:2218
Definition bslmf_conditional.h:123
Definition bslmf_isintegral.h:140
Definition bslmf_issame.h:146
remove_const< typenameremove_volatile< t_TYPE >::type >::type type
Definition bslmf_removecv.h:128