def what_type?(type, member = nil, headers = nil, &b)
m = "#{type}"
name = type
if member
m << "." << member
name = "(((#{type} *)0)->#{member})"
end
fmt = "seems %s"
def fmt.%(x)
x ? super : "unknown"
end
checking_for checking_message(m, headers), fmt do
if scalar_ptr_type?(type, member, headers, &b)
if try_static_assert("sizeof(*#{name}) == 1", headers)
"string"
end
elsif scalar_type?(type, member, headers, &b)
if try_static_assert("sizeof(#{name}) > sizeof(long)", headers)
"long long"
elsif try_static_assert("sizeof(#{name}) > sizeof(int)", headers)
"long"
elsif try_static_assert("sizeof(#{name}) > sizeof(short)", headers)
"int"
elsif try_static_assert("sizeof(#{name}) > 1", headers)
"short"
else
"char"
end
end
end
end