Skip to content

Commit bc1dda5

Browse files
committed
Move Number implementation out of header file
1 parent 9ad775f commit bc1dda5

File tree

2 files changed

+114
-101
lines changed

2 files changed

+114
-101
lines changed

ast.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,114 @@ namespace Sass {
589589
return result;
590590
}*/
591591

592+
Number::Number(ParserState pstate, double val, string u, bool zero)
593+
: Expression(pstate),
594+
value_(val),
595+
zero_(zero),
596+
numerator_units_(vector<string>()),
597+
denominator_units_(vector<string>()),
598+
hash_(0)
599+
{
600+
if (!u.empty()) numerator_units_.push_back(u);
601+
concrete_type(NUMBER);
602+
}
603+
604+
string Number::unit() const
605+
{
606+
stringstream u;
607+
for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
608+
if (i) u << '*';
609+
u << numerator_units_[i];
610+
}
611+
if (!denominator_units_.empty()) u << '/';
612+
for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
613+
if (i) u << '*';
614+
u << denominator_units_[i];
615+
}
616+
return u.str();
617+
}
618+
619+
bool Number::is_unitless()
620+
{ return numerator_units_.empty() && denominator_units_.empty(); }
621+
622+
void Number::normalize(string to)
623+
{
624+
// (multiple passes because I'm too tired to think up something clever)
625+
// Find a unit to convert everything to, if one isn't provided.
626+
if (to.empty()) {
627+
for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
628+
string u(numerator_units_[i]);
629+
if (string_to_unit(u) == INCOMMENSURABLE) {
630+
continue;
631+
}
632+
else {
633+
to = u;
634+
break;
635+
}
636+
}
637+
}
638+
if (to.empty()) {
639+
for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
640+
string u(denominator_units_[i]);
641+
if (string_to_unit(u) == INCOMMENSURABLE) {
642+
continue;
643+
}
644+
else {
645+
to = u;
646+
break;
647+
}
648+
}
649+
}
650+
// Now loop through again and do all the conversions.
651+
for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
652+
string from(numerator_units_[i]);
653+
if (string_to_unit(from) == INCOMMENSURABLE) continue;
654+
value_ *= conversion_factor(from, to);
655+
numerator_units_[i] = to;
656+
}
657+
for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
658+
string from(denominator_units_[i]);
659+
if (string_to_unit(from) == INCOMMENSURABLE) continue;
660+
value_ /= conversion_factor(from, to);
661+
denominator_units_[i] = to;
662+
}
663+
// Now divide out identical units in the numerator and denominator.
664+
vector<string> ncopy;
665+
ncopy.reserve(numerator_units_.size());
666+
for (vector<string>::iterator n = numerator_units_.begin();
667+
n != numerator_units_.end();
668+
++n) {
669+
vector<string>::iterator d = find(denominator_units_.begin(),
670+
denominator_units_.end(),
671+
*n);
672+
if (d != denominator_units_.end()) {
673+
denominator_units_.erase(d);
674+
}
675+
else {
676+
ncopy.push_back(*n);
677+
}
678+
}
679+
numerator_units_ = ncopy;
680+
// Sort the units to make them pretty and, well, normal.
681+
sort(numerator_units_.begin(), numerator_units_.end());
682+
sort(denominator_units_.begin(), denominator_units_.end());
683+
}
684+
685+
// useful for making one number compatible with another
686+
string Number::find_convertible_unit() const
687+
{
688+
for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
689+
string u(numerator_units_[i]);
690+
if (string_to_unit(u) != INCOMMENSURABLE) return u;
691+
}
692+
for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
693+
string u(denominator_units_[i]);
694+
if (string_to_unit(u) != INCOMMENSURABLE) return u;
695+
}
696+
return string();
697+
}
698+
699+
592700
Expression* Hashed::at(Expression* k) const
593701
{
594702
if (elements_.count(k))

ast.hpp

Lines changed: 6 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,113 +1161,18 @@ namespace Sass {
11611161
vector<string> denominator_units_;
11621162
size_t hash_;
11631163
public:
1164-
Number(ParserState pstate, double val, string u = "", bool zero = true)
1165-
: Expression(pstate),
1166-
value_(val),
1167-
zero_(zero),
1168-
numerator_units_(vector<string>()),
1169-
denominator_units_(vector<string>()),
1170-
hash_(0)
1171-
{
1172-
if (!u.empty()) numerator_units_.push_back(u);
1173-
concrete_type(NUMBER);
1174-
}
1164+
Number(ParserState pstate, double val, string u = "", bool zero = true);
11751165
bool zero() { return zero_; }
11761166
vector<string>& numerator_units() { return numerator_units_; }
11771167
vector<string>& denominator_units() { return denominator_units_; }
11781168
string type() { return "number"; }
11791169
static string type_name() { return "number"; }
1180-
string unit() const
1181-
{
1182-
stringstream u;
1183-
for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
1184-
if (i) u << '*';
1185-
u << numerator_units_[i];
1186-
}
1187-
if (!denominator_units_.empty()) u << '/';
1188-
for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
1189-
if (i) u << '*';
1190-
u << denominator_units_[i];
1191-
}
1192-
return u.str();
1193-
}
1194-
bool is_unitless()
1195-
{ return numerator_units_.empty() && denominator_units_.empty(); }
1196-
void normalize(string to = "")
1197-
{
1198-
// (multiple passes because I'm too tired to think up something clever)
1199-
// Find a unit to convert everything to, if one isn't provided.
1200-
if (to.empty()) {
1201-
for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
1202-
string u(numerator_units_[i]);
1203-
if (string_to_unit(u) == INCOMMENSURABLE) {
1204-
continue;
1205-
}
1206-
else {
1207-
to = u;
1208-
break;
1209-
}
1210-
}
1211-
}
1212-
if (to.empty()) {
1213-
for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
1214-
string u(denominator_units_[i]);
1215-
if (string_to_unit(u) == INCOMMENSURABLE) {
1216-
continue;
1217-
}
1218-
else {
1219-
to = u;
1220-
break;
1221-
}
1222-
}
1223-
}
1224-
// Now loop through again and do all the conversions.
1225-
for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
1226-
string from(numerator_units_[i]);
1227-
if (string_to_unit(from) == INCOMMENSURABLE) continue;
1228-
value_ *= conversion_factor(from, to);
1229-
numerator_units_[i] = to;
1230-
}
1231-
for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
1232-
string from(denominator_units_[i]);
1233-
if (string_to_unit(from) == INCOMMENSURABLE) continue;
1234-
value_ /= conversion_factor(from, to);
1235-
denominator_units_[i] = to;
1236-
}
1237-
// Now divide out identical units in the numerator and denominator.
1238-
vector<string> ncopy;
1239-
ncopy.reserve(numerator_units_.size());
1240-
for (vector<string>::iterator n = numerator_units_.begin();
1241-
n != numerator_units_.end();
1242-
++n) {
1243-
vector<string>::iterator d = find(denominator_units_.begin(),
1244-
denominator_units_.end(),
1245-
*n);
1246-
if (d != denominator_units_.end()) {
1247-
denominator_units_.erase(d);
1248-
}
1249-
else {
1250-
ncopy.push_back(*n);
1251-
}
1252-
}
1253-
numerator_units_ = ncopy;
1254-
// Sort the units to make them pretty and, well, normal.
1255-
sort(numerator_units_.begin(), numerator_units_.end());
1256-
sort(denominator_units_.begin(), denominator_units_.end());
1257-
}
1170+
string unit() const;
1171+
1172+
bool is_unitless();
1173+
void normalize(string to = "");
12581174
// useful for making one number compatible with another
1259-
string find_convertible_unit() const
1260-
{
1261-
for (size_t i = 0, S = numerator_units_.size(); i < S; ++i) {
1262-
string u(numerator_units_[i]);
1263-
if (string_to_unit(u) != INCOMMENSURABLE) return u;
1264-
}
1265-
for (size_t i = 0, S = denominator_units_.size(); i < S; ++i) {
1266-
string u(denominator_units_[i]);
1267-
if (string_to_unit(u) != INCOMMENSURABLE) return u;
1268-
}
1269-
return string();
1270-
}
1175+
string find_convertible_unit() const;
12711176

12721177
virtual bool operator==(Expression& rhs) const
12731178
{

0 commit comments

Comments
 (0)