17 #include <util/kdevvarlengtharray.h>
20 #include <serialization/itemrepository.h>
21 #include <serialization/indexedstring.h>
28 #ifdef DEBUG_SETREPOSITORY
36 #ifndef DEBUG_SETREPOSITORY
37 #define CHECK_SPLIT_POSITION(Node)
39 #define CHECK_SPLIT_POSITION(node) Q_ASSERT(!(node).leftNode || \
40 (getLeftNode(&node)->end() <= \
41 splitPositionForRange((node).start, \
43 getRightNode(&node)->start() >= \
44 splitPositionForRange((node).start, (node).end)))
68 if (end - start == 1) {
74 uint position = ((end - 1) >> splitBit) << splitBit;
75 if (position > start && position < end)
90 class SetNodeDataRequest;
92 #define getLeftNode(node) repository.itemFromIndex(node->leftNode())
93 #define getRightNode(node) repository.itemFromIndex(node->rightNode())
94 #define nodeFromIndex(index) repository.itemFromIndex(index)
95 struct SetRepositoryAlgorithms
97 SetRepositoryAlgorithms(SetDataRepository& _repository,
98 BasicSetRepository* _setRepository) : repository(_repository)
99 , setRepository(_setRepository)
104 Index count(
const SetNodeData* node)
const;
106 void localCheck(
const SetNodeData* node);
108 void check(uint node);
110 void check(
const SetNodeData* node);
112 QString shortLabel(
const SetNodeData& node)
const;
114 uint set_union(uint firstNode, uint secondNode,
const SetNodeData* first,
const SetNodeData* second,
115 uchar splitBit = 31);
116 uint createSetFromNodes(uint leftNode, uint rightNode,
const SetNodeData* left =
nullptr,
117 const SetNodeData* right =
nullptr);
118 uint computeSetFromNodes(uint leftNode, uint rightNode,
const SetNodeData* left,
const SetNodeData* right,
120 uint set_intersect(uint firstNode, uint secondNode,
const SetNodeData* first,
const SetNodeData* second,
121 uchar splitBit = 31);
122 bool set_contains(
const SetNodeData* node,
Index index);
123 uint set_subtract(uint firstNode, uint secondNode,
const SetNodeData* first,
const SetNodeData* second,
124 uchar splitBit = 31);
127 bool set_equals(
const SetNodeData* lhs,
const SetNodeData* rhs);
129 QString dumpDotGraph(uint node)
const;
132 uint setForIndices(std::vector<uint>::const_iterator begin, std::vector<uint>::const_iterator end,
137 uint startIndex = *begin;
138 uint endIndex = *(end - 1) + 1;
140 if (endIndex == startIndex + 1) {
141 SetNodeData data(startIndex, endIndex);
143 return repository.index(SetNodeDataRequest(&data, repository, setRepository));
149 auto splitIterator = std::lower_bound(begin, end, split);
152 Q_ASSERT(*(splitIterator - 1) < split);
154 return createSetFromNodes(setForIndices(begin, splitIterator, splitBit),
155 setForIndices(splitIterator, end, splitBit));
159 QString dumpDotGraphInternal(uint node,
bool master =
false)
const;
161 SetDataRepository& repository;
162 BasicSetRepository* setRepository;
167 auto&
repository(static_cast<SetDataRepository&>(_repository));
187 , m_hash(_data->hash())
188 , repository(_repository)
189 , setRepository(_setRepository)
218 #ifdef DEBUG_SETREPOSITORY
228 for (uint a = item->
start(); a < item->
end(); ++a)
252 if (!m_repository || !m_tree)
256 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
257 return alg.count(m_repository->m_dataRepository.itemFromIndex(m_tree));
261 , m_repository(repository)
267 m_repository = rhs.m_repository;
273 m_repository = rhs.m_repository;
280 if (!m_repository || !m_tree)
285 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
286 return alg.dumpDotGraph(m_tree);
297 void SetRepositoryAlgorithms::localCheck(
const SetNodeData*
ifDebug(node))
307 void SetRepositoryAlgorithms::check(uint node)
315 void SetRepositoryAlgorithms::check(
const SetNodeData* node)
318 if (node->leftNode())
320 if (node->rightNode())
325 QString SetRepositoryAlgorithms::shortLabel(
const SetNodeData& node)
const
327 return QStringLiteral(
"n%1_%2").
arg(node.start()).arg(node.end());
330 QString SetRepositoryAlgorithms::dumpDotGraphInternal(uint nodeIndex,
bool master)
const
333 return QStringLiteral(
"empty node");
335 const SetNodeData& node(*repository.itemFromIndex(nodeIndex));
337 QString color = QStringLiteral(
"blue");
339 color = QStringLiteral(
"red");
341 QString label = QStringLiteral(
"%1 -> %2").
arg(node.start()).arg(node.end());
342 if (!node.contiguous())
345 QString ret = QStringLiteral(
"%1[label=\"%2\", color=\"%3\"];\n").
arg(shortLabel(node), label, color);
347 if (node.leftNode()) {
348 const SetNodeData& left(*repository.itemFromIndex(node.leftNode()));
349 const SetNodeData& right(*repository.itemFromIndex(node.rightNode()));
351 ret += QStringLiteral(
"%1 -> %2;\n").
arg(shortLabel(node), shortLabel(left));
352 ret += QStringLiteral(
"%1 -> %2;\n").
arg(shortLabel(node), shortLabel(right));
353 ret += dumpDotGraphInternal(node.leftNode());
354 ret += dumpDotGraphInternal(node.rightNode());
360 QString SetRepositoryAlgorithms::dumpDotGraph(uint nodeIndex)
const
362 QString ret = QStringLiteral(
"digraph Repository {\n");
363 ret += dumpDotGraphInternal(nodeIndex,
true);
376 nodeStack = nodeStackData.data();
380 : nodeStackData(rhs.nodeStackData)
381 , nodeStackSize(rhs.nodeStackSize)
382 , currentIndex(rhs.currentIndex)
385 nodeStack = nodeStackData.data();
390 nodeStackData = rhs.nodeStackData;
391 nodeStackSize = rhs.nodeStackSize;
392 currentIndex = rhs.currentIndex;
394 nodeStack = nodeStackData.data();
399 void resizeNodeStack()
401 nodeStackData.resize(nodeStackSize + 1);
402 nodeStack = nodeStackData.data();
405 KDevVarLengthArray<const SetNodeData*, nodeStackAlloc> nodeStackData;
407 int nodeStackSize = 0;
408 Index currentIndex = 0;
417 currentIndex = node->
start();
420 nodeStack[nodeStackSize++] = node;
429 Q_ASSERT(currentIndex >= nodeStack[0]->start());
439 Q_ASSERT(ret.find(*it) == ret.end());
447 Set::Iterator::Iterator(
const Iterator& rhs)
448 : d_ptr(new
Set::IteratorPrivate(*rhs.d_ptr))
458 Set::Iterator::Iterator()
459 : d_ptr(new Set::IteratorPrivate)
463 Set::Iterator::~Iterator() =
default;
465 Set::Iterator::operator bool()
const
469 return d->nodeStackSize;
478 if (d->repository->m_mutex)
479 d->repository->m_mutex->lock();
484 if (d->currentIndex >= d->nodeStack[d->nodeStackSize - 1]->end()) {
486 while (d->nodeStackSize && d->currentIndex >= d->nodeStack[d->nodeStackSize - 1]->end()) {
490 if (!d->nodeStackSize) {
495 ifDebug(
const SetNodeData& left =
496 *d->repository->m_dataRepository.itemFromIndex(
497 d->nodeStack[d->nodeStackSize - 1]->leftNode());
Q_ASSERT(left.end == d->currentIndex); )
499 const SetNodeData& right = *d->repository->m_dataRepository.itemFromIndex(
500 d->nodeStack[d->nodeStackSize - 1]->rightNode());
502 d->startAtNode(&right);
506 Q_ASSERT(d->nodeStackSize == 0 || d->currentIndex < d->nodeStack[0]->end());
508 if (d->repository->m_mutex)
509 d->repository->m_mutex->unlock();
518 return d->currentIndex;
523 if (!m_tree || !m_repository)
529 ret.d_ptr->repository = m_repository;
532 ret.d_ptr->startAtNode(m_repository->m_dataRepository.itemFromIndex(m_tree));
537 uint SetRepositoryAlgorithms::createSetFromNodes(uint leftNode, uint rightNode,
const SetNodeData* left,
538 const SetNodeData* right)
545 Q_ASSERT(left->end() <= right->start());
547 SetNodeData set(left->start(), right->end(), leftNode, rightNode);
551 uint ret = repository.index(SetNodeDataRequest(&set, repository, setRepository));
552 Q_ASSERT(set.leftNode() >= 0x10000);
553 Q_ASSERT(set.rightNode() >= 0x10000);
554 Q_ASSERT(ret == repository.findIndex(SetNodeDataRequest(&set, repository, setRepository)));
561 uint SetRepositoryAlgorithms::computeSetFromNodes(uint leftNode, uint rightNode,
const SetNodeData* left,
562 const SetNodeData* right, uchar splitBit)
564 Q_ASSERT(left->end() <= right->start());
569 if (splitPosition < left->end()) {
571 uint leftLeftNode = left->leftNode();
572 uint leftRightNode = left->rightNode();
574 const SetNodeData* leftLeft = this->
getLeftNode(left);
575 const SetNodeData* leftRight = this->
getRightNode(left);
577 Q_ASSERT(splitPosition >= leftLeft->end() && splitPosition <= leftRight->start());
580 uint newRightNode = computeSetFromNodes(leftRightNode, rightNode, leftRight, right, splitBit);
582 return createSetFromNodes(leftLeftNode, newRightNode, leftLeft);
583 }
else if (splitPosition > right->start()) {
585 uint rightLeftNode = right->leftNode();
586 uint rightRightNode = right->rightNode();
588 const SetNodeData* rightLeft = this->
getLeftNode(right);
589 const SetNodeData* rightRight = this->
getRightNode(right);
591 Q_ASSERT(splitPosition >= rightLeft->end() && splitPosition <= rightRight->start());
594 uint newLeftNode = computeSetFromNodes(leftNode, rightLeftNode, left, rightLeft, splitBit);
596 return createSetFromNodes(newLeftNode, rightRightNode,
nullptr, rightRight);
598 return createSetFromNodes(leftNode, rightNode, left, right);
602 uint SetRepositoryAlgorithms::set_union(uint firstNode, uint secondNode,
const SetNodeData* first,
603 const SetNodeData* second, uchar splitBit)
605 if (firstNode == secondNode)
608 uint firstStart = first->start(), secondEnd = second->end();
610 if (firstStart >= secondEnd)
611 return computeSetFromNodes(secondNode, firstNode, second, first, splitBit);
613 uint firstEnd = first->end(), secondStart = second->start();
615 if (secondStart >= firstEnd)
616 return computeSetFromNodes(firstNode, secondNode, first, second, splitBit);
620 uint newStart = firstStart < secondStart ? firstStart : secondStart;
621 uint newEnd = firstEnd > secondEnd ? firstEnd : secondEnd;
629 if (splitPosition > firstStart && splitPosition < firstEnd && splitPosition > secondStart &&
630 splitPosition < secondEnd) {
633 uint firstLeftNode = first->leftNode();
634 uint firstRightNode = first->rightNode();
635 uint secondLeftNode = second->leftNode();
636 uint secondRightNode = second->rightNode();
638 const SetNodeData* firstLeft = repository.itemFromIndex(firstLeftNode);
639 const SetNodeData* firstRight = repository.itemFromIndex(firstRightNode);
640 const SetNodeData* secondLeft = repository.itemFromIndex(secondLeftNode);
641 const SetNodeData* secondRight = repository.itemFromIndex(secondRightNode);
643 Q_ASSERT(splitPosition >= firstLeft->end() && splitPosition <= firstRight->start());
644 Q_ASSERT(splitPosition >= secondLeft->end() && splitPosition <= secondRight->start());
646 return createSetFromNodes(set_union(firstLeftNode, secondLeftNode, firstLeft, secondLeft, splitBit),
647 set_union(firstRightNode, secondRightNode, firstRight, secondRight, splitBit));
648 }
else if (splitPosition > firstStart && splitPosition < firstEnd) {
649 uint firstLeftNode = first->leftNode();
650 uint firstRightNode = first->rightNode();
652 const SetNodeData* firstLeft = repository.itemFromIndex(firstLeftNode);
653 const SetNodeData* firstRight = repository.itemFromIndex(firstRightNode);
655 Q_ASSERT(splitPosition >= firstLeft->end() && splitPosition <= firstRight->start());
660 if (secondEnd <= splitPosition) {
661 return createSetFromNodes(set_union(firstLeftNode, secondNode, firstLeft, second,
662 splitBit), firstRightNode,
nullptr, firstRight);
664 Q_ASSERT(secondStart >= splitPosition);
665 return createSetFromNodes(firstLeftNode, set_union(firstRightNode, secondNode, firstRight, second,
666 splitBit), firstLeft);
668 }
else if (splitPosition > secondStart && splitPosition < secondEnd) {
669 uint secondLeftNode = second->leftNode();
670 uint secondRightNode = second->rightNode();
672 const SetNodeData* secondLeft = repository.itemFromIndex(secondLeftNode);
673 const SetNodeData* secondRight = repository.itemFromIndex(secondRightNode);
675 Q_ASSERT(splitPosition >= secondLeft->end() && splitPosition <= secondRight->start());
677 if (firstEnd <= splitPosition) {
678 return createSetFromNodes(set_union(secondLeftNode, firstNode, secondLeft, first,
679 splitBit), secondRightNode,
nullptr, secondRight);
681 Q_ASSERT(firstStart >= splitPosition);
682 return createSetFromNodes(secondLeftNode, set_union(secondRightNode, firstNode, secondRight, first,
683 splitBit), secondLeft);
687 ifDebug(uint test = repository.findIndex(SetNodeDataRequest(first, repository, setRepository)); qCDebug(
688 LANGUAGE) <<
"found index:" << test; )
694 bool SetRepositoryAlgorithms::set_equals(
const SetNodeData* lhs,
const SetNodeData* rhs)
696 if (lhs->leftNode() != rhs->leftNode() || lhs->rightNode() != rhs->rightNode())
702 uint SetRepositoryAlgorithms::set_intersect(uint firstNode, uint secondNode,
const SetNodeData* first,
703 const SetNodeData* second, uchar splitBit)
705 if (firstNode == secondNode)
708 if (first->start() >= second->end())
711 if (second->start() >= first->end())
715 uint firstStart = first->start(), firstEnd = first->end(), secondStart = second->start(), secondEnd = second->end();
717 uint newStart = firstStart < secondStart ? firstStart : secondStart;
718 uint newEnd = firstEnd > secondEnd ? firstEnd : secondEnd;
726 if (splitPosition > firstStart && splitPosition < firstEnd && splitPosition > secondStart &&
727 splitPosition < secondEnd) {
730 uint firstLeftNode = first->leftNode();
731 uint firstRightNode = first->rightNode();
733 uint secondLeftNode = second->leftNode();
734 uint secondRightNode = second->rightNode();
736 const SetNodeData* firstLeft = repository.itemFromIndex(firstLeftNode);
737 const SetNodeData* firstRight = repository.itemFromIndex(firstRightNode);
738 const SetNodeData* secondLeft = repository.itemFromIndex(secondLeftNode);
739 const SetNodeData* secondRight = repository.itemFromIndex(secondRightNode);
741 Q_ASSERT(splitPosition >= firstLeft->end() && splitPosition <= firstRight->start());
742 Q_ASSERT(splitPosition >= secondLeft->end() && splitPosition <= secondRight->start());
744 uint newLeftNode = set_intersect(firstLeftNode, secondLeftNode, firstLeft, secondLeft, splitBit);
745 uint newRightNode = set_intersect(firstRightNode, secondRightNode, firstRight, secondRight, splitBit);
747 if (newLeftNode && newRightNode)
748 return createSetFromNodes(newLeftNode, newRightNode);
749 else if (newLeftNode)
753 }
else if (splitPosition > firstStart && splitPosition < firstEnd) {
754 uint firstLeftNode = first->leftNode();
755 uint firstRightNode = first->rightNode();
757 const SetNodeData* firstLeft = repository.itemFromIndex(firstLeftNode);
758 const SetNodeData* firstRight = repository.itemFromIndex(firstRightNode);
760 Q_ASSERT(splitPosition >= firstLeft->end() && splitPosition <= firstRight->start());
765 if (secondEnd <= splitPosition) {
766 return set_intersect(firstLeftNode, secondNode, firstLeft, second, splitBit);
768 Q_ASSERT(secondStart >= splitPosition);
769 return set_intersect(firstRightNode, secondNode, firstRight, second, splitBit);
771 }
else if (splitPosition > secondStart && splitPosition < secondEnd) {
772 uint secondLeftNode = second->leftNode();
773 uint secondRightNode = second->rightNode();
775 const SetNodeData* secondLeft = repository.itemFromIndex(secondLeftNode);
776 const SetNodeData* secondRight = repository.itemFromIndex(secondRightNode);
778 Q_ASSERT(splitPosition >= secondLeft->end() && splitPosition <= secondRight->start());
780 if (firstEnd <= splitPosition) {
781 return set_intersect(secondLeftNode, firstNode, secondLeft, first, splitBit);
783 Q_ASSERT(firstStart >= splitPosition);
784 return set_intersect(secondRightNode, firstNode, secondRight, first, splitBit);
794 bool SetRepositoryAlgorithms::set_contains(
const SetNodeData* node,
Index index)
797 if (node->start() > index || node->end() <= index)
800 if (node->contiguous())
803 const SetNodeData* leftNode =
nodeFromIndex(node->leftNode());
805 if (index < leftNode->end())
808 const SetNodeData* rightNode =
nodeFromIndex(node->rightNode());
816 uint SetRepositoryAlgorithms::set_subtract(uint firstNode, uint secondNode,
const SetNodeData* first,
817 const SetNodeData* second, uchar splitBit)
819 if (firstNode == secondNode)
822 if (first->start() >= second->end() || second->start() >= first->end())
826 uint firstStart = first->start(), firstEnd = first->end(), secondStart = second->start(), secondEnd = second->end();
828 uint newStart = firstStart < secondStart ? firstStart : secondStart;
829 uint newEnd = firstEnd > secondEnd ? firstEnd : secondEnd;
837 if (splitPosition > firstStart && splitPosition < firstEnd && splitPosition > secondStart &&
838 splitPosition < secondEnd) {
841 uint firstLeftNode = first->leftNode();
842 uint firstRightNode = first->rightNode();
844 uint secondLeftNode = second->leftNode();
845 uint secondRightNode = second->rightNode();
847 const SetNodeData* firstLeft = repository.itemFromIndex(firstLeftNode);
848 const SetNodeData* firstRight = repository.itemFromIndex(firstRightNode);
849 const SetNodeData* secondLeft = repository.itemFromIndex(secondLeftNode);
850 const SetNodeData* secondRight = repository.itemFromIndex(secondRightNode);
852 Q_ASSERT(splitPosition >= firstLeft->end() && splitPosition <= firstRight->start());
853 Q_ASSERT(splitPosition >= secondLeft->end() && splitPosition <= secondRight->start());
855 uint newLeftNode = set_subtract(firstLeftNode, secondLeftNode, firstLeft, secondLeft, splitBit);
856 uint newRightNode = set_subtract(firstRightNode, secondRightNode, firstRight, secondRight, splitBit);
858 if (newLeftNode && newRightNode)
859 return createSetFromNodes(newLeftNode, newRightNode);
860 else if (newLeftNode)
864 }
else if (splitPosition > firstStart && splitPosition < firstEnd) {
867 uint firstLeftNode = first->leftNode();
868 uint firstRightNode = first->rightNode();
870 const SetNodeData* firstLeft = repository.itemFromIndex(firstLeftNode);
871 const SetNodeData* firstRight = repository.itemFromIndex(firstRightNode);
876 uint newLeftNode = firstLeftNode, newRightNode = firstRightNode;
878 if (secondEnd <= splitPosition) {
879 newLeftNode = set_subtract(firstLeftNode, secondNode, firstLeft, second, splitBit);
881 Q_ASSERT(secondStart >= splitPosition);
882 newRightNode = set_subtract(firstRightNode, secondNode, firstRight, second, splitBit);
885 if (newLeftNode && newRightNode)
886 return createSetFromNodes(newLeftNode, newRightNode);
887 else if (newLeftNode)
891 }
else if (splitPosition > secondStart && splitPosition < secondEnd) {
892 uint secondLeftNode = second->leftNode();
893 uint secondRightNode = second->rightNode();
895 const SetNodeData* secondLeft = repository.itemFromIndex(secondLeftNode);
896 const SetNodeData* secondRight = repository.itemFromIndex(secondRightNode);
898 Q_ASSERT(splitPosition >= secondLeft->end() && splitPosition <= secondRight->start());
900 if (firstEnd <= splitPosition) {
901 return set_subtract(firstNode, secondLeftNode, first, secondLeft, splitBit);
903 Q_ASSERT(firstStart >= splitPosition);
904 return set_subtract(firstNode, secondRightNode, first, secondRight, splitBit);
921 SetRepositoryAlgorithms alg(m_dataRepository,
this);
923 return Set(alg.setForIndices(indices.begin(), indices.end()),
this);
941 std::vector<Index> indicesVector;
942 indicesVector.reserve(indices.size());
944 for (
unsigned int index : indices) {
945 indicesVector.push_back(index);
952 bool delayedDeletion)
953 : m_dataRepository(this, name, registry)
955 , m_delayedDeletion(delayedDeletion)
957 m_mutex = m_dataRepository.mutex();
960 struct StatisticsVisitor
963 , badSplitNodeCount(0)
964 , zeroRefCountNodes(0)
968 bool operator()(
const SetNodeData* item)
970 if (item->m_refCount == 0)
974 if (item->hasSlaves())
975 if (split < rep.itemFromIndex(item->leftNode())->end() ||
976 split > rep.itemFromIndex(item->rightNode())->start())
981 uint badSplitNodeCount;
982 uint zeroRefCountNodes;
983 const SetDataRepository& rep;
988 StatisticsVisitor stats(m_dataRepository);
989 m_dataRepository.visitAllItems<StatisticsVisitor>(stats);
990 qCDebug(LANGUAGE) <<
"count of nodes:" << stats.nodeCount <<
"count of nodes with bad split:" <<
991 stats.badSplitNodeCount <<
"count of nodes with zero reference-count:" << stats.zeroRefCountNodes;
1008 if (!m_tree || !m_repository)
1013 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
1014 return alg.set_contains(m_repository->m_dataRepository.itemFromIndex(m_tree), index);
1021 else if (!m_tree || !m_repository)
1024 Q_ASSERT(m_repository == first.m_repository);
1028 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
1030 uint retNode = alg.set_union(m_tree, first.m_tree, m_repository->m_dataRepository.itemFromIndex(
1031 m_tree), m_repository->m_dataRepository.itemFromIndex(first.m_tree));
1035 return Set(retNode, m_repository);
1042 else if (!m_tree || !m_repository) {
1043 m_tree = first.m_tree;
1044 m_repository = first.m_repository;
1050 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
1052 m_tree = alg.set_union(m_tree, first.m_tree, m_repository->m_dataRepository.itemFromIndex(
1053 m_tree), m_repository->m_dataRepository.itemFromIndex(first.m_tree));
1061 if (!first.m_tree || !m_tree)
1068 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
1070 Set ret(alg.set_intersect(m_tree, first.m_tree, m_repository->m_dataRepository.itemFromIndex(
1071 m_tree), m_repository->m_dataRepository.itemFromIndex(first.m_tree)), m_repository);
1073 ifDebug(alg.check(ret.m_tree));
1080 if (!first.m_tree || !m_tree) {
1089 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
1091 m_tree = alg.set_intersect(m_tree, first.m_tree, m_repository->m_dataRepository.itemFromIndex(
1092 m_tree), m_repository->m_dataRepository.itemFromIndex(first.m_tree));
1099 if (!m_tree || !rhs.m_tree)
1106 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
1108 Set ret(alg.set_subtract(m_tree, rhs.m_tree, m_repository->m_dataRepository.itemFromIndex(
1109 m_tree), m_repository->m_dataRepository.itemFromIndex(rhs.m_tree)), m_repository);
1110 ifDebug(alg.check(ret.m_tree));
1116 if (!m_tree || !rhs.m_tree)
1123 SetRepositoryAlgorithms alg(m_repository->m_dataRepository, m_repository);
1125 m_tree = alg.set_subtract(m_tree, rhs.m_tree, m_repository->m_dataRepository.itemFromIndex(
1126 m_tree), m_repository->m_dataRepository.itemFromIndex(rhs.m_tree));
1134 return m_repository;
1143 SetNodeData* data = m_repository->m_dataRepository.dynamicItemFromIndexSimple(m_tree);
1148 void Set::unrefNode(uint current)
1150 SetNodeData* data = m_repository->m_dataRepository.dynamicItemFromIndexSimple(current);
1165 m_repository->m_dataRepository.deleteItem(current);
1190 KDevelop::IndexedString
string = KDevelop::IndexedString::fromIndex(index);
1192 const KDevelop::DUChainReferenceCountingEnabler rcEnabler(&
string,
sizeof(KDevelop::IndexedString));
1193 string.~IndexedString();
1200 KDevelop::IndexedString
string = KDevelop::IndexedString::fromIndex(index);
1202 char data[
sizeof(KDevelop::IndexedString)];
1204 const KDevelop::DUChainReferenceCountingEnabler rcEnabler(data,
sizeof(KDevelop::IndexedString));
1205 new (data) KDevelop::IndexedString(
string);