util.hpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include <iostream>
  2. #include <iterator>
  3. #include <cstddef>
  4. namespace util {
  5. template<typename Iterable>
  6. struct enumerate {
  7. Iterable iter;
  8. size_t size;
  9. decltype(std::begin(iter)) begin_;
  10. const decltype(std::end(iter)) end_;
  11. constexpr enumerate(Iterable iter): iter(iter), size(0),
  12. begin_(std::begin(iter)), end_(std::end(iter)) {}
  13. constexpr const enumerate& begin() const { return *this; }
  14. constexpr const enumerate& end() const { return *this; }
  15. constexpr bool operator!=(const enumerate&) const { return begin_ != end_; }
  16. constexpr void operator++() { ++begin_; ++size; }
  17. constexpr std::pair<size_t, decltype(*begin_) &> operator*() const {
  18. return { size, *begin_ };
  19. }
  20. };
  21. namespace literals {
  22. inline std::ostream & operator<<(std::ostream &os, std::byte b) {
  23. return os << std::to_integer<int>(b);
  24. }
  25. inline constexpr std::byte operator ""_b(unsigned long long b) noexcept
  26. {
  27. return static_cast<std::byte>(b);
  28. }
  29. }
  30. }