forked from decltypeme/motifate-me
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathduration.cpp
47 lines (44 loc) · 1.43 KB
/
duration.cpp
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
#include "duration.h"
long long int gcd(long long int u, long long int v) {
while ( v != 0) {
unsigned r = u % v;
u = v;
v = r;
}
return u;
}
const duration_t operator+(const duration_t& dur_x, const duration_t& dur_y){
long long k = (1<<dur_y.second) * dur_x.first + (1<<dur_x.second) * dur_y.first;
long long n = (dur_x.first + dur_x.second);
duration_t temp = make_pair(k,n);
return simplify_duration(temp);
}
const duration_t operator-(const duration_t& dur_x, const duration_t& dur_y){
return dur_x + (-dur_y);
}
const duration_t operator-(const duration_t& dur_in){
return make_pair(-dur_in.first, dur_in.second);
}
const duration_t operator*(const duration_t& dur_x, const duration_t& dur_y){
return make_pair(dur_x.first * dur_x.first, dur_x.second + dur_y.second);
}
duration_t& operator+=(duration_t& dest, const duration_t& rhs){
dest = dest + rhs;
return dest;
}
duration_t& operator-=(duration_t& dest, const duration_t& rhs){
return operator-=(dest, -rhs);
}
duration_t& operator*=(duration_t& dest, const duration_t& rhs){
dest = dest * rhs;
return dest;
}
duration_t simplify_duration(duration_t& dur){
long long int num = dur.first;
long long int denom = (long long int)(1) << dur.second;
long long int d = gcd(num, denom);
num /= d;
denom /= d;
dur = make_pair(num, log2(denom));
return dur;
}