Skip to content

Commit f7be70e

Browse files
committed
Merge pull request #3 from MarkaPola/feature/types-management
add template methods is<> and as<> to facilitate json handling as part o...
2 parents 18843b2 + b6a9633 commit f7be70e

File tree

5 files changed

+279
-0
lines changed

5 files changed

+279
-0
lines changed

src/jsoncons/json1.hpp

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ class basic_json : private json_base
9292
static const basic_json<Char> an_array;
9393
static const basic_json<Char> null;
9494

95+
typedef json_object<Char> object_type;
96+
typedef json_array<Char> array_type;
97+
9598
typedef typename json_object<Char>::iterator object_iterator;
9699
typedef typename json_object<Char>::const_iterator const_object_iterator;
97100

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

119+
template<typename T>
120+
bool is() const
121+
{
122+
return val_.template is<T>();
123+
}
124+
116125
bool is_null() const
117126
{
118127
return val_.is_null();
@@ -183,6 +192,12 @@ class basic_json : private json_base
183192
return val_.as_string(format);
184193
}
185194

195+
template<typename T>
196+
T as() const
197+
{
198+
return val_.template as<T>();
199+
}
200+
186201
Char as_char() const
187202
{
188203
return val_.as_char();
@@ -368,6 +383,12 @@ class basic_json : private json_base
368383
val_.at(name_).resize_array(n,val);
369384
}
370385

386+
template<typename T>
387+
bool is() const
388+
{
389+
return val_.at(name_).template is<T>();
390+
}
391+
371392
bool is_string() const
372393
{
373394
return val_.at(name_).is_string();
@@ -423,6 +444,12 @@ class basic_json : private json_base
423444
return val_.at(name_).as_string(format);
424445
}
425446

