// // size.h // stream // // Created by Sam Jaffe on 3/30/23. // #pragma once #include #include namespace stream::ranges { template std::ptrdiff_t distance(It it, S end) { if constexpr (detail::is_sized_sentinel_v) { return end - it; } else { std::ptrdiff_t accum = 0; for (; it != end; ++it) { ++accum; } return accum; } } template size_t size(Stream const & stream) { if constexpr (detail::has_size_v) { return stream.size(); } else { return distance(stream.begin(), stream.end()); } } template bool empty(Stream const & stream) { if constexpr (detail::has_empty_v) { return stream.empty(); } else { return stream.begin() == stream.end(); } } }