size.h 817 B

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