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(-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
Units()62     Units() :
63       numerators(),
64       denominators()
65     { }
66     // copy constructor
Units(const Units * ptr)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