84 if (st->getStmtClass() != clang::Stmt::IntegerLiteralClass) {
87 const auto *
const integerLiteral =
static_cast<const clang::IntegerLiteral *
>(st);
88 auto evaluation = clang::Expr::EvalResult();
89 integerLiteral->EvaluateAsInt(evaluation,
ctx, clang::Expr::SE_NoSideEffects,
true);
90 if (!evaluation.Val.isInt()) {
93 const auto &asInt = evaluation.Val.getInt();
94 if (asInt.getActiveBits() > 64) {
97 res = asInt.getZExtValue();
202 if (relevantClasses.empty()) {
207 os <<
"namespace ReflectiveRapidJSON {\n"
208 "namespace BinaryReflector {\n\n";
221 bool writePrivateMembers =
false, readPrivateMembers =
false;
222 for (
const clang::FriendDecl *
const friendDecl : relevantClass.record->friends()) {
224 const clang::NamedDecl *
const actualFriendDecl = friendDecl->getFriendDecl();
225 if (!actualFriendDecl || actualFriendDecl->getKind() != clang::Decl::Kind::Function) {
229 const string friendName(actualFriendDecl->getQualifiedNameAsString());
230 if (friendName ==
"ReflectiveRapidJSON::BinaryReflector::writeCustomType") {
231 writePrivateMembers =
true;
233 if (friendName ==
"ReflectiveRapidJSON::BinaryReflector::readCustomType") {
234 readPrivateMembers =
true;
236 if (writePrivateMembers && readPrivateMembers) {
245 os <<
"// define code for (de)serializing " << relevantClass.qualifiedName <<
" objects\n";
248 os <<
"template <> " << visibility <<
" void writeCustomType<::" << relevantClass.qualifiedName
249 <<
">(BinarySerializer &serializer, const ::" << relevantClass.qualifiedName <<
" &customObject, BinaryVersion version)\n{\n";
250 os <<
" // write base classes\n";
252 os <<
" serializer.write(static_cast<const ::" << baseClass->qualifiedName <<
" &>(customObject), version);\n";
254 if (!relevantClass.relevantBase.empty()) {
255 os <<
" // write version\n"
256 " using V = Versioning<"
257 << relevantClass.relevantBase
259 " if constexpr (V::enabled) {\n"
260 " serializer.writeVariableLengthUIntBE(V::applyDefault(version));\n"
263 os <<
" // write members\n";
265 for (clang::Decl *
const decl : relevantClass.record->decls()) {
267 if (mt.checkForVersionMarker(decl)) {
272 if (decl->getKind() != clang::Decl::Kind::Field) {
277 const auto *
const field =
static_cast<const clang::FieldDecl *
>(decl);
278 if (field->getType().isConstant(field->getASTContext())) {
283 if (!writePrivateMembers && field->getAccess() != clang::AS_public) {
288 mt.writeVersionCondition(os);
289 mt.writeExtraPadding(os);
292 os <<
" serializer.write(customObject." << field->getName() <<
", version);\n";
293 mt.membersWritten =
true;
295 mt.concludeCondition(os);
296 if (relevantBases.empty() && !mt.membersWritten) {
297 os <<
" (void)serializer;\n (void)customObject;\n \n(void)version;";
302 if (!relevantClass.record->hasDefaultConstructor()) {
308 os <<
"template <> " << visibility <<
" BinaryVersion readCustomType<::" << relevantClass.qualifiedName
309 <<
">(BinaryDeserializer &deserializer, ::" << relevantClass.qualifiedName <<
" &customObject, BinaryVersion version)\n{\n";
310 os <<
" // read base classes\n";
312 os <<
" deserializer.read(static_cast<::" << baseClass->qualifiedName <<
" &>(customObject), version);\n";
314 if (!relevantClass.relevantBase.empty()) {
315 os <<
" // read version\n"
316 " using V = Versioning<"
317 << relevantClass.relevantBase
319 " if constexpr (V::enabled) {\n"
320 " V::assertVersion(version = deserializer.readVariableLengthUIntBE(), \""
321 << relevantClass.qualifiedName
325 os <<
" // read members\n";
326 for (clang::Decl *
const decl : relevantClass.record->decls()) {
328 if (mt.checkForVersionMarker(decl)) {
333 if (decl->getKind() != clang::Decl::Kind::Field) {
338 const auto *
const field =
static_cast<const clang::FieldDecl *
>(decl);
339 if (field->getType().isConstant(field->getASTContext())) {
344 mt.writeVersionCondition(os);
345 mt.writeExtraPadding(os);
347 if (readPrivateMembers || field->getAccess() == clang::AS_public) {
348 os <<
" deserializer.read(customObject." << field->getName() <<
", version);\n";
349 mt.membersWritten =
true;
352 mt.concludeCondition(os);
353 if (relevantBases.empty() && !mt.membersWritten) {
354 os <<
" (void)deserializer;\n (void)customObject;\n";
356 os <<
" return version;\n";
361 os <<
"} // namespace BinaryReflector\n"
362 "} // namespace ReflectiveRapidJSON\n";