Initial commit
[yaffs-website] / node_modules / node-sass / src / libsass / src / units.hpp
1 #ifndef SASS_UNITS_H
2 #define SASS_UNITS_H
3
4 #include <cmath>
5 #include <string>
6 #include <sstream>
7
8 namespace Sass {
9
10   const double PI = std::acos(-1);
11
12   enum UnitClass {
13     LENGTH = 0x000,
14     ANGLE = 0x100,
15     TIME = 0x200,
16     FREQUENCY = 0x300,
17     RESOLUTION = 0x400,
18     INCOMMENSURABLE = 0x500
19   };
20
21   enum UnitType {
22
23     // size units
24     IN = UnitClass::LENGTH,
25     CM,
26     PC,
27     MM,
28     PT,
29     PX,
30
31     // angle units
32     DEG = ANGLE,
33     GRAD,
34     RAD,
35     TURN,
36
37     // time units
38     SEC = TIME,
39     MSEC,
40
41     // frequency units
42     HERTZ = FREQUENCY,
43     KHERTZ,
44
45     // resolutions units
46     DPI = RESOLUTION,
47     DPCM,
48     DPPX,
49
50     // for unknown units
51     UNKNOWN = INCOMMENSURABLE
52
53   };
54
55   extern const double size_conversion_factors[6][6];
56   extern const double angle_conversion_factors[4][4];
57   extern const double time_conversion_factors[2][2];
58   extern const double frequency_conversion_factors[2][2];
59   extern const double resolution_conversion_factors[3][3];
60
61   enum Sass::UnitType string_to_unit(const std::string&);
62   const char* unit_to_string(Sass::UnitType unit);
63   enum Sass::UnitClass get_unit_type(Sass::UnitType unit);
64   std::string get_unit_class(Sass::UnitType unit);
65   std::string unit_to_class(const std::string&);
66   // throws incompatibleUnits exceptions
67   double conversion_factor(const std::string&, const std::string&, bool = true);
68
69   class incompatibleUnits: public std::exception
70   {
71     public:
72       const char* msg;
73       incompatibleUnits(Sass::UnitType a, Sass::UnitType b)
74       : exception()
75       {
76         std::stringstream ss;
77         ss << "Incompatible units: ";
78         ss << "'" << unit_to_string(a) << "' and ";
79         ss << "'" << unit_to_string(b) << "'";
80         // hold on to string on stack!
81         std::string str(ss.str());
82         msg = str.c_str();
83       }
84       virtual const char* what() const throw()
85       {
86         return msg;
87       }
88   };
89
90 }
91
92 #endif