Commit 5d8b4032 authored by Kazunori Fujiwara's avatar Kazunori Fujiwara

[3015] Type of IntElement is changed from long int to int64_t.

       Element::create accepts char, short, int, long, long long, int32_t and int64_t.
       IntElement->intValue() returns int64_t.
       IntElement->getValue() and IntElement->setValue() accept int64_t only.
parent 2a26b3fe
...@@ -60,7 +60,7 @@ Element::toWire(std::ostream& ss) const { ...@@ -60,7 +60,7 @@ Element::toWire(std::ostream& ss) const {
} }
bool bool
Element::getValue(long int&) const { Element::getValue(int64_t&) const {
return (false); return (false);
} }
...@@ -90,7 +90,7 @@ Element::getValue(std::map<std::string, ConstElementPtr>&) const { ...@@ -90,7 +90,7 @@ Element::getValue(std::map<std::string, ConstElementPtr>&) const {
} }
bool bool
Element::setValue(const long int) { Element::setValue(const int64_t) {
return (false); return (false);
} }
...@@ -208,8 +208,8 @@ Element::create() { ...@@ -208,8 +208,8 @@ Element::create() {
} }
ElementPtr ElementPtr
Element::create(const long int i) { Element::create(const long long int i) {
return (ElementPtr(new IntElement(i))); return (ElementPtr(new IntElement(static_cast<int64_t>(i))));
} }
ElementPtr ElementPtr
...@@ -391,9 +391,15 @@ numberFromStringstream(std::istream& in, int& pos) { ...@@ -391,9 +391,15 @@ numberFromStringstream(std::istream& in, int& pos) {
// Should we change from IntElement and DoubleElement to NumberElement // Should we change from IntElement and DoubleElement to NumberElement
// that can also hold an e value? (and have specific getters if the // that can also hold an e value? (and have specific getters if the
// value is larger than an int can handle) // value is larger than an int can handle)
//
// Type of IntElement is changed from long int to int64_t.
// However, strtoint64_t function does not exist.
// It is assumed that "long long" and int64_t are the same sizes.
// strtoll is used to convert string to integer.
//
ElementPtr ElementPtr
fromStringstreamNumber(std::istream& in, int& pos) { fromStringstreamNumber(std::istream& in, int& pos) {
long int i; long long int i;
double d = 0.0; double d = 0.0;
bool is_double = false; bool is_double = false;
char* endptr; char* endptr;
...@@ -401,7 +407,7 @@ fromStringstreamNumber(std::istream& in, int& pos) { ...@@ -401,7 +407,7 @@ fromStringstreamNumber(std::istream& in, int& pos) {
std::string number = numberFromStringstream(in, pos); std::string number = numberFromStringstream(in, pos);
errno = 0; errno = 0;
i = strtol(number.c_str(), &endptr, 10); i = strtoll(number.c_str(), &endptr, 10);
if (*endptr != '\0') { if (*endptr != '\0') {
const char* ptr; const char* ptr;
errno = 0; errno = 0;
...@@ -415,7 +421,7 @@ fromStringstreamNumber(std::istream& in, int& pos) { ...@@ -415,7 +421,7 @@ fromStringstreamNumber(std::istream& in, int& pos) {
} }
} }
} else { } else {
if ((i == LONG_MAX || i == LONG_MIN) && errno != 0) { if ((i == LLONG_MAX || i == LLONG_MIN) && errno != 0) {
isc_throw(JSONError, std::string("Number overflow: ") + number); isc_throw(JSONError, std::string("Number overflow: ") + number);
} }
} }
......
...@@ -124,7 +124,7 @@ public: ...@@ -124,7 +124,7 @@ public:
/// If you want an exception-safe getter method, use /// If you want an exception-safe getter method, use
/// getValue() below /// getValue() below
//@{ //@{
virtual long int intValue() const virtual int64_t intValue() const
{ isc_throw(TypeError, "intValue() called on non-integer Element"); }; { isc_throw(TypeError, "intValue() called on non-integer Element"); };
virtual double doubleValue() const virtual double doubleValue() const
{ isc_throw(TypeError, "doubleValue() called on non-double Element"); }; { isc_throw(TypeError, "doubleValue() called on non-double Element"); };
...@@ -151,7 +151,7 @@ public: ...@@ -151,7 +151,7 @@ public:
/// data to the given reference and returning true /// data to the given reference and returning true
/// ///
//@{ //@{
virtual bool getValue(long int& t) const; virtual bool getValue(int64_t& t) const;
virtual bool getValue(double& t) const; virtual bool getValue(double& t) const;
virtual bool getValue(bool& t) const; virtual bool getValue(bool& t) const;
virtual bool getValue(std::string& t) const; virtual bool getValue(std::string& t) const;
...@@ -167,7 +167,7 @@ public: ...@@ -167,7 +167,7 @@ public:
/// is of the correct type /// is of the correct type
/// ///
//@{ //@{
virtual bool setValue(const long int v); virtual bool setValue(const int64_t v);
virtual bool setValue(const double v); virtual bool setValue(const double v);
virtual bool setValue(const bool t); virtual bool setValue(const bool t);
virtual bool setValue(const std::string& v); virtual bool setValue(const std::string& v);
...@@ -273,8 +273,9 @@ public: ...@@ -273,8 +273,9 @@ public:
/// represents an empty value, and is created with Element::create()) /// represents an empty value, and is created with Element::create())
//@{ //@{
static ElementPtr create(); static ElementPtr create();
static ElementPtr create(const long int i); static ElementPtr create(const long long int i);
static ElementPtr create(const int i) { return (create(static_cast<long int>(i))); }; static ElementPtr create(const int i) { return (create(static_cast<long long int>(i))); };
static ElementPtr create(const long int i) { return (create(static_cast<long long int>(i))); };
static ElementPtr create(const double d); static ElementPtr create(const double d);
static ElementPtr create(const bool b); static ElementPtr create(const bool b);
static ElementPtr create(const std::string& s); static ElementPtr create(const std::string& s);
...@@ -371,15 +372,16 @@ public: ...@@ -371,15 +372,16 @@ public:
}; };
class IntElement : public Element { class IntElement : public Element {
long int i; int64_t i;
private:
public: public:
IntElement(long int v) : Element(integer), i(v) { } IntElement(int64_t v) : Element(integer), i(v) { }
long int intValue() const { return (i); } int64_t intValue() const { return (i); }
using Element::getValue; using Element::getValue;
bool getValue(long int& t) const { t = i; return (true); } bool getValue(int64_t& t) const { t = i; return (true); }
using Element::setValue; using Element::setValue;
bool setValue(const long int v) { i = v; return (true); } bool setValue(int64_t v) { i = v; return (true); }
void toJSON(std::ostream& ss) const; void toJSON(std::ostream& ss) const;
bool equals(const Element& other) const; bool equals(const Element& other) const;
}; };
......
...@@ -194,7 +194,10 @@ template <typename T> ...@@ -194,7 +194,10 @@ template <typename T>
void void
testGetValueInt() { testGetValueInt() {
T el; T el;
long int i; int64_t i;
int32_t i32;
long l;
long long ll;
double d; double d;
bool b; bool b;
std::string s; std::string s;
...@@ -215,13 +218,36 @@ testGetValueInt() { ...@@ -215,13 +218,36 @@ testGetValueInt() {
EXPECT_FALSE(el->getValue(v)); EXPECT_FALSE(el->getValue(v));
EXPECT_FALSE(el->getValue(m)); EXPECT_FALSE(el->getValue(m));
EXPECT_EQ(1, i); EXPECT_EQ(1, i);
el = Element::create(9223372036854775807L);
EXPECT_NO_THROW(el->intValue());
EXPECT_TRUE(el->getValue(i));
EXPECT_EQ(9223372036854775807, i);
ll = 9223372036854775807L;
el = Element::create(ll);
EXPECT_NO_THROW(el->intValue());
EXPECT_TRUE(el->getValue(i));
EXPECT_EQ(ll, i);
i32 = 2147483647;
el = Element::create(i32);
EXPECT_NO_THROW(el->intValue());
EXPECT_TRUE(el->getValue(i));
EXPECT_EQ(i32, i);
l = 2147483647;
el = Element::create(l);
EXPECT_NO_THROW(el->intValue());
EXPECT_TRUE(el->getValue(i));
EXPECT_EQ(l, i);
} }
template <typename T> template <typename T>
void void
testGetValueDouble() { testGetValueDouble() {
T el; T el;
long int i; int64_t i;
double d; double d;
bool b; bool b;
std::string s; std::string s;
...@@ -248,7 +274,7 @@ template <typename T> ...@@ -248,7 +274,7 @@ template <typename T>
void void
testGetValueBool() { testGetValueBool() {
T el; T el;
long int i; int64_t i;
double d; double d;
bool b; bool b;
std::string s; std::string s;
...@@ -275,7 +301,7 @@ template <typename T> ...@@ -275,7 +301,7 @@ template <typename T>
void void
testGetValueString() { testGetValueString() {
T el; T el;
long int i; int64_t i;
double d; double d;
bool b; bool b;
std::string s; std::string s;
...@@ -302,7 +328,7 @@ template <typename T> ...@@ -302,7 +328,7 @@ template <typename T>
void void
testGetValueList() { testGetValueList() {
T el; T el;
long int i; int64_t i;
double d; double d;
bool b; bool b;
std::string s; std::string s;
...@@ -329,7 +355,7 @@ template <typename T> ...@@ -329,7 +355,7 @@ template <typename T>
void void
testGetValueMap() { testGetValueMap() {
T el; T el;
long int i; int64_t i;
double d; double d;
bool b; bool b;
std::string s; std::string s;
...@@ -357,7 +383,7 @@ TEST(Element, create_and_value_throws) { ...@@ -357,7 +383,7 @@ TEST(Element, create_and_value_throws) {
// incorrect type is requested // incorrect type is requested
ElementPtr el; ElementPtr el;
ConstElementPtr cel; ConstElementPtr cel;
long int i = 0; int64_t i = 0;
double d = 0.0; double d = 0.0;
bool b = false; bool b = false;
std::string s("asdf"); std::string s("asdf");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment