1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#include "AggregateValue.h"
#include "../General/Macros.h"
#include <math.h>
@implementation AggregateValue
+ (PajeEntity *)entityWithEntities:(NSArray *)entities
{
return [[[self alloc] initWithEntities:entities] autorelease];
}
- (id)initWithEntities:(NSArray *)entities
{
NSEnumerator *entityEnum;
PajeEntity *entity;
PajeEntity *lastEntity;
NSDate *t1;
NSDate *t2;
double sum = 0;
double min = HUGE_VAL;
double max = -HUGE_VAL;
int ct = 0;
entityEnum = [entities objectEnumerator];
entity = [entityEnum nextObject];
NSParameterAssert(entity != nil);
t1 = [entity startTime];
do {
double v;
v = [entity minValue];
if (v < min) min = v;
v = [entity maxValue];
if (v > max) max = v;
v = [entity doubleValue];
sum += v * [entity duration];
lastEntity = entity;
ct += [entity condensedEntitiesCount];
} while ((entity = [entityEnum nextObject]) != nil);
t2 = [lastEntity endTime];
self = [super initWithType:[lastEntity entityType]
name:@""
container:[lastEntity container]];
if (self != nil) {
Assign(startTime, t1);
Assign(endTime, t2);
value = sum / [t2 timeIntervalSinceDate:t1];
minValue = min;
maxValue = max;
condensedEntitiesCount = ct;
}
return self;
}
- (void)dealloc
{
Assign(startTime, nil);
Assign(endTime, nil);
[super dealloc];
}
- (NSDate *)startTime
{
return startTime;
}
- (NSDate *)endTime
{
if (endTime != nil) {
return endTime;
}
return [container endTime];
}
- (NSDate *)time
{
return startTime;
}
- (void)setEndTime:(NSDate *)time
{
Assign(endTime, time);
}
- (double)doubleValue
{
return value;
}
- (id)value
{
return [NSNumber numberWithDouble:value];
}
- (NSArray *)fieldNames
{
return [[super fieldNames] arrayByAddingObject: @"Value"];
}
- (id)valueOfFieldNamed:(NSString *)fieldName
{
id val;
if ([fieldName isEqualToString:@"Value"]) {
val = [NSNumber numberWithDouble:value];
} else {
val = [super valueOfFieldNamed:fieldName];
}
return val;
}
- (double)maxValue
{
return maxValue;
}
- (double)minValue
{
return minValue;
}
- (BOOL)isAggregate
{
return YES;
}
- (unsigned)condensedEntitiesCount
{
return condensedEntitiesCount;
}
- (NSColor *)xcolor
{
return [NSColor whiteColor];
}
@end
|