447+
template<typename T>
448+
T as() const
449+
{
450+
return val_.at(name_).template as<T>();
451+
}
452+
426453
Char as_char() const
427454
{
428455
return val_.at(name_).as_char();
@@ -777,6 +804,12 @@ class basic_json : private json_base
777804

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

807+
template<typename T>
808+
bool is() const
809+
{
810+
return is_type<Char,T>(*this);
811+
}
812+
780813
bool is_string() const
781814
{
782815
return type_ == string_t;
@@ -832,6 +865,12 @@ class basic_json : private json_base
832865

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

868+
template<typename T>
869+
T as() const
870+
{
871+
return as_value<Char,T>(*this);
872+
}
873+
835874
bool as_bool() const;
836875

837876
double as_double() const;
@@ -957,6 +996,184 @@ class basic_json : private json_base
957996
private:
958997
basic_json(value_type t);
959998

999+
template<typename C, typename T>
1000+
class is_type
1001+
{
1002+
public:
1003+
is_type (const basic_json<C>& value)
1004+
{}
1005+
1006+
operator bool () const
1007+
{
1008+
return false;
1009+
}
1010+
};
1011+
template<typename C>
1012+
class is_type<C,std::basic_string<C>>
1013+
{
1014+
public:
1015+
is_type (const basic_json<C>& value) : value_(value)
1016+
{}
1017+
1018+
operator bool () const
1019+
{
1020+
return value_.is_string();
1021+
}
1022+
1023+
private:
1024+
const basic_json<C>& value_;
1025+
};
1026+
template<typename C>
1027+
class is_type<C,bool>
1028+
{
1029+
public:
1030+
is_type (const basic_json<C>& value) : value_(value)
1031+
{}
1032+
1033+
operator bool () const
1034+
{
1035+
return value_.is_bool();
1036+
}
1037+
1038+
private:
1039+
const basic_json<C>& value_;
1040+
};
1041+
template<typename C>
1042+
class is_type<C,double>
1043+
{
1044+
public:
1045+
is_type (const basic_json<C>& value) : value_(value)
1046+
{}
1047+
1048+
operator bool () const
1049+
{
1050+
return value_.is_double();
1051+
}
1052+
1053+
private:
1054+
const basic_json<C>& value_;
1055+
};
1056+
template<typename C>
1057+
class is_type<C,int>
1058+
{
1059+
public:
1060+
is_type (const basic_json<C>& value) : value_(value)
1061+
{}
1062+
1063+
operator bool () const
1064+
{
1065+
return value_.is_longlong();
1066+
}
1067+
1068+
private:
1069+
const basic_json<C>& value_;
1070+
};
1071+
template<typename C>
1072+
class is_type<C,unsigned int>
1073+
{
1074+
public:
1075+
is_type (const basic_json<C>& value) : value_(value)
1076+
{}
1077+
1078+
operator bool () const
1079+
{
1080+
return value_.is_ulonglong();
1081+
}
1082+
1083+
private:
1084+
const basic_json<C>& value_;
1085+
};
1086+
template<typename C>
1087+
class is_type<C,long>
1088+
{
1089+
public:
1090+
is_type (const basic_json<C>& value) : value_(value)
1091+
{}
1092+
1093+
operator bool () const
1094+
{
1095+
return value_.is_longlong();
1096+
}
1097+
1098+
private:
1099+
const basic_json<C>& value_;
1100+
};
1101+
template<typename C>
1102+
class is_type<C,unsigned long>
1103+
{
1104+
public:
1105+
is_type (const basic_json<C>& value) : value_(value)
1106+
{}
1107+
1108+
operator bool () const
1109+
{
1110+
return value_.is_ulonglong();
1111+
}
1112+
1113+
private:
1114+
const basic_json<C>& value_;
1115+
};
1116+
template<typename C>
1117+
class is_type<C,long long>
1118+
{
1119+
public:
1120+
is_type (const basic_json<C>& value) : value_(value)
1121+
{}
1122+
1123+
operator bool () const
1124+
{
1125+
return value_.is_longlong();
1126+
}
1127+
1128+
private:
1129+
const basic_json<C>& value_;
1130+
};
1131+
template<typename C>
1132+
class is_type<C,unsigned long long>
1133+
{
1134+
public:
1135+
is_type (const basic_json<C>& value) : value_(value)
1136+
{}
1137+
1138+
operator bool () const
1139+
{
1140+
return value_.is_ulonglong();
1141+
}
1142+
1143+
private:
1144+
const basic_json<C>& value_;
1145+
};
1146+
template<typename C>
1147+
class is_type<C,object_type>
1148+
{
1149+
public:
1150+
is_type (const basic_json<C>& value) : value_(value)
1151+
{}
1152+
1153+
operator bool () const
1154+
{
1155+
return value_.is_object();
1156+
}
1157+
1158+
private:
1159+
const basic_json<C>& value_;
1160+
};
1161+
template<typename C>
1162+
class is_type<C,array_type>
1163+
{
1164+
public:
1165+
is_type (const basic_json<C>& value) : value_(value)
1166+
{}
1167+
1168+
operator bool () const
1169+
{
1170+
return value_.is_array();
1171+
}
1172+
1173+
private:
1174+
const basic_json<C>& value_;
1175+
};
1176+
9601177
template<typename C, typename T>
9611178
class as_value
9621179
{

test_suite/src/json_accessor_tests.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,51 +23,65 @@ BOOST_AUTO_TEST_CASE(test_is_type)
2323
{
2424
json obj;
2525
BOOST_CHECK(obj.is_object());
26+
BOOST_CHECK(obj.is<json::object_type>());
2627
std::cout << "HERE!!!" << ", type=" << obj.type() << std::endl;
2728

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

3233
BOOST_CHECK(obj.is_object());
34+
BOOST_CHECK(obj.is<json::object_type>());
3335

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

3639
obj["double"] = 10.7;
3740
BOOST_CHECK(obj["double"].is_double());
41+
BOOST_CHECK(obj["double"].is<double>());
3842

3943
obj["int"] = -10;
4044
BOOST_CHECK(obj["int"].is_longlong());
45+
BOOST_CHECK(obj["int"].is<long long>());
4146

4247
obj["uint"] = 10u;
4348
BOOST_CHECK(obj["uint"].is_ulonglong());
49+
BOOST_CHECK(obj["uint"].is<unsigned long long>());
4450

4551
obj["long"] = static_cast<long>(10);
4652
BOOST_CHECK(obj["long"].is_longlong());
53+
BOOST_CHECK(obj["long"].is<long long>());
4754

4855
obj["ulong"] = static_cast<unsigned long>(10);
4956
BOOST_CHECK(obj["ulong"].is_ulonglong());
57+
BOOST_CHECK(obj["ulong"].is<unsigned long long>());
5058

5159
obj["longlong"] = static_cast<long long>(10);
5260
BOOST_CHECK(obj["longlong"].is_longlong());
61+
BOOST_CHECK(obj["longlong"].is<long long>());
5362

5463
obj["ulonglong"] = static_cast<unsigned long long>(10);
5564
BOOST_CHECK(obj["ulonglong"].is_ulonglong());
65+
BOOST_CHECK(obj["ulonglong"].is<unsigned long long>());
5666

5767
obj["true"] = true;
5868
BOOST_CHECK(obj["true"].is_bool());
69+
BOOST_CHECK(obj["true"].is<bool>());
5970

6071
obj["false"] = false;
6172
BOOST_CHECK(obj["false"].is_bool());
73+
BOOST_CHECK(obj["false"].is<bool>());
6274

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

6678
obj["object"] = json::an_object;
6779
BOOST_CHECK(obj["object"].is_object());
80+
BOOST_CHECK(obj["object"].is<json::object_type>());
6881

6982
obj["array"] = json::an_array;
7083
BOOST_CHECK(obj["array"].is_array());
84+
BOOST_CHECK(obj["array"].is<json::array_type>());
7185

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

7892
json str = obj["string"];
7993
BOOST_CHECK(str.is_string());
94+
BOOST_CHECK(str.is<std::string>());
8095
}
8196

8297
BOOST_AUTO_TEST_CASE(test_as_vector_of_double)

0 commit comments

Comments
 (0)