1 | #ifndef SASS_UNITS_H |
2 | #define SASS_UNITS_H |
3 | |
4 | #include <cmath> |
5 | #include <string> |
6 | #include <sstream> |
7 | #include <vector> |
8 | |
9 | namespace Sass { |
10 | |
11 | const double PI = std::acos(x: -1); |
12 | |
13 | enum UnitClass { |
14 | LENGTH = 0x000, |
15 | ANGLE = 0x100, |
16 | TIME = 0x200, |
17 | FREQUENCY = 0x300, |
18 | RESOLUTION = 0x400, |
19 | INCOMMENSURABLE = 0x500 |
20 | }; |
21 | |
22 | enum UnitType { |
23 | |
24 | // size units |
25 | IN = UnitClass::LENGTH, |
26 | CM, |
27 | PC, |
28 | MM, |
29 | PT, |
30 | PX, |
31 | |
32 | // angle units |
33 | DEG = ANGLE, |
34 | GRAD, |
35 | RAD, |
36 | TURN, |
37 | |
38 | // time units |
39 | SEC = TIME, |
40 | MSEC, |
41 | |
42 | // frequency units |
43 | HERTZ = FREQUENCY, |
44 | KHERTZ, |
45 | |
46 | // resolutions units |
47 | DPI = RESOLUTION, |
48 | DPCM, |
49 | DPPX, |
50 | |
51 | // for unknown units |
52 | UNKNOWN = INCOMMENSURABLE |
53 | |
54 | }; |
55 | |
56 | class Units { |
57 | public: |
58 | sass::vector<sass::string> numerators; |
59 | sass::vector<sass::string> denominators; |
60 | public: |
61 | // default constructor |
62 | Units() : |
63 | numerators(), |
64 | denominators() |
65 | { } |
66 | // copy constructor |
67 | Units(const Units* ptr) : |
68 | numerators(ptr->numerators), |
69 | denominators(ptr->denominators) |
70 | { } |
71 | // convert to string |
72 | sass::string unit() const; |
73 | // get if units are empty |
74 | bool is_unitless() const; |
75 | // return if valid for css |
76 | bool is_valid_css_unit() const; |
77 | // reduce units for output |
78 | // returns conversion factor |
79 | double reduce(); |
80 | // normalize units for compare |
81 | // returns conversion factor |
82 | double normalize(); |
83 | // compare operations |
84 | bool operator< (const Units& rhs) const; |
85 | bool operator== (const Units& rhs) const; |
86 | bool operator!= (const Units& rhs) const; |
87 | // factor to convert into given units |
88 | double convert_factor(const Units&) const; |
89 | }; |
90 | |
91 | extern const double size_conversion_factors[6][6]; |
92 | extern const double angle_conversion_factors[4][4]; |
93 | extern const double time_conversion_factors[2][2]; |
94 | extern const double frequency_conversion_factors[2][2]; |
95 | extern const double resolution_conversion_factors[3][3]; |
96 | |
97 | UnitType get_main_unit(const UnitClass unit); |
98 | enum Sass::UnitType string_to_unit(const sass::string&); |
99 | const char* unit_to_string(Sass::UnitType unit); |
100 | enum Sass::UnitClass get_unit_type(Sass::UnitType unit); |
101 | sass::string get_unit_class(Sass::UnitType unit); |
102 | sass::string unit_to_class(const sass::string&); |
103 | // throws incompatibleUnits exceptions |
104 | double conversion_factor(const sass::string&, const sass::string&); |
105 | double conversion_factor(UnitType, UnitType, UnitClass, UnitClass); |
106 | double convert_units(const sass::string&, const sass::string&, int&, int&); |
107 | |
108 | } |
109 | |
110 | #endif |
111 | |