Skip to content

Commit dad3cbc

Browse files
committed
Some consolidation in json::object's find by key. Workaround GCC no having vector::erase(const_iterator).
1 parent 0381957 commit dad3cbc

File tree

2 files changed

+33
-42
lines changed

2 files changed

+33
-42
lines changed

Release/include/cpprest/json.h

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,8 @@ namespace json
881881
/// </summary>
882882
/// <param name="position">A const_iterator to the element to delete.</param>
883883
/// <returns>Iterator to the new location of the element following the erased element.</returns>
884-
iterator erase(const_iterator position)
884+
/// <remarks>GCC doesn't support erase with const_iterator on vector yet. In the future this should be changed.</remarks>
885+
iterator erase(iterator position)
885886
{
886887
return m_elements.erase(position);
887888
}
@@ -1096,7 +1097,8 @@ namespace json
10961097
/// </summary>
10971098
/// <param name="position">A const_iterator to the element to delete.</param>
10981099
/// <returns>Iterator to the new location of the element following the erased element.</returns>
1099-
iterator erase(const_iterator position)
1100+
/// <remarks>GCC doesn't support erase with const_iterator on vector yet. In the future this should be changed.</remarks>
1101+
iterator erase(iterator position)
11001102
{
11011103
return m_elements.erase(position);
11021104
}
@@ -1108,7 +1110,7 @@ namespace json
11081110
void erase(const utility::string_t &key)
11091111
{
11101112
auto iter = find_by_key(key);
1111-
if (iter == m_elements.end() || key != (iter->first))
1113+
if (iter == m_elements.end())
11121114
{
11131115
throw web::json::json_exception(_XPLATSTR("Key not found"));
11141116
}
@@ -1124,9 +1126,10 @@ namespace json
11241126
json::value& at(const utility::string_t& key)
11251127
{
11261128
auto iter = find_by_key(key);
1127-
1128-
if (iter == m_elements.end() || key != (iter->first))
1129+
if (iter == m_elements.end())
1130+
{
11291131
throw web::json::json_exception(_XPLATSTR("Key not found"));
1132+
}
11301133

11311134
return iter->second;
11321135
}
@@ -1139,9 +1142,10 @@ namespace json
11391142
const json::value& at(const utility::string_t& key) const
11401143
{
11411144
auto iter = find_by_key(key);
1142-
1143-
if (iter == m_elements.end() || key != (iter->first))
1145+
if (iter == m_elements.end())
1146+
{
11441147
throw web::json::json_exception(_XPLATSTR("Key not found"));
1148+
}
11451149

11461150
return iter->second;
11471151
}
@@ -1153,10 +1157,12 @@ namespace json
11531157
/// <returns>If the key exists, a reference to the value kept in the field, otherwise a newly created null value that will be stored for the given key.</returns>
11541158
json::value& operator[](const utility::string_t& key)
11551159
{
1156-
auto iter = find_by_key(key);
1160+
auto iter = find_insert_location(key);
11571161

1158-
if (iter == m_elements.end() || key != (iter->first))
1162+
if (iter == m_elements.end() || key != iter->first)
1163+
{
11591164
return m_elements.insert(iter, std::pair<utility::string_t, value>(key, value()))->second;
1165+
}
11601166

11611167
return iter->second;
11621168
}
@@ -1168,7 +1174,7 @@ namespace json
11681174
/// <returns>A const iterator to the value kept in the field.</returns>
11691175
const_iterator find(const utility::string_t& key) const
11701176
{
1171-
return find_internal(key);
1177+
return find_by_key(key);
11721178
}
11731179

11741180
/// <summary>
@@ -1199,7 +1205,7 @@ namespace json
11991205
return p1.first < key;
12001206
}
12011207

1202-
storage_type::const_iterator find_by_key(const utility::string_t& key) const
1208+
storage_type::iterator find_insert_location(const utility::string_t &key)
12031209
{
12041210
if (m_keep_order)
12051211
{
@@ -1214,7 +1220,7 @@ namespace json
12141220
}
12151221
}
12161222

1217-
storage_type::iterator find_by_key(const utility::string_t& key)
1223+
storage_type::const_iterator find_by_key(const utility::string_t& key) const
12181224
{
12191225
if (m_keep_order)
12201226
{
@@ -1225,37 +1231,22 @@ namespace json
12251231
}
12261232
else
12271233
{
1228-
return std::lower_bound(m_elements.begin(), m_elements.end(), key, compare_with_key);
1234+
auto iter = std::lower_bound(m_elements.begin(), m_elements.end(), key, compare_with_key);
1235+
if (iter != m_elements.end() && key != iter->first)
1236+
{
1237+
return m_elements.end();
1238+
}
1239+
return iter;
12291240
}
12301241
}
12311242

1232-
const json::value& at_internal(const utility::string_t& key) const
1233-
{
1234-
auto iter = find_by_key(key);
1235-
1236-
if (iter == m_elements.end() || key != (iter->first))
1237-
throw web::json::json_exception(_XPLATSTR("Key not found"));
1238-
1239-
return iter->second;
1240-
}
1241-
1242-
const_iterator find_internal(const utility::string_t& key) const
1243-
{
1244-
auto iter = find_by_key(key);
1245-
1246-
if (iter != m_elements.end() && key != (iter->first))
1247-
return m_elements.end();
1248-
1249-
return iter;
1250-
}
1251-
1252-
iterator find_internal(const utility::string_t& key)
1243+
storage_type::iterator find_by_key(const utility::string_t& key)
12531244
{
1254-
auto iter = find_by_key(key);
1255-
1256-
if (iter != m_elements.end() && key != (iter->first))
1245+
auto iter = find_insert_location(key);
1246+
if (iter != m_elements.end() && key != iter->first)
1247+
{
12571248
return m_elements.end();
1258-
1249+
}
12591250
return iter;
12601251
}
12611252

Release/tests/functional/json/to_as_and_operators_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,8 @@ TEST(erase_array_iter)
364364
VERIFY_ARE_EQUAL(1, a[0].as_integer());
365365
VERIFY_ARE_EQUAL(3, a[1].as_integer());
366366

367-
auto citer = a.as_array().cbegin() + 1;
368-
afterLoc = a.as_array().erase(citer);
367+
iter = a.as_array().begin() + 1;
368+
afterLoc = a.as_array().erase(iter);
369369
VERIFY_ARE_EQUAL(a.as_array().end(), afterLoc);
370370
VERIFY_ARE_EQUAL(1, a.size());
371371
VERIFY_ARE_EQUAL(1, a[0].as_integer());
@@ -407,8 +407,8 @@ TEST(erase_object_iter)
407407
VERIFY_ARE_EQUAL(3, o[U("c")].as_integer());
408408
VERIFY_ARE_EQUAL(4, o[U("d")].as_integer());
409409

410-
auto citer = o.as_object().begin() + 2;
411-
afterLoc = o.as_object().erase(citer);
410+
iter = o.as_object().begin() + 2;
411+
afterLoc = o.as_object().erase(iter);
412412
VERIFY_ARE_EQUAL(2, o.size());
413413
VERIFY_ARE_EQUAL(o.as_object().end(), afterLoc);
414414
VERIFY_ARE_EQUAL(1, o[U("a")].as_integer());

0 commit comments

Comments
 (0)