To visi_GridCellHisto class: added deleted flag, SumValue
[dyninst.git] / visi / src / datagrid.C
1 /*
2  * Copyright (c) 1993, 1994 Barton P. Miller, Jeff Hollingsworth,
3  *     Bruce Irvin, Jon Cargille, Krishna Kunchithapadam, Karen
4  *     Karavanic, Tia Newhall, Mark Callaghan.  All rights reserved.
5  * 
6  * This software is furnished under the condition that it may not be
7  * provided or otherwise made available to, or used by, any other
8  * person, except as provided for by the terms of applicable license
9  * agreements.  No title to or ownership of the software is hereby
10  * transferred.  The name of the principals may not be used in any
11  * advertising or publicity related to this software without specific,
12  * written prior authorization.  Any use of this software must include
13  * the above copyright notice.
14  *
15  */
16 /* $Log: datagrid.C,v $
17 /* Revision 1.6  1994/05/23 20:56:46  newhall
18 /* To visi_GridCellHisto class: added deleted flag, SumValue
19 /* method function, and fixed AggregateValue method function
20 /*
21  * Revision 1.5  1994/05/11  17:12:44  newhall
22  * changed data values type from double to float
23  * fixed fold method function to support a folding
24  * at any point in the histogram, rather than only
25  * when the histogram is full
26  *
27  * Revision 1.4  1994/03/26  04:19:46  newhall
28  * changed all floats to double
29  * fix problem with null string returned for first resource name
30  *
31  * Revision 1.3  1994/03/17  05:19:59  newhall
32  * changed bucket width and time value's type to double
33  *
34  * Revision 1.2  1994/03/14  20:28:44  newhall
35  * changed visi subdirectory structure
36  *  */ 
37 ///////////////////////////////////////////////
38 // Member functions for the following classes:
39 //  Metric, Resource, visi_GridCellHisto,
40 //  visi_GridHistoArray, visi_DataGrid
41 ///////////////////////////////////////////////
42 #include "visi/h/datagrid.h" 
43
44 Metric::Metric(char *metricUnits,
45                char *metricName,
46                int id,
47                int foldMethod){
48
49   int len;
50
51   if(metricUnits != NULL){
52     len = strlen(metricUnits);
53     units = new char[len + 1];
54     strcpy(units,metricUnits);
55     units[len] = '\0';
56   }
57   else{
58    units = NULL;
59   }
60     if(metricName != NULL){
61     len = strlen(metricName);
62     name  = new char[len + 1];
63     strcpy(name,metricName);
64     name[len] = '\0';
65   }
66   else{
67     name = NULL;
68   }
69   Id    = id;
70   if(foldMethod == AVE)
71     aggregate = foldMethod;
72   else
73     aggregate = SUM;
74 }
75
76 ///////////////////////////////////////////
77 //
78 //  Resource constructor
79 //
80 Resource::Resource(char *resourceName,
81                    int id){
82   int len;
83
84   if(resourceName != NULL){
85     len = strlen(resourceName);
86     name = new char[len+1];
87     strcpy(name,resourceName);
88     name[len] = '\0';
89     Id = id;
90   }
91   else {
92     name = new char[1];
93     name[0] = '\0';
94     Id = -1;
95   }
96 }
97
98
99 ///////////////////////////////////////////
100 //
101 //  visi_GridCellHisto constructor
102 //
103 visi_GridCellHisto::visi_GridCellHisto(int numElements){
104
105  int i;
106     
107  if(numElements > 0){  
108    value = new sampleType[numElements];
109    for(i = 0; i < numElements; i++)
110      value[i] = ERROR;
111    valid      = 1;
112  }
113  deleted = 0;
114  userdata = NULL;
115  size       = numElements;
116  lastBucketFilled = -1;
117 }
118
119 ///////////////////////////////////////////
120 //
121 // constructor for class GridHistoArray
122 //
123 visi_GridHistoArray::visi_GridHistoArray(int numElements){
124
125  if(numElements > 0){  
126    values = new visi_GridCellHisto[numElements];
127  }
128  size = numElements;
129
130 }
131
132
133 //
134 // destructor for class GridHistoArray
135 //
136 visi_GridHistoArray::~visi_GridHistoArray(){
137
138   delete[] values;
139 }
140
141 //
142 // evaluates to true if the grid cell indexed by i (foucus index)
143 // contains a histogram (is a valid metric/focus pair)
144 //
145 int visi_GridHistoArray::Valid(int i){
146
147   if ((i< 0) || (i>= size)){
148     visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_GridHistoArray::Valid");
149     return(ERROR_SUBSCRIPT);  
150   }
151   return(values[i].Valid());
152
153 }
154
155
156 //
157 // invalidates the grid cell indexed by i 
158 //
159 int visi_GridHistoArray::Invalidate(int i){
160
161   if ((i< 0) || (i>= size)){
162     visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_GridHistoArray::Invalidate");
163     return(ERROR_SUBSCRIPT);  
164   }
165   values[i].Invalidate();
166   return(OK);
167 }
168
169
170
171 ///////////////////////////////////////////
172 //
173 // DataGrid constructor: creates metric and 
174 // resource lists and empty datagrid
175 //
176 visi_DataGrid::visi_DataGrid(int noMetrics,
177                              int noResources,
178                              Metric *metricList,
179                              Resource *resourceList,
180                              int noBins,
181                              timeType width){
182 int i;
183
184   numMetrics   = noMetrics;
185   numResources = noResources;
186   metrics      = new Metric[noMetrics];
187   resources    = new Resource[noResources];
188
189   for(i = 0; i < noMetrics; i++){
190     metrics[i].Metric(metricList[i].Units(),metricList[i].Name(),
191                       metricList[i].Identifier(),metricList[i].Aggregate());
192   }
193   for(i = 0; i < noResources; i++){
194     resources[i].Resource(resourceList[i].Name(),resourceList[i].Identifier());
195   }
196
197   data_values = new visi_GridHistoArray[noMetrics];
198   for (i = 0; i < noMetrics; i++)
199     data_values[i].visi_GridHistoArray(noResources);
200   numBins  = noBins;
201   binWidth = width;
202
203 }
204
205
206 //
207 // DataGrid constructor: creates metric and 
208 // resource lists and empty datagrid
209 //
210 visi_DataGrid::visi_DataGrid(int noMetrics,
211                              int noResources,
212                              visi_metricType *metricList,
213                              visi_resourceType *resourceList,
214                              int noBins,
215                              timeType width){
216 int i;
217
218   numMetrics   = noMetrics;
219   numResources = noResources;
220   metrics      = new Metric[noMetrics];
221   resources    = new Resource[noResources];
222
223   for(i = 0; i < noMetrics; i++){
224     metrics[i].Metric(metricList[i].units,metricList[i].name,
225                       metricList[i].Id,metricList[i].aggregate);
226   }
227   for(i = 0; i < noResources; i++){
228     resources[i].Resource(resourceList[i].name,resourceList[i].Id);
229   }
230   data_values = new visi_GridHistoArray[noMetrics];
231   for (i = 0; i < noMetrics; i++)
232     data_values[i].visi_GridHistoArray(noResources);
233   numBins  = noBins;
234   binWidth = width;
235
236 }
237
238
239
240 //
241 //  DataGrid destructor 
242 //
243 visi_DataGrid::~visi_DataGrid(){
244
245   delete[] resources;
246   delete[] metrics;
247   delete[] data_values;
248 }
249
250 // 
251 // returns metric name for metric number i 
252 //
253 char   *visi_DataGrid::MetricName(int i){
254   if((i < numMetrics) && (i>=0))
255     return(metrics[i].Name());
256   return(NULL);
257 }
258
259 // 
260 // returns metric units for metric number i 
261 //
262 char *visi_DataGrid::MetricUnits(int i){
263
264   if((i < numMetrics) && (i>=0))
265     return(metrics[i].Units());
266   return(NULL);
267 }
268
269
270 // 
271 // returns resource name for resource number j 
272 //
273 char     *visi_DataGrid::ResourceName(int j){
274
275   if((j < numResources) && (j>=0))
276     return(resources[j].Name());
277   return(NULL);
278 }
279
280
281 // 
282 //  returns fold method for metric i 
283 //
284 int  visi_DataGrid::FoldMethod(int i){
285
286   if((i < numMetrics) && (i >= 0))
287     return(metrics[i].Aggregate());
288   visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_DataGrid::FoldMethod");
289   return(ERROR_SUBSCRIPT);
290
291 }
292
293 // 
294 // returns metric identifier associated with metric number i 
295 //
296 int  visi_DataGrid::MetricId(int i){
297
298   if((i < numMetrics) && (i >= 0))
299     return(metrics[i].Identifier());
300   visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_DataGrid::MetricId");
301   return(ERROR_SUBSCRIPT);
302 }
303
304 // 
305 // returns resource identifier associated with resource number j 
306 //
307 int  visi_DataGrid::ResourceId(int j){
308
309   if((j < numResources) && (j >= 0))
310     return(resources[j].Identifier());
311   visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_DataGrid::ResourceId");
312   return(ERROR_SUBSCRIPT);
313 }
314
315 //
316 // returns 1 if datagrid element indicated by metric#, resource#
317 // contains histogram values, otherwise returns false
318 //
319 int visi_DataGrid::Valid(int metric, 
320                          int resource){
321
322   if((metric < 0) || (metric >= numMetrics)){
323     visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_HistoDataGrid::Valid");
324     return(ERROR_SUBSCRIPT);
325   }
326   return(data_values[metric].Valid(resource));
327
328 }
329
330 //
331 // invalidates data_grid element indicated by metric#, resource#
332 // sets valid to 0 and frees histogram space 
333 //
334 int visi_DataGrid::Invalidate(int metric,
335                               int resource){
336
337   if((metric < 0) || (metric >= numMetrics)){
338     visi_ErrorHandler(ERROR_SUBSCRIPT,"visi_HistoDataGrid::Invalidate");
339     return(ERROR_SUBSCRIPT);
340   }
341   return(data_values[metric].Invalidate(resource));
342
343 }
344