{
        return current_value;
    }
    size_t itemsLeft() const
    {
        return reinterpret_cast<const char *>(data_end) - reinterpret_cast<const char *>(data);
    }
    Self & operator++()
    {
        read();
        return *this;
    }
    explicit operator bool() const
    {
        return itemsLeft() > 0;
    }
private:
    void read()
    {
        if (!*this)
        {
            throw std::runtime_error("No more data to read");
        }
        current_value = unalignedLoadLE<T>(data);
        data = reinterpret_cast<const char *>(data) + sizeof(T);
    }
};
template <typename T, typename Container>
BinaryDataAsSequenceOfValuesIterator<T, Container> AsSequenceOf(const Container & container)