ranges.h 982 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. //
  2. // ranges.h
  3. // iterator
  4. //
  5. // Created by Sam Jaffe on 4/1/23.
  6. // Copyright © 2023 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. namespace ranges {
  10. template <typename It, typename S, typename F>
  11. auto for_each(It it, S end, F consumer) {
  12. for (; it != end; ++it) {
  13. std::invoke(consumer, *it);
  14. }
  15. return std::make_pair(it, consumer);
  16. }
  17. template <typename It, typename S> auto distance(It it, S end) {
  18. typename std::iterator_traits<It>::difference_type diff{0};
  19. for_each(it, end, [&diff](auto const &) { ++diff; });
  20. return diff;
  21. }
  22. template <template <typename...> class C, typename It, typename S>
  23. auto to(It it, S end) {
  24. decltype(C(it, it)) rval;
  25. for_each(it, end,
  26. [&rval](auto const & elem) { rval.insert(rval.end(), elem); });
  27. return rval;
  28. }
  29. template <typename C, typename It, typename S> auto to(It it, S end) {
  30. C rval;
  31. for_each(it, end,
  32. [&rval](auto const & elem) { rval.insert(rval.end(), elem); });
  33. return rval;
  34. }
  35. }