in thrift/lib/cpp2/protocol/TableBasedSerializerImpl.h [406:542]
size_t write(Protocol_* iprot, const TypeInfo& typeInfo, ThriftValue value) {
switch (typeInfo.type) {
case protocol::TType::T_STRUCT:
return write(
iprot,
*static_cast<const StructInfo*>(typeInfo.typeExt),
value.object);
case protocol::TType::T_I64:
return iprot->writeI64(value.int64Value);
case protocol::TType::T_I32:
return iprot->writeI32(value.int32Value);
case protocol::TType::T_I16:
return iprot->writeI16(value.int16Value);
case protocol::TType::T_BYTE:
return iprot->writeByte(value.int8Value);
case protocol::TType::T_BOOL:
return iprot->writeBool(value.boolValue);
case protocol::TType::T_DOUBLE:
return iprot->writeDouble(value.doubleValue);
case protocol::TType::T_FLOAT:
return iprot->writeFloat(value.floatValue);
case protocol::TType::T_STRING: {
switch (*static_cast<const StringFieldType*>(typeInfo.typeExt)) {
case StringFieldType::String:
return iprot->writeString(
*static_cast<const std::string*>(value.object));
case StringFieldType::StringView:
return iprot->writeBinary(
static_cast<const folly::StringPiece>(value.stringViewValue));
case StringFieldType::Binary:
return iprot->writeBinary(
*static_cast<const std::string*>(value.object));
case StringFieldType::IOBufObj:
return iprot->writeBinary(
*static_cast<const folly::IOBuf*>(value.iobuf));
case StringFieldType::IOBuf:
return iprot->writeBinary(
*static_cast<const folly::IOBuf*>(value.object));
case StringFieldType::IOBufPtr:
return iprot->writeBinary(
*static_cast<const std::unique_ptr<folly::IOBuf>*>(value.object));
};
}
// For container types, when recursively writing with lambdas we
// intentionally skip checking OptionalThriftValue.hasValue and treat it
// as a user error if the value is a nullptr.
case protocol::TType::T_MAP: {
const auto& ext = *static_cast<const MapFieldExt*>(typeInfo.typeExt);
size_t written = iprot->writeMapBegin(
ext.keyInfo->type, ext.valInfo->type, ext.size(value.object));
struct Context {
const TypeInfo* keyInfo;
const TypeInfo* valInfo;
Protocol_* iprot;
};
const Context context = {
ext.keyInfo,
ext.valInfo,
iprot,
};
written += ext.writeMap(
&context,
value.object,
iprot->kSortKeys(),
[](const void* context, const void* key, const void* val) {
const auto& typedContext = *static_cast<const Context*>(context);
const TypeInfo& keyInfo = *typedContext.keyInfo;
const TypeInfo& valInfo = *typedContext.valInfo;
return write(typedContext.iprot, keyInfo, *getValue(keyInfo, key)) +
write(typedContext.iprot,
*typedContext.valInfo,
*getValue(valInfo, val));
});
written += iprot->writeMapEnd();
return written;
}
case protocol::TType::T_SET: {
const auto& ext = *static_cast<const SetFieldExt*>(typeInfo.typeExt);
size_t written =
iprot->writeSetBegin(ext.valInfo->type, ext.size(value.object));
struct Context {
const TypeInfo* valInfo;
Protocol_* iprot;
};
const Context context = {
ext.valInfo,
iprot,
};
written += ext.writeSet(
&context,
value.object,
iprot->kSortKeys(),
[](const void* context, const void* value) {
const auto& typedContext = *static_cast<const Context*>(context);
const TypeInfo& valInfo = *typedContext.valInfo;
return write(
typedContext.iprot, valInfo, *getValue(valInfo, value));
});
written += iprot->writeSetEnd();
return written;
}
case protocol::TType::T_LIST: {
const auto& ext = *static_cast<const ListFieldExt*>(typeInfo.typeExt);
size_t written =
iprot->writeListBegin(ext.valInfo->type, ext.size(value.object));
struct Context {
const TypeInfo* valInfo;
Protocol_* iprot;
};
const Context context = {
ext.valInfo,
iprot,
};
written += ext.writeList(
&context, value.object, [](const void* context, const void* value) {
const auto& typedContext = *static_cast<const Context*>(context);
const TypeInfo& valInfo = *typedContext.valInfo;
return write(
typedContext.iprot, valInfo, *getValue(valInfo, value));
});
written += iprot->writeListEnd();
return written;
}
case protocol::TType::T_STOP:
case protocol::TType::T_VOID:
case protocol::TType::T_STREAM:
case protocol::TType::T_UTF8:
case protocol::TType::T_U64:
case protocol::TType::T_UTF16:
DCHECK(false);
break;
}
return 0;
}