// // Created by selim on 27.11.22. // #include "Snapshot.h" #include #include #include namespace Dart { Snapshot::Snapshot(const std::byte *data) { _magic = *(uint32_t*)data; data += sizeof(_magic); if(_magic != MAGIC) { throw std::runtime_error("Snapshot magic mismatch"); } _size = *(uint64_t*)data; data += sizeof(_size); _kind = *(Kind*)data; data += sizeof(Kind); _versionHash.assign((char*)data, 32); data += _versionHash.size(); auto features = std::string((char*)data); data += features.size(); auto view = features | std::ranges::views::split(' ') | std::ranges::views::transform([](auto &&rng) { return std::string(&*rng.begin(), std::ranges::distance(rng)); }); _features.assign(view.begin(), view.end()); } uint64_t Snapshot::size() const { return _size; } std::string Snapshot::kindString() const { switch (_kind) { case Kind::FULL: return "Full"; case Kind::FULL_JIT: return "Full JIT"; case Kind::FULL_AOT: return "Full AOT"; case Kind::MESSAGE: return "Message"; case Kind::NONE: return "None"; case Kind::INVALID: return "Invalid"; } return ""; } std::string Snapshot::versionHash() const { return _versionHash; } std::string Snapshot::featuresString() const { std::stringstream ss; size_t size = _features.size(); for(size_t i = 0; i < size; ++i) { ss << _features[i]; if(i < size - 1) { ss << ", "; } } return ss.str(); } }