24 { r.depth } -> std::convertible_to<int>;
25 { r.skipCount } -> std::convertible_to<int>;
26 { r.isOpen } -> std::convertible_to<bool>;
27 { r.ancestorLineMask } -> std::convertible_to<uint32_t>;
28 { r.isLastSibling } -> std::convertible_to<bool>;
37 const int n =
static_cast<int>(rows.size());
38 for (
int i = 0; i < n; i++)
40 const int D = rows[i].depth;
43 while (j < n && rows[j].depth > D) j++;
44 rows[i].skipCount = j - i - 1;
47 for (
int d = 0; d <= D - 2 && d < 32; d++)
49 const int target = d + 1;
50 for (
int k = i + 1; k < n; k++)
52 if (rows[k].depth < target)
break;
53 if (rows[k].depth == target) { mask |= (1u << d);
break; }
56 rows[i].ancestorLineMask = mask;
59 for (
int k = i + 1; k < n; k++)
61 if (rows[k].depth < D)
break;
62 if (rows[k].depth == D) { last =
false;
break; }
64 rows[i].isLastSibling = last;
76 const int n =
static_cast<int>(rows.size());
77 if (srcDs < 0 || srcDs >= n)
return -1;
78 if (dstDs < 0 || dstDs >= n)
return -1;
79 if (srcDs == dstDs)
return -1;
81 const int srcStart = srcDs;
82 const int srcSliceCount = 1 + rows[srcStart].skipCount;
83 const int srcEnd = srcStart + srcSliceCount;
86 if (dstDs >= srcStart && dstDs < srcEnd)
return -1;
88 int targetBaseDepth = rows[dstDs].depth;
94 targetBaseDepth = rows[dstDs].depth;
99 targetBaseDepth = rows[dstDs].depth + 1;
100 rows[dstDs].isOpen =
true;
104 insertAt = dstDs + 1 + rows[dstDs].skipCount;
105 targetBaseDepth = rows[dstDs].depth + 1;
106 rows[dstDs].isOpen =
true;
109 insertAt = dstDs + 1 + rows[dstDs].skipCount;
110 targetBaseDepth = rows[dstDs].depth;
116 const int srcBaseDepth = rows[srcStart].depth;
117 const int deltaDepth = targetBaseDepth - srcBaseDepth;
118 std::vector<Row> lifted;
119 lifted.reserve(srcSliceCount);
120 lifted.insert(lifted.end(),
121 std::make_move_iterator(rows.begin() + srcStart),
122 std::make_move_iterator(rows.begin() + srcEnd));
124 for (
auto& r : lifted) r.depth += deltaDepth;
126 rows.erase(rows.begin() + srcStart, rows.begin() + srcEnd);
127 if (insertAt > srcStart) insertAt -= srcSliceCount;
128 rows.insert(rows.begin() + insertAt,
129 std::make_move_iterator(lifted.begin()),
130 std::make_move_iterator(lifted.end()));