Older programmers tend to raise an eyebrow at added computation like the "<<", but here in 2022 we need to remember that we are about to do a memory access and even if it's in L1 cache, that "<<" is basically free by comparison.
Most microcontrollers do not have cache of this form (rather a simple read-ahead buffer at most).
Microcontrollers are also one of the targets of this type of library and the shift absolutely will have an effect.
#define DATA(buf) ((char*)((intptr_t)((buf)->data) << BFT_TYPE_BITS))
Older programmers tend to raise an eyebrow at added computation like the "<<", but here in 2022 we need to remember that we are about to do a memory access and even if it's in L1 cache, that "<<" is basically free by comparison.