45 lines
1.1 KiB
C++
45 lines
1.1 KiB
C++
#pragma once
|
|
|
|
#if SIMDJSON_EXCEPTIONS
|
|
|
|
#include "large_amazon_cellphones.h"
|
|
#include <algorithm>
|
|
|
|
namespace large_amazon_cellphones {
|
|
|
|
using namespace simdjson;
|
|
|
|
struct simdjson_dom {
|
|
using StringType = std::string;
|
|
|
|
dom::parser parser{};
|
|
|
|
bool run(simdjson::padded_string &json, std::map<StringType, brand> &result) {
|
|
auto stream = parser.parse_many(json);
|
|
auto i = stream.begin();
|
|
++i; // Skip first line
|
|
for (;i != stream.end(); ++i) {
|
|
auto doc = *i;
|
|
StringType copy(std::string_view(doc.at(1)));
|
|
auto x = result.find(copy);
|
|
if (x == result.end()) { // If key not found, add new key
|
|
result.emplace(copy, large_amazon_cellphones::brand{
|
|
double(doc.at(5)) * uint64_t(doc.at(7)),
|
|
uint64_t(doc.at(7))
|
|
});
|
|
} else { // Otherwise, update key data
|
|
x->second.cumulative_rating += double(doc.at(5)) * uint64_t(doc.at(7));
|
|
x->second.reviews_count += uint64_t(doc.at(7));
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
};
|
|
|
|
BENCHMARK_TEMPLATE(large_amazon_cellphones, simdjson_dom)->UseManualTime();
|
|
|
|
} // namespace large_amazon_cellphones
|
|
|
|
#endif // SIMDJSON_EXCEPTIONS
|