Skip to content

Commit d8ca53c

Browse files
committed
unordered_json_object from iterators
1 parent ba91912 commit d8ca53c

1 file changed

Lines changed: 23 additions & 17 deletions

File tree

include/jsoncons/ordered_json_object.hpp

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,16 @@ namespace jsoncons {
111111
std::memset(bloom, 0, bloom_bytes);
112112
for (auto it = first; it != last; ++it)
113113
{
114-
uint32_t h = a5hash32((*it).key().data(), (*it).key().size(), 0);
114+
auto kv = make_key_value<KeyT,Json>()(*it);
115+
uint32_t h = a5hash32(kv.key().data(), kv.key().size(), 0);
115116
if (JSONCONS_LIKELY(!bloom_may_contain(bloom, h)))
116117
{
117-
data_.emplace_back((*it).key(), (*it).value());
118+
data_.emplace_back(std::move(kv));
118119
bloom_set(bloom, h);
119120
}
120121
else
121122
{
122-
try_emplace((*it).key(), (*it).value());
123+
try_emplace(kv.key(), kv.value());
123124
}
124125
}
125126

@@ -128,7 +129,8 @@ namespace jsoncons {
128129
{
129130
for (auto it = first; it != last; ++it)
130131
{
131-
try_emplace((*it).key(), (*it).value());
132+
auto kv = make_key_value<KeyT,Json>()(*it);
133+
try_emplace(kv.key(), kv.value());
132134
}
133135
}
134136
}
@@ -139,25 +141,26 @@ namespace jsoncons {
139141
: allocator_holder<allocator_type>(alloc),
140142
data_(key_value_allocator_type(alloc))
141143
{
142-
std::size_t size = std::distance(first,last);
143-
if (size > 0)
144+
std::size_t count = std::distance(first,last);
145+
if (count > 0)
144146
{
145-
data_.reserve(size);
146-
if (size <= bloom_bytes)
147+
data_.reserve(count);
148+
if (count <= bloom_bytes)
147149
{
148150
std::uint8_t bloom[bloom_bytes];
149151
std::memset(bloom, 0, bloom_bytes);
150152
for (auto it = first; it != last; ++it)
151153
{
152-
uint32_t h = a5hash32((*it).key().data(), (*it).key().size(), 0);
154+
auto kv = make_key_value<KeyT,Json>()(*it);
155+
uint32_t h = a5hash32(kv.key().data(), kv.key().size(), 0);
153156
if (JSONCONS_LIKELY(!bloom_may_contain(bloom, h)))
154157
{
155-
data_.emplace_back((*it).key(), (*it).value());
158+
data_.emplace_back(std::move(kv));
156159
bloom_set(bloom, h);
157160
}
158161
else
159162
{
160-
try_emplace((*it).key(), (*it).value());
163+
try_emplace(kv.key(), kv.value());
161164
}
162165
}
163166

@@ -166,7 +169,8 @@ namespace jsoncons {
166169
{
167170
for (auto it = first; it != last; ++it)
168171
{
169-
try_emplace((*it).key(), (*it).value());
172+
auto kv = make_key_value<KeyT,Json>()(*it);
173+
try_emplace(kv.key(), kv.value());
170174
}
171175
}
172176
}
@@ -408,23 +412,25 @@ namespace jsoncons {
408412
}
409413
for (auto it = first; it != last; ++it)
410414
{
411-
uint32_t h = a5hash32((*it).first.data(), (*it).first.size(), 0);
415+
auto kv = make_key_value<KeyT,Json>()(*it);
416+
uint32_t h = a5hash32(kv.key().data(), kv.key().size(), 0);
412417
if (JSONCONS_LIKELY(!bloom_may_contain(bloom, h)))
413-
{
414-
data_.emplace_back(key_type{(*it).first.c_str(), (*it).first.size(), get_allocator()}, (*it).second);
418+
{
419+
data_.emplace_back(std::move(kv));
415420
bloom_set(bloom, h);
416421
}
417422
else
418423
{
419-
try_emplace(key_type{(*it).first.c_str(), (*it).first.size(), get_allocator()}, (*it).second);
424+
try_emplace(kv.key(), kv.value());
420425
}
421426
}
422427
}
423428
else
424429
{
425430
for (auto it = first; it != last; ++it)
426431
{
427-
try_emplace(key_type{(*it).first.c_str(), (*it).first.size(), get_allocator()}, (*it).second);
432+
auto kv = make_key_value<KeyT,Json>()(*it);
433+
try_emplace(kv.key(), kv.value());
428434
}
429435
}
430436
}

0 commit comments

Comments
 (0)