Pair of Lines

1

Pair of Lines

2
@Def(range prereqs)
class Range {
public:
@put(range elements);
private:
Line prev_;
Line last_;
};
@End(range prereqs)
3
@def(range elements)
Line prev() {
return prev_ ? prev_ : last_;
}
@end(range elements)
4
@add(range elements)
Line last() {
return last_;
}
@end(range elements)
5
@add(range elements)
Range &operator<<(const Line &l) {
prev_ = last_;
last_ = l;
return *this;
}
@end(range elements)
6
@add(range elements)
operator bool() {
return last_;
}
@end(range elements)
7
@Add(range vars)
Range range;
@End(range vars)
8
@Rep(do range)
range = Range {};
range << get_line(cmd);
if (! cmd.empty() && cmd[0] == ',') {
cmd.erase(0, 1);
range << get_line(cmd);
}
@End(do range)
9
@Rep(do block range)
if (range) {
next = range.last()((curBlock -
curInput->second.blocks.begin()) + 1,
curInput->second.blocks.size()
) - 1;
if (next < 0) { next = 0; }
}
@End(do block range)
10
@Rep(do inputs range)
if (range) {
int idx = 1;
for (const auto &xx : inputs) {
if (xx.first == curInput->first) { break; }
++idx;
}
next = range.last()(idx, inputs.size()) - 1;
if (next < 0) { next = 0; }
}
@End(do inputs range)
11
@Rep(do str range)
if (range) {
next = range.last()(Line::max, c.size() + 1) - 1;
if (next < 0) { next = 0; }
int p = range.prev()(Line::max, c.size() + 1) - 1;
if (p < 0) { p = 0; }
@put(erase range);
}
@End(do str range)
12
@def(erase range)
if (p < next) {
c.erase(c.begin() + p, c.begin() + next);
next = p;
}
@end(erase range)
13
@Rep(range vars)
Range range;
@End(range vars)