45 lines
1.3 KiB
C++
45 lines
1.3 KiB
C++
#include <iostream>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <nlohmann/json_view.hpp>
|
|
|
|
using json_document = nlohmann::json_document;
|
|
|
|
int main()
|
|
{
|
|
std::cout << std::boolalpha;
|
|
|
|
// build a large array (many nodes), then read a small one into the same
|
|
// document: the index grown for the large input is still allocated
|
|
std::ostringstream big;
|
|
big << '[';
|
|
for (int i = 0; i < 500; ++i)
|
|
{
|
|
if (i != 0)
|
|
{
|
|
big << ',';
|
|
}
|
|
big << i;
|
|
}
|
|
big << ']';
|
|
|
|
json_document doc;
|
|
doc.read(big.str());
|
|
const std::size_t big_nodes = doc.node_count();
|
|
|
|
doc.read(std::string("[1]"));
|
|
std::cout << (doc.node_count() < big_nodes) << '\n'; // far fewer live nodes now
|
|
const std::size_t before = doc.memory_usage();
|
|
|
|
// shrink_to_fit() moves the index into a block sized for what is actually
|
|
// used. This INVALIDATES every view taken from this document before the
|
|
// call (they point into the old, now-freed block) -- take fresh ones from
|
|
// root() afterward.
|
|
doc.shrink_to_fit();
|
|
const std::size_t after = doc.memory_usage();
|
|
std::cout << (after <= before) << '\n';
|
|
|
|
// a freshly taken view is valid and correct
|
|
std::cout << doc.root().is_array() << ' ' << doc.root().size() << '\n';
|
|
}
|