{
    return ostr << "CodecTestSequence{"
                << "name: " << seq.name
                << ", type name: " << seq.data_type->getName()
                << ", data size: " << seq.serialized_data.size() << " bytes"
                << "}";
}
template <typename T, typename... Args>
CodecTestSequence makeSeq(Args && ... args)
{
    std::initializer_list<T> vals{static_cast<T>(args)...};
    std::vector<char> data(sizeof(T) * std::size(vals));
    char * write_pos = data.data();
    for (const auto & v : vals)
    {
        unalignedStoreLE<T>(write_pos, v);
        write_pos += sizeof(v);
    }
    return CodecTestSequence{
            (fmt::format("{} values of {}", std::size(vals), type_name<T>())),
            std::move(data),
            makeDataType<T>()
    };
}
template <typename T, typename Generator, typename B = int, typename E = int>
CodecTestSequence generateSeq(Generator gen, const char* gen_name, B Begin = 0, E End = 10000)