size.h 845 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. //
  2. // size.h
  3. // stream
  4. //
  5. // Created by Sam Jaffe on 3/30/23.
  6. //
  7. #pragma once
  8. #include <stream/forward.h>
  9. #include <stream/detail/traits.h>
  10. namespace stream::ranges {
  11. template <typename It, typename S> std::ptrdiff_t distance(It it, S end) {
  12. if constexpr (detail::is_sized_sentinel_v<It, S>) {
  13. return end - it;
  14. } else {
  15. std::ptrdiff_t accum = 0;
  16. for (; it != end; ++it) {
  17. ++accum;
  18. }
  19. return accum;
  20. }
  21. }
  22. template <typename Stream> size_t size(Stream const & stream) {
  23. if constexpr (detail::has_size_v<Stream>) {
  24. return stream.size();
  25. } else {
  26. return distance(stream.begin(), stream.end());
  27. }
  28. }
  29. template <typename Stream> bool empty(Stream const & stream) {
  30. if constexpr (detail::has_empty_v<Stream>) {
  31. return stream.empty();
  32. } else {
  33. return stream.begin() == stream.end();
  34. }
  35. }
  36. }