2 using Psychlops.Internal;
\r
8 public struct Interval {
\r
9 public enum OPERATOR { CLOSE, OPEN };
\r
10 public const OPERATOR CLOSE = OPERATOR.CLOSE, OPEN = OPERATOR.OPEN;
\r
17 op = OPERATOR.CLOSE;
\r
19 public VAL(double v, OPERATOR o)
\r
24 public bool bounded()
\r
26 return !Double.IsNaN(val) && (!Double.IsInfinity(val) || op == OPERATOR.OPEN);
\r
29 public VAL begin, end;
\r
34 begin = new VAL { val = Double.PositiveInfinity, op = OPERATOR.CLOSE };
\r
35 end = new VAL { val = Double.NegativeInfinity, op = OPERATOR.CLOSE };
\r
37 public Interval(double floor_val, double ceil_val)
\r
39 begin.val = floor_val;
\r
40 begin.op = OPERATOR.CLOSE;
\r
42 end.op = OPERATOR.CLOSE;
\r
44 public Interval(double floor_val, OPERATOR floor_op, double ceil_val, OPERATOR ceil_op)
\r
46 begin.val = floor_val;
\r
47 begin.op = floor_op;
\r
53 public int int_floor();
\r
54 public int int_floor(int minval);
\r
55 public int int_ceil();
\r
56 public int int_ceil(int maxval);
\r
58 bool includes(double val)
\r
60 bool result = false;
\r
62 case OPERATOR.CLOSE:
\r
63 result = begin.val<=val ? true : false;
\r
66 result = begin.val<val ? true : false;
\r
70 case OPERATOR.CLOSE:
\r
71 result = result && ( end.val>=val ? true : false );
\r
74 result = result && ( end.val>val ? true : false );
\r
80 public bool bounded()
\r
82 return begin.bounded() && end.bounded();
\r
85 System.Collections.Generic.IEnumerable<double> step(double steps)
\r
87 if (steps > 0) throw new Exception("Interval: step must be a positive");
\r
88 // return new IntervalIEnumerable(this, steps);
\r
90 long front_step = (it.begin.op == Interval.OPERATOR.CLOSE ? -1 : 0);
\r
91 long back_step = (long)System.Math.Floor((it.end.val - it.begin.val) / steps);
\r
92 if (it.end.op == Interval.OPERATOR.OPEN && 0 == System.Math.IEEERemainder(it.end.val - it.begin.val, steps))
\r
96 while (front_step <= back_step)
\r
97 yield return steps * front_step + it.begin.val;
\r
101 #region accessor generation
\r
103 public static IntervalAcc operator <(double val, Interval rng)
\r
105 return new IntervalAcc { instance = new Interval(val, OPERATOR.OPEN, Double.PositiveInfinity, OPERATOR.CLOSE) };
\r
107 public static IntervalAcc operator <=(double val, Interval rng)
\r
109 return new IntervalAcc { instance = new Interval(val, OPERATOR.CLOSE, Double.PositiveInfinity, OPERATOR.CLOSE) };
\r
111 public static IntervalAcc operator >(double val, Interval rng)
\r
113 return new IntervalAcc { instance = new Interval(Double.NegativeInfinity, OPERATOR.CLOSE, val, OPERATOR.OPEN) };
\r
115 public static IntervalAcc operator >=(double val, Interval rng)
\r
117 return new IntervalAcc { instance = new Interval(Double.NegativeInfinity, OPERATOR.CLOSE, val, OPERATOR.CLOSE) };
\r
119 public static IntervalAcc operator <(Interval rng, double val)
\r
121 return new IntervalAcc { instance = new Interval(Double.NegativeInfinity, OPERATOR.CLOSE, val, OPERATOR.OPEN) };
\r
123 public static IntervalAcc operator <=(Interval rng, double val)
\r
125 return new IntervalAcc { instance = new Interval(Double.NegativeInfinity, OPERATOR.CLOSE, val, OPERATOR.CLOSE) };
\r
127 public static IntervalAcc operator >(Interval rng, double val)
\r
129 return new IntervalAcc { instance = new Interval(val, OPERATOR.OPEN, Double.PositiveInfinity, OPERATOR.CLOSE) };
\r
131 public static IntervalAcc operator >=(Interval rng, double val)
\r
133 return new IntervalAcc { instance = new Interval(val, OPERATOR.CLOSE, Double.PositiveInfinity, OPERATOR.CLOSE) };
\r
142 #region accessor definition
\r
144 public struct IntervalAcc
\r
146 public Interval instance;
\r
148 public static IntervalAcc operator <(double val, IntervalAcc rng)
\r
150 return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.OPEN, rng.instance.end.val, rng.instance.end.op) };
\r
152 public static IntervalAcc operator <=(double val, IntervalAcc rng)
\r
154 return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.CLOSE, rng.instance.end.val, rng.instance.end.op) };
\r
156 public static IntervalAcc operator >(double val, IntervalAcc rng)
\r
158 return new IntervalAcc { instance = new Interval(rng.instance.begin.val, rng.instance.begin.op, val, Interval.OPERATOR.OPEN) };
\r
160 public static IntervalAcc operator >=(double val, IntervalAcc rng)
\r
162 return new IntervalAcc { instance = new Interval(rng.instance.begin.val, rng.instance.begin.op, val, Interval.OPERATOR.CLOSE) };
\r
164 public static IntervalAcc operator <(IntervalAcc rng, double val)
\r
166 return new IntervalAcc { instance = new Interval(rng.instance.begin.val, rng.instance.begin.op, val, Interval.OPERATOR.OPEN) };
\r
168 public static IntervalAcc operator <=(IntervalAcc rng, double val)
\r
170 return new IntervalAcc { instance = new Interval(rng.instance.begin.val, rng.instance.begin.op, val, Interval.OPERATOR.CLOSE) };
\r
172 public static IntervalAcc operator >(IntervalAcc rng, double val)
\r
174 return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.OPEN, rng.instance.end.val, rng.instance.end.op) };
\r
176 public static IntervalAcc operator >=(IntervalAcc rng, double val)
\r
178 return new IntervalAcc { instance = new Interval(val, Interval.OPERATOR.CLOSE, rng.instance.end.val, rng.instance.end.op) };
\r
181 public static implicit operator Interval(IntervalAcc rhs)
\r
183 return rhs.instance;
\r