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