Add nullifyNanAndInf parameter to FBCxxUtils

Summary:
There was an issue with syncing our internal files to github. A change was made in the utils that wasn't synced out, despite the sonar code using the new API.
This brings the util update to github, while I fix the syncing issue. After that there will be a single source of truth so no more sync issues like this can occur.

Reviewed By: priteshrnandgaonkar

Differential Revision: D8541128

fbshipit-source-id: d8509b65035569c4ee9707e5d7eab99fa325da88
This commit is contained in:
John Knox
2018-06-20 08:36:41 -07:00
committed by Facebook Github Bot
parent 54fa6aa8f2
commit 94f03f182b
2 changed files with 24 additions and 10 deletions

View File

@@ -14,7 +14,7 @@
namespace facebook { namespace facebook {
namespace cxxutils { namespace cxxutils {
folly::dynamic convertIdToFollyDynamic(id json); folly::dynamic convertIdToFollyDynamic(id json, bool nullifyNanAndInf = false);
id convertFollyDynamicToId(const folly::dynamic &dyn); id convertFollyDynamicToId(const folly::dynamic &dyn);
} } } }

View File

@@ -45,7 +45,7 @@ id convertFollyDynamicToId(const folly::dynamic &dyn) {
} }
} }
folly::dynamic convertIdToFollyDynamic(id json) folly::dynamic convertIdToFollyDynamic(id json, bool nullifyNanAndInf)
{ {
if (json == nil || json == (id)kCFNull) { if (json == nil || json == (id)kCFNull) {
return nullptr; return nullptr;
@@ -63,7 +63,11 @@ folly::dynamic convertIdToFollyDynamic(id json)
if ([json isKindOfClass:[@YES class]]) { if ([json isKindOfClass:[@YES class]]) {
return (bool) [json boolValue]; return (bool) [json boolValue];
} else { } else {
return [json longLongValue]; const auto value = [json longLongValue];
if (nullifyNanAndInf && (isnan(value) || isinf(value))) {
return nullptr;
}
return value;
} }
case _C_UCHR: case _C_UCHR:
case _C_SHT: case _C_SHT:
@@ -73,12 +77,22 @@ folly::dynamic convertIdToFollyDynamic(id json)
case _C_LNG: case _C_LNG:
case _C_ULNG: case _C_ULNG:
case _C_LNG_LNG: case _C_LNG_LNG:
case _C_ULNG_LNG: case _C_ULNG_LNG: {
return [json longLongValue]; const auto value = [json longLongValue];
if (nullifyNanAndInf && (isnan(value) || isinf(value))) {
return nullptr;
}
return value;
}
case _C_FLT: case _C_FLT:
case _C_DBL: case _C_DBL: {
return [json doubleValue]; const auto value = [json doubleValue];
if (nullifyNanAndInf && (isnan(value) || isinf(value))) {
return nullptr;
}
return value;
}
// default: // default:
// fall through // fall through
@@ -90,15 +104,15 @@ folly::dynamic convertIdToFollyDynamic(id json)
} else if ([json isKindOfClass:[NSArray class]]) { } else if ([json isKindOfClass:[NSArray class]]) {
folly::dynamic array = folly::dynamic::array; folly::dynamic array = folly::dynamic::array;
for (id element in json) { for (id element in json) {
array.push_back(convertIdToFollyDynamic(element)); array.push_back(convertIdToFollyDynamic(element, nullifyNanAndInf));
} }
return array; return array;
} else if ([json isKindOfClass:[NSDictionary class]]) { } else if ([json isKindOfClass:[NSDictionary class]]) {
__block folly::dynamic object = folly::dynamic::object(); __block folly::dynamic object = folly::dynamic::object();
[json enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, __unused BOOL *stop) { [json enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, __unused BOOL *stop) {
object.insert(convertIdToFollyDynamic(key), object.insert(convertIdToFollyDynamic(key, nullifyNanAndInf),
convertIdToFollyDynamic(value)); convertIdToFollyDynamic(value, nullifyNanAndInf));
}]; }];
return object; return object;