3 // Bug: unification fails for call to find_parameter_in_stack.
8 const int max_stack_size = 20;
13 T objects[max_stack_size];
16 Stack(): nobjects(0) {}
17 void push(const T&a) {
18 if (nobjects >= max_stack_size) {
19 fprintf(stderr,"Stack: overflow\n");
22 objects[nobjects++] = a;
26 fprintf(stderr,"Stack: underflow\n");
30 T result = objects[nobjects];
35 fprintf(stderr,"Stack: underflow\n");
38 return objects[nobjects - 1];
40 int n() const { return nobjects; }
41 T operator[](int i) { return objects[i]; }
50 Parameter(): is_set_(0), overrides_(0) {}
51 void set(const T& a) { parameter_ = a; is_set_ = 1; }
52 void override(int overrides = 1) { overrides_ = overrides; }
53 const T& value() const { return parameter_; }
54 int overrides() const { return overrides_; }
55 int is_set() const { return is_set_; }
58 template <class T1, class T2>
60 find_parameter_in_stack(Stack<T1>& stack, Parameter<T2>& (T1::*access)())
64 for (int i=stack.n()-1; i>=0; i--) {
65 if ((stack[i].*access)().is_set()) {
66 if (!have_result || (stack[i].*access)().overrides()) {
67 result = (stack[i].*access)().value();
80 Parameter<int>& a() { return a_; }
94 int val = find_parameter_in_stack(A_stack, &A::a);
96 printf("val = %d\n", val);
108 val = find_parameter_in_stack(A_stack, &A::a);
110 printf("val = %d\n", val);