{
#define MAKE_DATA_TYPE(TYPE) \
    if constexpr (std::is_same_v<T, TYPE>) return std::make_shared<DataType ## TYPE>()
    MAKE_DATA_TYPE(UInt8);
    MAKE_DATA_TYPE(UInt16);
    MAKE_DATA_TYPE(UInt32);
    MAKE_DATA_TYPE(UInt64);
    MAKE_DATA_TYPE(Int8);
    MAKE_DATA_TYPE(Int16);
    MAKE_DATA_TYPE(Int32);
    MAKE_DATA_TYPE(Int64);
    MAKE_DATA_TYPE(Float32);
    MAKE_DATA_TYPE(Float64);
#undef MAKE_DATA_TYPE
    assert(false && "unknown datatype");
    return nullptr;
}
template <typename T, typename Container>
class BinaryDataAsSequenceOfValuesIterator