Line data Source code
1 : /***************************************************************************
2 : *
3 : * The IPPL Framework
4 : *
5 : ***************************************************************************/
6 :
7 : #ifndef TAG_MAKER_H
8 : #define TAG_MAKER_H
9 :
10 : /*
11 : * TagMaker.h - creates tags from a given base tag and a cycle size. New
12 : * tags are generated each time one is requested, by adding an
13 : * integer which varies from 0 ... (cycle size - 1) to the provided
14 : * base tag. Routines exist to establish a base tag and cycle size,
15 : * and to get a new tag for a given base tag.
16 : */
17 :
18 : // include files
19 : #include <map>
20 :
21 : // default cycle size, if not specified by the user
22 : #define DEF_CYCLE_SIZE 1000
23 :
24 : class TagMaker {
25 : public:
26 : // constructor/destructor
27 1628 : TagMaker(void) {}
28 2518 : virtual ~TagMaker(void) {}
29 :
30 : // generate a new tag given a base tag. If the base tag has not been
31 : // previously established by create_base_tag, it will be done so by
32 : // this routine with the default cycle size. A new tag can be established
33 : // at the same time by also giving a cycle size as the second argument.
34 336 : int next_tag(int t, int s = DEF_CYCLE_SIZE) {
35 336 : TagInfo& found = create_base_tag(t, s);
36 336 : found.current = (found.current + 1) % found.cycleSize;
37 336 : return (found.base + found.current);
38 : }
39 :
40 : // determine the tag immediately preceding the current one
41 : // for a given base tag. If the base tag doesn't exist, it will be
42 : // created and the largest possible tag within the cycle will
43 : // be returned.
44 0 : int preceding_tag(int t, int s = DEF_CYCLE_SIZE) {
45 0 : const TagInfo& found = create_base_tag(t, s);
46 0 : if (found.current == 0) {
47 0 : return (found.base + found.cycleSize - 1);
48 : }
49 0 : return (found.base + found.current - 1);
50 : }
51 :
52 : // determine the tag immediately following the current one
53 : // for a given base tag. If the base tag doesn't exist, it will be
54 : // created and the second smallest possible tag within the cycle will
55 : // be returned
56 0 : int following_tag(int t, int s = DEF_CYCLE_SIZE) {
57 0 : const TagInfo& found = create_base_tag(t, s);
58 0 : const int following = (found.current + 1) % found.cycleSize;
59 0 : return (found.base + following);
60 : }
61 :
62 : // just return the `current' tag that is to be generated from the
63 : // given base tag, without incrementing the cycle counter.
64 : int current_tag(int t, int s = DEF_CYCLE_SIZE) {
65 : TagInfo& found = create_base_tag(t, s);
66 : return (found.base + found.current);
67 : }
68 :
69 : // reset the cycle counter for the given tag to be 0. If the tag is
70 : // not in the list, it is added. Returns the reset tag.
71 : int reset_tag(int t, int s = DEF_CYCLE_SIZE) {
72 : TagInfo& found = create_base_tag(t, s);
73 : found.current = 0;
74 : return found.base;
75 : }
76 :
77 : private:
78 : // Simple struct holding info about the cycle size and current tag
79 : // for a base tag
80 : class TagInfo {
81 : public:
82 : int base; // base tag value, the key for the map
83 : int cycleSize; // range through which to cycle tag
84 : int current; // current value of tag
85 : TagInfo(int b, int s)
86 : : base(b)
87 : , cycleSize(s)
88 : , current(0) {}
89 36 : TagInfo()
90 36 : : base(-1)
91 36 : , cycleSize(-1)
92 36 : , current(0) {}
93 : };
94 :
95 : // class used for comparisons
96 : class TagCompare {
97 : public:
98 1272 : bool operator()(const int& x, const int& y) const { return x < y; }
99 : };
100 :
101 : // the list of base tags which have been established
102 : std::map<int, TagInfo, TagCompare> TagList;
103 :
104 : // Establish a new base tag and cycle size. Returns a reference to
105 : // the new TagInfo structure.
106 : // Arguments are: base tag, cycle size.
107 336 : TagInfo& create_base_tag(int t, int s = DEF_CYCLE_SIZE) {
108 336 : TagInfo& found = TagList[t];
109 336 : if (found.base < 0) {
110 36 : found.base = t;
111 36 : found.cycleSize = s;
112 : }
113 336 : return TagList[t];
114 : }
115 : };
116 :
117 : #endif // TAG_MAKER_H
118 :
119 : // vi: set et ts=4 sw=4 sts=4:
120 : // Local Variables:
121 : // mode:c
122 : // c-basic-offset: 4
123 : // indent-tabs-mode: nil
124 : // require-final-newline: nil
125 : // End:
|