Changes having to due with my new 2-pass function relocator code.
[dyninst.git] / pdutil / h / odometer.h
1 /*
2  * Copyright (c) 1996 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 // odometer.h
43
44 #ifndef _ODOMETER_H_
45 #define _ODOMETER_H_
46
47 #include "util/h/Vector.h"
48
49 class odometer {
50  private:
51    vector<unsigned> digitRanges;
52       // the number of elements in digit index <n> is digitRanges[n];
53       // the values that digit index <n> can take on are from 0
54       // to (digitRanges[n]-1), inclusive.
55
56    vector<unsigned> currValue;
57    // note: for both of the above arrays, index 0 represents the _least_
58    //       significant digit in the odometer; index <maxindex-1> represents
59    //       the _most_ significant digit in the odometer.
60
61  public:
62    odometer(vector<unsigned> &iDigitRanges);
63    odometer(const odometer &) {}
64   ~odometer() {}
65
66    odometer &operator=(const odometer &src) {
67       digitRanges = src.digitRanges;
68       currValue = src.currValue;
69       return *this;
70    }
71
72    unsigned numDigits() const {return digitRanges.size();}
73    bool done() const;
74
75    unsigned getDigit(unsigned index) const {
76       // note: 0 is the _least_ significant digit in the odometer;
77       //       the _most_ significant digit is <numDigits()-1>
78       assert(currValue[index] < digitRanges[index]);
79       return currValue[index];
80    }
81    unsigned operator[](unsigned index) const {
82       return getDigit(index);
83    }
84
85    void add1();
86    odometer &operator++() {
87       // prefix: add then return
88       add1();
89       return *this;
90    }
91    odometer operator++(int) {
92       // postfix: add but return old value
93       odometer result = *this;
94       add1();
95       return result;
96    }
97 };
98
99 #endif