lciter.h 882 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #pragma once
  2. #include <util/generic/typetraits.h>
  3. #include <util/string/ascii.h>
  4. #include <iterator>
  5. template <class T>
  6. struct TLowerCaseIterator: public std::iterator<std::input_iterator_tag, T> {
  7. using TNonConst = std::remove_const_t<T>;
  8. inline TLowerCaseIterator(T* c)
  9. : C(c)
  10. {
  11. }
  12. inline TLowerCaseIterator& operator++() noexcept {
  13. ++C;
  14. return *this;
  15. }
  16. inline TLowerCaseIterator operator++(int) noexcept {
  17. return C++;
  18. }
  19. inline TNonConst operator*() const noexcept {
  20. return AsciiToLower(*C);
  21. }
  22. T* C;
  23. };
  24. template <class T>
  25. inline bool operator==(const TLowerCaseIterator<T>& l, const TLowerCaseIterator<T>& r) noexcept {
  26. return l.C == r.C;
  27. }
  28. template <class T>
  29. inline bool operator!=(const TLowerCaseIterator<T>& l, const TLowerCaseIterator<T>& r) noexcept {
  30. return !(l == r);
  31. }