iter.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #pragma once
  2. #include "obj.h"
  3. class RangeIterator : public _Iterator {
  4. private:
  5. _Int current;
  6. _Range r;
  7. public:
  8. RangeIterator(VM* vm, PyVar _ref) : _Iterator(vm, _ref) {
  9. this->r = std::get<_Range>(_ref->_native);
  10. this->current = r.start;
  11. }
  12. bool hasNext() override {
  13. if(r.step > 0){
  14. return current < r.stop;
  15. }else{
  16. return current > r.stop;
  17. }
  18. }
  19. PyVar next() override;
  20. };
  21. class VectorIterator : public _Iterator {
  22. private:
  23. size_t index = 0;
  24. const PyVarList* vec;
  25. public:
  26. VectorIterator(VM* vm, PyVar _ref) : _Iterator(vm, _ref) {
  27. vec = &std::get<PyVarList>(_ref->_native);
  28. }
  29. bool hasNext(){
  30. return index < vec->size();
  31. }
  32. PyVar next(){
  33. return vec->operator[](index++);
  34. }
  35. };
  36. class StringIterator : public _Iterator {
  37. private:
  38. size_t index = 0;
  39. _Str str;
  40. public:
  41. StringIterator(VM* vm, PyVar _ref) : _Iterator(vm, _ref) {
  42. str = std::get<_Str>(_ref->_native);
  43. }
  44. bool hasNext(){
  45. return index < str.u8_length();
  46. }
  47. PyVar next();
  48. };