in lang/c++/impl/Generic.cc [51:134]
void GenericReader::read(GenericDatum &datum, Decoder &d, bool isResolving) {
if (datum.isUnion()) {
datum.selectBranch(d.decodeUnionIndex());
}
switch (datum.type()) {
case AVRO_NULL:
d.decodeNull();
break;
case AVRO_BOOL:
datum.value<bool>() = d.decodeBool();
break;
case AVRO_INT:
datum.value<int32_t>() = d.decodeInt();
break;
case AVRO_LONG:
datum.value<int64_t>() = d.decodeLong();
break;
case AVRO_FLOAT:
datum.value<float>() = d.decodeFloat();
break;
case AVRO_DOUBLE:
datum.value<double>() = d.decodeDouble();
break;
case AVRO_STRING:
d.decodeString(datum.value<string>());
break;
case AVRO_BYTES:
d.decodeBytes(datum.value<bytes>());
break;
case AVRO_FIXED: {
auto &f = datum.value<GenericFixed>();
d.decodeFixed(f.schema()->fixedSize(), f.value());
} break;
case AVRO_RECORD: {
auto &r = datum.value<GenericRecord>();
size_t c = r.schema()->leaves();
if (isResolving) {
std::vector<size_t> fo =
static_cast<ResolvingDecoder &>(d).fieldOrder();
for (size_t i = 0; i < c; ++i) {
read(r.fieldAt(fo[i]), d, isResolving);
}
} else {
for (size_t i = 0; i < c; ++i) {
read(r.fieldAt(i), d, isResolving);
}
}
} break;
case AVRO_ENUM:
datum.value<GenericEnum>().set(d.decodeEnum());
break;
case AVRO_ARRAY: {
auto &v = datum.value<GenericArray>();
vector<GenericDatum> &r = v.value();
const NodePtr &nn = v.schema()->leafAt(0);
r.resize(0);
size_t start = 0;
for (size_t m = d.arrayStart(); m != 0; m = d.arrayNext()) {
r.resize(r.size() + m);
for (; start < r.size(); ++start) {
r[start] = GenericDatum(nn);
read(r[start], d, isResolving);
}
}
} break;
case AVRO_MAP: {
auto &v = datum.value<GenericMap>();
GenericMap::Value &r = v.value();
const NodePtr &nn = v.schema()->leafAt(1);
r.resize(0);
size_t start = 0;
for (size_t m = d.mapStart(); m != 0; m = d.mapNext()) {
r.resize(r.size() + m);
for (; start < r.size(); ++start) {
d.decodeString(r[start].first);
r[start].second = GenericDatum(nn);
read(r[start].second, d, isResolving);
}
}
} break;
default:
throw Exception("Unknown schema type {}", datum.type());
}
}