Files
scylladb/json/formatter.cc
Amnon Heiman 38a22d9cd8 json: float and double support
This change how the json formatter handle float and adds double support.
float and double conversion will throw exceptions when try to convert
inf or nan.

It also contains tests for both float and double including inf, -inf and
nan for both float and double.

Signed-off-by: Amnon Heiman <amnon@cloudius-systems.com>
2015-06-03 10:01:00 +03:00

87 lines
2.1 KiB
C++

/*
* This file is open source software, licensed to you under the terms
* of the Apache License, Version 2.0 (the "License"). See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. You may not use this file except in compliance with the License.
*
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Copyright 2015 Cloudius Systems
*/
#include "formatter.hh"
#include "json_elements.hh"
using namespace std;
namespace json {
sstring formatter::to_json(const sstring& str) {
return to_json(str.c_str());
}
sstring formatter::to_json(const char* str) {
sstring res = "\"";
res += str;
res += "\"";
return res;
}
sstring formatter::to_json(int n) {
return to_string(n);
}
sstring formatter::to_json(long n) {
return to_string(n);
}
sstring formatter::to_json(float f) {
if (std::isinf(f)) {
throw out_of_range("Infinite float value is not supported");
} else if (std::isnan(f)) {
throw invalid_argument("Invalid float value");
}
return to_sstring(f);
}
sstring formatter::to_json(double d) {
if (std::isinf(d)) {
throw out_of_range("Infinite double value is not supported");
} else if (std::isnan(d)) {
throw invalid_argument("Invalid double value");
}
return to_sstring(d);
}
sstring formatter::to_json(bool b) {
return (b) ? "true" : "false";
}
sstring formatter::to_json(const date_time& d) {
char buff[50];
sstring res = "\"";
strftime(buff, 50, TIME_FORMAT, &d);
res += buff;
return res + "\"";
}
sstring formatter::to_json(const jsonable& obj) {
return obj.to_json();
}
sstring formatter::to_json(unsigned long l) {
return to_string(l);
}
}