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