로딩중...
검색중...
일치하는것 없음
uiter.inl
1// nested class of tucontainable.inl:
2// this file allows to be refered by 'tucontainable.inl' file only.
3#pragma once
4
5#include "core/ast/node.hpp"
6
7namespace by {
8
9#define TEMPL template <typename T, typename R, typename RSquare>
10#define ME tucontainable<T, R, RSquare>::iter
11
12 TEMPL
13 ME::iter(): me(nullptr) {}
14
15 TEMPL
16 ME::iter(iteration* newStep): _iteration(newStep) { _nextToMatchParamType(iterable::NEXT); }
17
18 TEMPL
19 ME::iter(const me& rhs) { _assign(rhs); }
20
21 TEMPL
22 typename ME ME::operator+(ncnt step) {
23 next(step);
24 return *this;
25 }
26
27 TEMPL
28 typename ME& ME::operator++() {
29 next(1);
30 return *this;
31 }
32
33 TEMPL
34 typename ME ME::operator++(int) {
35 me ret = *this;
36 next(1);
37 return ret;
38 }
39
40 TEMPL
41 typename ME& ME::operator+=(ncnt step) {
42 next(step);
43 return *this;
44 }
45
46 TEMPL
47 RSquare ME::operator*() { return (RSquare) _iteration->operator*(); }
48
49 TEMPL
50 typename std::remove_reference<R>::type ME::operator->() { return get(); }
51
52 TEMPL
53 typename ME& ME::operator=(const me& rhs) {
54 _assign(rhs);
55 return *this;
56 }
57
58 TEMPL
59 ME::operator nbool() const { return !isEnd(); }
60
61 TEMPL
62 nbool ME::isReversed() const { return _iteration ? _iteration->isReversed() : false; }
63
64 TEMPL
65 void ME::rel() { _iteration TO(rel()); }
66
67 TEMPL
68 nbool ME::isFrom(const tucontainable& it) const { return _iteration ? _iteration->isFrom(it) : false; }
69
70 TEMPL
71 nbool ME::isEnd() const { return _iteration ? _iteration->isEnd() : true; }
72
73 TEMPL
74 ncnt ME::_step(typename iterable::iterationType type, ncnt step) {
75 WHEN_NUL(_iteration).ret(0);
76
77 for(int n = 0; n < step; n++) {
78 if(_iterate(type, step) <= 0) return n;
79 _nextToMatchParamType(type);
80 }
81
82 return step;
83 }
84
85 TEMPL
86 ncnt ME::next(ncnt step) { return _step(iterable::NEXT, step); }
87
88 TEMPL
89 ncnt ME::prev(ncnt step) { return _step(iterable::PREV, step); }
90
91 TEMPL
92 ncnt ME::stepForward(ncnt step) { return _step(iterable::FORWARD, step); }
93
94 TEMPL
95 ncnt ME::stepBackward(ncnt step) { return _step(iterable::BACKWARD, step); }
96
97 TEMPL
98 R ME::get() { return _iteration ? (R) _iteration->get() : R{}; }
99
100 TEMPL
101 tucontainable<T, R, RSquare>* ME::getContainer() { return _iteration ? _iteration->getContainer() : nullptr; }
102
103 TEMPL
104 typename ME& ME::_assign(const me& rhs) {
105 _iteration.bind(rhs._iteration ? (iteration*) rhs._iteration->clone() : nullptr);
106 return *this;
107 }
108
109 TEMPL
110 nbool ME::_onSame(const typeProvidable& rhs) const {
111 const me& cast = (const me&) rhs;
112 return _iteration == cast._iteration;
113 }
114
115 TEMPL
116 void ME::_nextToMatchParamType(typename iterable::iterationType type) {
117 while(!isEnd()) {
118 WHEN(!typeTrait<R>::isNul(get())) .ret();
119 _iterate(type, 1);
120 }
121 }
122
123 TEMPL
124 ncnt ME::_iterate(typename iterable::iterationType type, ncnt step) {
125 switch(type) {
126 case iterable::FORWARD: return _iteration->stepForward(1);
127 case iterable::BACKWARD: return _iteration->stepBackward(1);
128 case iterable::PREV: return _iteration->prev(1);
129 default:
130 case iterable::NEXT: return _iteration->next(1);
131 }
132 }
133
134#undef ME
135#undef TEMPL
136} // namespace by
Definition biteration.hpp:5
to Top