cmake build system: visiblity support for clang
[supercollider.git] / SCClassLibrary / Common / Collections / Interval.sc
blobbb478b29913095c68c5290826224c9375d36775b
1 Interval : Collection {
2         var <>start, <>end, <>step;
4         *new { arg start, end, step=1;
5                 ^super.newCopyArgs(start, end, step)
6         }
8         size { ^end - start div: step + 1 }
9         at { arg index;
10                 if (index < 0 or: { index >= this.size }, { ^nil });
11                 ^step * index + start;
12         }
13         wrapAt { arg index; ^step * (index % this.size) + start }
14         clipAt { arg index;
15                 if (index < 0) { ^start };
16                 if (index >= this.size) { ^end };
17                 ^step * index + start;
18         }
19         do { arg function;
20                 forBy(start, end, step, function);
21         }
23         add { ^this.shouldNotImplement(thisMethod) }
24         put { ^this.shouldNotImplement(thisMethod) }
25         storeArgs { ^[start, end, step] }
26         storeOn { arg stream;
27                 stream << this.class.name;
28                 this.storeParamsOn(stream);
29         }
30         printOn { arg stream; this.storeOn(stream) }
33 Range : Collection {
34         var <>start, <>size;
36         *new { arg start, size;
37                 ^super.newCopyArgs(start, size);
38         }
39         end { ^start + size }
40         do { arg function;
41                 for(start, start+size-1, function);
42         }
44         at { arg index;
45                 var val;
46                 if (index < 0 or: { index >= size }, { ^nil });
47                 ^start + index;
48         }
49         includes { arg val;
50                 ^(val >= start) and: { (val < this.end)  and: { val.frac == 0 }}
51         }
53         add { ^this.shouldNotImplement(thisMethod) }
54         put { ^this.shouldNotImplement(thisMethod) }
56         split { arg num;
57                 // assert: size > num
58                 var newRange = this.class.new(start, num);
59                 start = start + num;
60                 size = size - num;
61                 ^newRange
62         }
63         storeArgs { ^[start, size] }
64                 storeOn { arg stream;
65                 stream << this.class.name;
66                 this.storeParamsOn(stream);
67         }
68         printOn { arg stream; this.storeOn(stream) }