return success;
}
-signed char Scalar::SChar(char fail_value) const {
+template <typename T> T Scalar::GetAsSigned(T fail_value) const {
switch (m_type) {
case e_void:
break;
case e_uint256:
case e_sint512:
case e_uint512:
- return static_cast<schar_t>(
- (m_integer.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue());
+ return m_integer.sextOrTrunc(sizeof(T) * 8).getSExtValue();
+
case e_float:
- return static_cast<schar_t>(m_float.convertToFloat());
+ return static_cast<T>(m_float.convertToFloat());
case e_double:
- return static_cast<schar_t>(m_float.convertToDouble());
+ return static_cast<T>(m_float.convertToDouble());
case e_long_double:
llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<schar_t>(
+ return static_cast<T>(
(ldbl_val.sextOrTrunc(sizeof(schar_t) * 8)).getSExtValue());
}
return fail_value;
}
-unsigned char Scalar::UChar(unsigned char fail_value) const {
+template <typename T> T Scalar::GetAsUnsigned(T fail_value) const {
switch (m_type) {
case e_void:
break;
case e_uint256:
case e_sint512:
case e_uint512:
- return static_cast<uchar_t>(
- (m_integer.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue());
+ return m_integer.zextOrTrunc(sizeof(T) * 8).getZExtValue();
+
case e_float:
- return static_cast<uchar_t>(m_float.convertToFloat());
+ return static_cast<T>(m_float.convertToFloat());
case e_double:
- return static_cast<uchar_t>(m_float.convertToDouble());
+ return static_cast<T>(m_float.convertToDouble());
case e_long_double:
llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<uchar_t>(
- (ldbl_val.zextOrTrunc(sizeof(uchar_t) * 8)).getZExtValue());
+ return static_cast<T>((ldbl_val.zextOrTrunc(sizeof(T) * 8)).getZExtValue());
}
return fail_value;
}
+signed char Scalar::SChar(signed char fail_value) const {
+ return GetAsSigned<signed char>(fail_value);
+}
+
+unsigned char Scalar::UChar(unsigned char fail_value) const {
+ return GetAsUnsigned<unsigned char>(fail_value);
+}
+
short Scalar::SShort(short fail_value) const {
- switch (m_type) {
- case e_void:
- break;
- case e_sint:
- case e_uint:
- case e_slong:
- case e_ulong:
- case e_slonglong:
- case e_ulonglong:
- case e_sint128:
- case e_uint128:
- case e_sint256:
- case e_uint256:
- case e_sint512:
- case e_uint512:
- return static_cast<sshort_t>(
- (m_integer.sextOrTrunc(sizeof(sshort_t) * 8)).getSExtValue());
- case e_float:
- return static_cast<sshort_t>(m_float.convertToFloat());
- case e_double:
- return static_cast<sshort_t>(m_float.convertToDouble());
- case e_long_double:
- llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<sshort_t>(
- (ldbl_val.sextOrTrunc(sizeof(sshort_t) * 8)).getSExtValue());
- }
- return fail_value;
+ return GetAsSigned<short>(fail_value);
}
unsigned short Scalar::UShort(unsigned short fail_value) const {
- switch (m_type) {
- case e_void:
- break;
- case e_sint:
- case e_uint:
- case e_slong:
- case e_ulong:
- case e_slonglong:
- case e_ulonglong:
- case e_sint128:
- case e_uint128:
- case e_sint256:
- case e_uint256:
- case e_sint512:
- case e_uint512:
- return static_cast<ushort_t>(
- (m_integer.zextOrTrunc(sizeof(ushort_t) * 8)).getZExtValue());
- case e_float:
- return static_cast<ushort_t>(m_float.convertToFloat());
- case e_double:
- return static_cast<ushort_t>(m_float.convertToDouble());
- case e_long_double:
- llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<ushort_t>(
- (ldbl_val.zextOrTrunc(sizeof(ushort_t) * 8)).getZExtValue());
- }
- return fail_value;
+ return GetAsUnsigned<unsigned short>(fail_value);
}
-int Scalar::SInt(int fail_value) const {
- switch (m_type) {
- case e_void:
- break;
- case e_sint:
- case e_uint:
- case e_slong:
- case e_ulong:
- case e_slonglong:
- case e_ulonglong:
- case e_sint128:
- case e_uint128:
- case e_sint256:
- case e_uint256:
- case e_sint512:
- case e_uint512:
- return static_cast<sint_t>(
- (m_integer.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue());
- case e_float:
- return static_cast<sint_t>(m_float.convertToFloat());
- case e_double:
- return static_cast<sint_t>(m_float.convertToDouble());
- case e_long_double:
- llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<sint_t>(
- (ldbl_val.sextOrTrunc(sizeof(sint_t) * 8)).getSExtValue());
- }
- return fail_value;
-}
+int Scalar::SInt(int fail_value) const { return GetAsSigned<int>(fail_value); }
unsigned int Scalar::UInt(unsigned int fail_value) const {
- switch (m_type) {
- case e_void:
- break;
- case e_sint:
- case e_uint:
- case e_slong:
- case e_ulong:
- case e_slonglong:
- case e_ulonglong:
- case e_sint128:
- case e_uint128:
- case e_sint256:
- case e_uint256:
- case e_sint512:
- case e_uint512:
- return static_cast<uint_t>(
- (m_integer.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue());
- case e_float:
- return static_cast<uint_t>(m_float.convertToFloat());
- case e_double:
- return static_cast<uint_t>(m_float.convertToDouble());
- case e_long_double:
- llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<uint_t>(
- (ldbl_val.zextOrTrunc(sizeof(uint_t) * 8)).getZExtValue());
- }
- return fail_value;
+ return GetAsUnsigned<unsigned int>(fail_value);
}
-long Scalar::SLong(long fail_value) const {
- switch (m_type) {
- case e_void:
- break;
- case e_sint:
- case e_uint:
- case e_slong:
- case e_ulong:
- case e_slonglong:
- case e_ulonglong:
- case e_sint128:
- case e_uint128:
- case e_sint256:
- case e_uint256:
- case e_sint512:
- case e_uint512:
- return static_cast<slong_t>(
- (m_integer.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue());
- case e_float:
- return static_cast<slong_t>(m_float.convertToFloat());
- case e_double:
- return static_cast<slong_t>(m_float.convertToDouble());
- case e_long_double:
- llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<slong_t>(
- (ldbl_val.sextOrTrunc(sizeof(slong_t) * 8)).getSExtValue());
- }
- return fail_value;
-}
+long Scalar::SLong(long fail_value) const { return GetAsSigned<long>(fail_value); }
unsigned long Scalar::ULong(unsigned long fail_value) const {
- switch (m_type) {
- case e_void:
- break;
- case e_sint:
- case e_uint:
- case e_slong:
- case e_ulong:
- case e_slonglong:
- case e_ulonglong:
- case e_sint128:
- case e_uint128:
- case e_sint256:
- case e_uint256:
- case e_sint512:
- case e_uint512:
- return static_cast<ulong_t>(
- (m_integer.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue());
- case e_float:
- return static_cast<ulong_t>(m_float.convertToFloat());
- case e_double:
- return static_cast<ulong_t>(m_float.convertToDouble());
- case e_long_double:
- llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<ulong_t>(
- (ldbl_val.zextOrTrunc(sizeof(ulong_t) * 8)).getZExtValue());
- }
- return fail_value;
+ return GetAsUnsigned<unsigned long>(fail_value);
}
long long Scalar::SLongLong(long long fail_value) const {
- switch (m_type) {
- case e_void:
- break;
- case e_sint:
- case e_uint:
- case e_slong:
- case e_ulong:
- case e_slonglong:
- case e_ulonglong:
- case e_sint128:
- case e_uint128:
- case e_sint256:
- case e_uint256:
- case e_sint512:
- case e_uint512:
- return static_cast<slonglong_t>(
- (m_integer.sextOrTrunc(sizeof(slonglong_t) * 8)).getSExtValue());
- case e_float:
- return static_cast<slonglong_t>(m_float.convertToFloat());
- case e_double:
- return static_cast<slonglong_t>(m_float.convertToDouble());
- case e_long_double:
- llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<slonglong_t>(
- (ldbl_val.sextOrTrunc(sizeof(slonglong_t) * 8)).getSExtValue());
- }
- return fail_value;
+ return GetAsSigned<long long>(fail_value);
}
unsigned long long Scalar::ULongLong(unsigned long long fail_value) const {
- switch (m_type) {
- case e_void:
- break;
- case e_sint:
- case e_uint:
- case e_slong:
- case e_ulong:
- case e_slonglong:
- case e_ulonglong:
- case e_sint128:
- case e_uint128:
- case e_sint256:
- case e_uint256:
- case e_sint512:
- case e_uint512:
- return static_cast<ulonglong_t>(
- (m_integer.zextOrTrunc(sizeof(ulonglong_t) * 8)).getZExtValue());
- case e_float:
- return static_cast<ulonglong_t>(m_float.convertToFloat());
- case e_double: {
- double d_val = m_float.convertToDouble();
- llvm::APInt rounded_double =
- llvm::APIntOps::RoundDoubleToAPInt(d_val, sizeof(ulonglong_t) * 8);
- return static_cast<ulonglong_t>(
- (rounded_double.zextOrTrunc(sizeof(ulonglong_t) * 8)).getZExtValue());
- }
- case e_long_double:
- llvm::APInt ldbl_val = m_float.bitcastToAPInt();
- return static_cast<ulonglong_t>(
- (ldbl_val.zextOrTrunc(sizeof(ulonglong_t) * 8)).getZExtValue());
- }
- return fail_value;
+ return GetAsUnsigned<unsigned long long>(fail_value);
}
-llvm::APInt Scalar::SInt128(llvm::APInt &fail_value) const {
+llvm::APInt Scalar::SInt128(const llvm::APInt &fail_value) const {
switch (m_type) {
case e_void:
break;