Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
217 changes: 217 additions & 0 deletions src/jsoncons/json1.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ class basic_json : private json_base
static const basic_json<Char> an_array;
static const basic_json<Char> null;

typedef json_object<Char> object_type;
typedef json_array<Char> array_type;

typedef typename json_object<Char>::iterator object_iterator;
typedef typename json_object<Char>::const_iterator const_object_iterator;

Expand All @@ -113,6 +116,12 @@ class basic_json : private json_base
return val_.has_member(name);
}

template<typename T>
bool is() const
{
return val_.template is<T>();
}

bool is_null() const
{
return val_.is_null();
Expand Down Expand Up @@ -183,6 +192,12 @@ class basic_json : private json_base
return val_.as_string(format);
}

template<typename T>
T as() const
{
return val_.template as<T>();
}

Char as_char() const
{
return val_.as_char();
Expand Down Expand Up @@ -368,6 +383,12 @@ class basic_json : private json_base
val_.at(name_).resize_array(n,val);
}

template<typename T>
bool is() const
{
return val_.at(name_).template is<T>();
}

bool is_string() const
{
return val_.at(name_).is_string();
Expand Down Expand Up @@ -423,6 +444,12 @@ class basic_json : private json_base
return val_.at(name_).as_string(format);
}

template<typename T>
T as() const
{
return val_.at(name_).template as<T>();
}

Char as_char() const
{
return val_.at(name_).as_char();
Expand Down Expand Up @@ -777,6 +804,12 @@ class basic_json : private json_base

bool has_member(const std::basic_string<Char>& name) const;

template<typename T>
bool is() const
{
return is_type<Char,T>(*this);
}

bool is_string() const
{
return type_ == string_t;
Expand Down Expand Up @@ -832,6 +865,12 @@ class basic_json : private json_base

void resize_array(size_t n, const basic_json<Char>& val);

template<typename T>
T as() const
{
return as_value<Char,T>(*this);
}

bool as_bool() const;

double as_double() const;
Expand Down Expand Up @@ -957,6 +996,184 @@ class basic_json : private json_base
private:
basic_json(value_type t);

template<typename C, typename T>
class is_type
{
public:
is_type (const basic_json<C>& value)
{}

operator bool () const
{
return false;
}
};
template<typename C>
class is_type<C,std::basic_string<C>>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_string();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,bool>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_bool();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,double>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_double();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,int>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_longlong();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,unsigned int>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_ulonglong();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,long>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_longlong();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,unsigned long>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_ulonglong();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,long long>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_longlong();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,unsigned long long>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_ulonglong();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,object_type>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_object();
}

private:
const basic_json<C>& value_;
};
template<typename C>
class is_type<C,array_type>
{
public:
is_type (const basic_json<C>& value) : value_(value)
{}

operator bool () const
{
return value_.is_array();
}

private:
const basic_json<C>& value_;
};

template<typename C, typename T>
class as_value
{
Expand Down
15 changes: 15 additions & 0 deletions test_suite/src/json_accessor_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,51 +23,65 @@ BOOST_AUTO_TEST_CASE(test_is_type)
{
json obj;
BOOST_CHECK(obj.is_object());
BOOST_CHECK(obj.is<json::object_type>());
std::cout << "HERE!!!" << ", type=" << obj.type() << std::endl;

// tests for proxy is_type methods
obj["string"] = "val1";
std::cout << "type=" << obj.type() << std::endl;

BOOST_CHECK(obj.is_object());
BOOST_CHECK(obj.is<json::object_type>());

BOOST_CHECK(obj["string"].is_string());
BOOST_CHECK(obj["string"].is<std::string>());

obj["double"] = 10.7;
BOOST_CHECK(obj["double"].is_double());
BOOST_CHECK(obj["double"].is<double>());

obj["int"] = -10;
BOOST_CHECK(obj["int"].is_longlong());
BOOST_CHECK(obj["int"].is<long long>());

obj["uint"] = 10u;
BOOST_CHECK(obj["uint"].is_ulonglong());
BOOST_CHECK(obj["uint"].is<unsigned long long>());

obj["long"] = static_cast<long>(10);
BOOST_CHECK(obj["long"].is_longlong());
BOOST_CHECK(obj["long"].is<long long>());

obj["ulong"] = static_cast<unsigned long>(10);
BOOST_CHECK(obj["ulong"].is_ulonglong());
BOOST_CHECK(obj["ulong"].is<unsigned long long>());

obj["longlong"] = static_cast<long long>(10);
BOOST_CHECK(obj["longlong"].is_longlong());
BOOST_CHECK(obj["longlong"].is<long long>());

obj["ulonglong"] = static_cast<unsigned long long>(10);
BOOST_CHECK(obj["ulonglong"].is_ulonglong());
BOOST_CHECK(obj["ulonglong"].is<unsigned long long>());

obj["true"] = true;
BOOST_CHECK(obj["true"].is_bool());
BOOST_CHECK(obj["true"].is<bool>());

obj["false"] = false;
BOOST_CHECK(obj["false"].is_bool());
BOOST_CHECK(obj["false"].is<bool>());

obj["null1"] = json::null;
BOOST_CHECK(obj["null1"].is_null());

obj["object"] = json::an_object;
BOOST_CHECK(obj["object"].is_object());
BOOST_CHECK(obj["object"].is<json::object_type>());

obj["array"] = json::an_array;
BOOST_CHECK(obj["array"].is_array());
BOOST_CHECK(obj["array"].is<json::array_type>());

matrix<double> A;
obj.set_custom_data("custom",A);
Expand All @@ -77,6 +91,7 @@ BOOST_AUTO_TEST_CASE(test_is_type)

json str = obj["string"];
BOOST_CHECK(str.is_string());
BOOST_CHECK(str.is<std::string>());
}

BOOST_AUTO_TEST_CASE(test_as_vector_of_double)
Expand Down
Loading