Initial commit
[yaffs-website] / node_modules / node-sass / src / libsass / src / paths.hpp
1 #ifndef SASS_PATHS_H
2 #define SASS_PATHS_H
3
4 #include <string>
5 #include <vector>
6 #include <sstream>
7
8
9 template<typename T>
10 std::string vector_to_string(std::vector<T> v)
11 {
12   std::stringstream buffer;
13   buffer << "[";
14
15   if (!v.empty())
16   {  buffer << v[0]; }
17   else
18   { buffer << "]"; }
19
20   if (v.size() == 1)
21   { buffer << "]"; }
22   else
23   {
24     for (size_t i = 1, S = v.size(); i < S; ++i) buffer << ", " << v[i];
25     buffer << "]";
26   }
27
28   return buffer.str();
29 }
30
31 namespace Sass {
32
33
34   template<typename T>
35   std::vector<std::vector<T> > paths(std::vector<std::vector<T> > strata, size_t from_end = 0)
36   {
37     if (strata.empty()) {
38       return std::vector<std::vector<T> >();
39     }
40
41     size_t end = strata.size() - from_end;
42     if (end <= 1) {
43       std::vector<std::vector<T> > starting_points;
44       starting_points.reserve(strata[0].size());
45       for (size_t i = 0, S = strata[0].size(); i < S; ++i) {
46         std::vector<T> starting_point;
47         starting_point.push_back(strata[0][i]);
48         starting_points.push_back(starting_point);
49       }
50       return starting_points;
51     }
52
53     std::vector<std::vector<T> > up_to_here = paths(strata, from_end + 1);
54     std::vector<T>          here       = strata[end-1];
55
56     std::vector<std::vector<T> > branches;
57     branches.reserve(up_to_here.size() * here.size());
58     for (size_t i = 0, S1 = up_to_here.size(); i < S1; ++i) {
59       for (size_t j = 0, S2 = here.size(); j < S2; ++j) {
60         std::vector<T> branch = up_to_here[i];
61         branch.push_back(here[j]);
62         branches.push_back(branch);
63       }
64     }
65
66     return branches;
67   }
68
69 }
70
71 #endif