in lang/c/src/datum_size.c [189:279]
static int64_t size_datum(avro_writer_t writer, const avro_encoding_t * enc,
avro_schema_t writers_schema, avro_datum_t datum)
{
if (is_avro_schema(writers_schema) && is_avro_link(writers_schema)) {
return size_datum(writer, enc,
(avro_schema_to_link(writers_schema))->to,
datum);
}
switch (avro_typeof(datum)) {
case AVRO_NULL:
return enc->size_null(writer);
case AVRO_BOOLEAN:
return enc->size_boolean(writer,
avro_datum_to_boolean(datum)->i);
case AVRO_STRING:
return enc->size_string(writer, avro_datum_to_string(datum)->s);
case AVRO_BYTES:
return enc->size_bytes(writer,
avro_datum_to_bytes(datum)->bytes,
avro_datum_to_bytes(datum)->size);
case AVRO_INT32:
case AVRO_INT64:{
int64_t val = avro_typeof(datum) == AVRO_INT32 ?
avro_datum_to_int32(datum)->i32 :
avro_datum_to_int64(datum)->i64;
if (is_avro_schema(writers_schema)) {
/* handle promotion */
if (is_avro_float(writers_schema)) {
return enc->size_float(writer,
(float)val);
} else if (is_avro_double(writers_schema)) {
return enc->size_double(writer,
(double)val);
}
}
return enc->size_long(writer, val);
}
case AVRO_FLOAT:{
float val = avro_datum_to_float(datum)->f;
if (is_avro_schema(writers_schema)
&& is_avro_double(writers_schema)) {
/* handle promotion */
return enc->size_double(writer, (double)val);
}
return enc->size_float(writer, val);
}
case AVRO_DOUBLE:
return enc->size_double(writer, avro_datum_to_double(datum)->d);
case AVRO_RECORD:
return size_record(writer, enc,
avro_schema_to_record(writers_schema),
datum);
case AVRO_ENUM:
return size_enum(writer, enc,
avro_schema_to_enum(writers_schema),
avro_datum_to_enum(datum));
case AVRO_FIXED:
return avro_datum_to_fixed(datum)->size;
case AVRO_MAP:
return size_map(writer, enc,
avro_schema_to_map(writers_schema),
avro_datum_to_map(datum));
case AVRO_ARRAY:
return size_array(writer, enc,
avro_schema_to_array(writers_schema),
avro_datum_to_array(datum));
case AVRO_UNION:
return size_union(writer, enc,
avro_schema_to_union(writers_schema),
avro_datum_to_union(datum));
case AVRO_LINK:
case AVRO_INVALID:
break;
}
return 0;
}