chiark / gitweb /
Initial checkin - found in davenant:~ian/chiark/things/moebius
[moebius.git] / parameter.hh
1 /*
2  * Parameters library
3  */
4
5 #ifndef PARAMETER_HH
6 #define PARAMETER_HH
7
8 #include <iostream.h>
9
10 class AnyParameter {
11   AnyParameter *next;
12   static AnyParameter *first;
13 protected:
14   const char *name;
15   const char *description;
16   virtual void rangecheck() =0;
17 public:
18   AnyParameter(const char *n, const char *d);
19   virtual void operator ++() =0;
20   virtual void operator --() =0;
21   virtual void operator =(double) =0;
22   static AnyParameter *find(const char *n);
23   static void list();
24 };
25
26 template<class T> class Parameter : AnyParameter {
27   T value, delta, min, max;
28   void rangecheck();
29 public:
30   Parameter(const char *n, const char *d, T i, T de, T mi, T ma);
31   operator T (){ return value; }
32   void operator ++(){ value+= delta; rangecheck(); }
33   void operator --(){ value-= delta; rangecheck(); }
34   void operator =(double v) { value= (T)v; rangecheck(); }
35 };
36
37 template<class T> Parameter<T>::Parameter
38     (const char *n, const char *d, T i, T de, T mi, T ma)
39 : AnyParameter(n,d) {
40   value=i; delta=de; min=mi; max=ma;
41 }
42
43 template<class T> void Parameter<T>::rangecheck() {
44   cerr << name << " ";
45   if (value<min) {
46     value= min;  cerr << "underflowed; ";
47   } else if (value>max) {
48     value= max;  cerr << "overflowed; ";
49   }
50   cerr << "set to " << value << "\n";
51 }
52
53 #endif