|
Packit Service |
7770af |
#include "sass.hpp"
|
|
Packit Service |
7770af |
#include "ast.hpp"
|
|
Packit Service |
7770af |
#include "subset_map.hpp"
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
namespace Sass {
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
void Subset_Map::put(const Compound_Selector_Obj& sel, const SubSetMapPair& value)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
if (sel->empty()) throw std::runtime_error("internal error: subset map keys may not be empty");
|
|
Packit Service |
7770af |
size_t index = values_.size();
|
|
Packit Service |
7770af |
values_.push_back(value);
|
|
Packit Service |
7770af |
for (size_t i = 0, S = sel->length(); i < S; ++i)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
hash_[(*sel)[i]].push_back(std::make_pair(sel, index));
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
std::vector<SubSetMapPair> Subset_Map::get_kv(const Compound_Selector_Obj& sel)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
SimpleSelectorDict dict(sel->begin(), sel->end()); // XXX Set
|
|
Packit Service |
7770af |
std::vector<size_t> indices;
|
|
Packit Service |
7770af |
for (size_t i = 0, S = sel->length(); i < S; ++i) {
|
|
Packit Service |
7770af |
if (!hash_.count((*sel)[i])) {
|
|
Packit Service |
7770af |
continue;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
const std::vector<std::pair<Compound_Selector_Obj, size_t> >& subsets = hash_[(*sel)[i]];
|
|
Packit Service |
7770af |
for (const std::pair<Compound_Selector_Obj, size_t>& item : subsets) {
|
|
Packit Service |
7770af |
bool include = true;
|
|
Packit Service |
7770af |
for (const Simple_Selector_Obj& it : item.first->elements()) {
|
|
Packit Service |
7770af |
auto found = dict.find(it);
|
|
Packit Service |
7770af |
if (found == dict.end()) {
|
|
Packit Service |
7770af |
include = false;
|
|
Packit Service |
7770af |
break;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
if (include) indices.push_back(item.second);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
sort(indices.begin(), indices.end());
|
|
Packit Service |
7770af |
std::vector<size_t>::iterator indices_end = unique(indices.begin(), indices.end());
|
|
Packit Service |
7770af |
indices.resize(distance(indices.begin(), indices_end));
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
std::vector<SubSetMapPair> results;
|
|
Packit Service |
7770af |
for (size_t i = 0, S = indices.size(); i < S; ++i) {
|
|
Packit Service |
7770af |
results.push_back(values_[indices[i]]);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
return results;
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
std::vector<SubSetMapPair> Subset_Map::get_v(const Compound_Selector_Obj& sel)
|
|
Packit Service |
7770af |
{
|
|
Packit Service |
7770af |
return get_kv(sel);
|
|
Packit Service |
7770af |
}
|
|
Packit Service |
7770af |
|
|
Packit Service |
7770af |
}
|