glean/rts/fact.cpp (38 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "glean/rts/fact.h"
#include <folly/String.h>
#include <sstream>
namespace facebook {
namespace glean {
namespace rts {
void Fact::serialize(binary::Output& output, Pid type, Fact::Clause clause) {
output.packed(type);
output.packed(clause.key_size);
output.packed(clause.value_size);
output.put(clause.bytes());
}
void Fact::deserialize(binary::Input& input, Pid& type, Fact::Clause& clause) {
type = input.packed<Pid>();
const auto key_size = input.packed<uint32_t>();
const auto value_size = input.packed<uint32_t>();
const auto data = input.bytes(key_size + value_size).data();
clause = {data, key_size, value_size};
}
std::string Fact::dump() const {
std::ostringstream os;
auto bytes = [](std::ostream& os, folly::ByteRange bs) {
if (std::all_of(bs.begin(), bs.end(),
[](auto c) { return c >= 32 && c < 127; })) {
os << '"' << std::string(bs.begin(), bs.end()) << '"';
} else {
os << folly::hexlify(bs);
}
};
os << '{' << id().toThrift() << "} {" << type().toThrift() << "} ";
bytes(os, key());
os << ' ';
bytes(os, value());
return os.str();
}
}
}
}