-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathratio.h
88 lines (80 loc) · 2.32 KB
/
ratio.h
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
#ifndef COOL_RATIO_H_
#define COOL_RATIO_H_
#include <cstdint>
#include <ostream>
#include <ratio>
///////////////////////////////////////////////////////////////////////////////
// A stream inserter operator for std::ratio
//
// Usage:
// using cool::ratio::operator<<;
// std::cout << std::ratio<1000,1>{} << std::endl; // outputs "kilo"
///////////////////////////////////////////////////////////////////////////////
namespace cool { namespace ratio {
template<intmax_t N, intmax_t D>
std::ostream& operator<<(std::ostream& os, std::ratio<N, D>)
{
if (N == 1)
{
switch (D)
{
#if 0
case 1000000000000000000000000:
return os << "yocto";
case 1000000000000000000000:
return os << "zepto";
#endif
case 1000000000000000000:
return os << "atto";
case 1000000000000000:
return os << "femto";
case 1000000000000:
return os << "pico";
case 1000000000:
return os << "nano";
case 1000000:
return os << "micro";
case 1000:
return os << "milli";
case 100:
return os << "centi";
case 10:
return os << "deci";
default:
break;
}
}
if (D == 1)
{
switch (N)
{
case 10:
return os << "deca";
case 100:
return os << "hecto";
case 1000:
return os << "kilo";
case 1000000:
return os << "mega";
case 1000000000:
return os << "giga";
case 1000000000000:
return os << "tera";
case 1000000000000000:
return os << "peta";
case 1000000000000000000:
return os << "exa";
#if 0
case 1000000000000000000000:
return os << "zetta";
case 1000000000000000000000000:
return os << "yotta";
#endif
default:
break;
}
}
return os << "ratio<" << N << ',' << D << '>';
}
} /* ratio namespace */ } /* cool namespace */
#endif /* COOL_RATIO_H_ */