9#ifndef LLVM_CLANG_AST_ABSTRACTBASICWRITER_H
10#define LLVM_CLANG_AST_ABSTRACTBASICWRITER_H
17namespace serialization {
21 return (value.isNull() ? std::optional<T>() : std::optional<T>(value));
25 return (value ? std::optional<T *>(value) : std::optional<T *>());
98#include "clang/AST/AbstractBasicWriter.inc"
122 using BasicWriterBase<Impl>::asImpl;
128 Impl &
find(
const char *propertyName) {
138 asImpl().writeUInt32(uint32_t(value));
143 asImpl().writeUInt32(array.size());
144 for (
const T &elt : array) {
145 WriteDispatcher<T>::write(asImpl(), elt);
150 WriteDispatcher<T>::write(asImpl(), PackOptionalValue<T>::pack(value));
154 asImpl().writeBool(value.isUnsigned());
155 asImpl().writeAPInt(value);
159 asImpl().writeUInt32(value.getBitWidth());
160 const uint64_t *words = value.getRawData();
161 for (
size_t i = 0, e = value.getNumWords(); i != e; ++i)
162 asImpl().writeUInt64(words[i]);
166 asImpl().writeUInt32(sema.getWidth());
167 asImpl().writeUInt32(sema.getScale());
168 asImpl().writeUInt32(sema.isSigned() | sema.isSaturated() << 1 |
169 sema.hasUnsignedPadding() << 2);
176 asImpl().writeQualType(elemTy);
177 asImpl().writeUInt32(path.size());
178 auto &ctx = ((BasicWriterBase<Impl> *)
this)->getASTContext();
179 for (
auto elem : path) {
181 asImpl().writeUInt32(elem.getAsBaseOrMember().getInt());
182 const Decl *baseOrMember = elem.getAsBaseOrMember().getPointer();
183 if (
const auto *
recordDecl = dyn_cast<CXXRecordDecl>(baseOrMember)) {
187 const auto *
valueDecl = cast<ValueDecl>(baseOrMember);
192 asImpl().writeUInt32(elem.getAsArrayIndex());
193 elemTy = ctx.getAsArrayType(elemTy)->getElementType();
200 "update this if the value size changes");
206 asImpl().writeUInt32(uint32_t(esi.
Type));
214 }
else if (esi.
Type ==