void CListBoxDiffMarks::setLines(const StringArray &lines) { const size_t lastSize = m_lastContent.size(); const size_t n = lines.size(); m_diffSetArray.clear(); for (size_t i = 0; i < n; i++) { const String &line = lines[i]; const size_t len = line.length(); BitSet diffSet(max(len, 10)); if(len > 0) { if (i >= lastSize) { diffSet.add(0,len-1); } else { const String &lastLine = m_lastContent[i]; const size_t lastLen = lastLine.length(); const size_t lmin = min(len, lastLen); const TCHAR *cp = line.cstr(), *lcp = lastLine.cstr(); size_t j; for (j = 0; j < lmin; j++) { if(*(cp++) != *(lcp++)) diffSet.add(j); } if(j < len) diffSet.add(j, len-1); } } m_diffSetArray.add(diffSet); } ResetContent(); for(size_t i = 0; i < lines.size(); i++) { AddString(EMPTYSTRING); } m_lastContent = lines; }
vector<int> Hypergraph::getGraphDifference(const Hypergraph *newGraph) { const vector<HyperEdge> &newEdges = newGraph->_edges; vector<int> diffSet (0); int nEdges = _edges.size(); int nNewEdges = newEdges.size(); int i=0; vector<int>::iterator it = diffSet.begin(); for (; i<min(nEdges, nNewEdges); ++i) { vector<int> v(_edges[i].size()+newEdges[i].size()); vector<int>::iterator vIt = set_symmetric_difference(_edges[i].begin(), _edges[i].end(), newEdges[i].begin(), newEdges[i].end(), v.begin()); int originalSize = diffSet.size(); diffSet.resize(vIt-v.begin()+diffSet.size()); copy(v.begin(), vIt, diffSet.begin()+originalSize); } for (;i<nEdges; ++i) { int originalSize = diffSet.size(); diffSet.resize(diffSet.size()+_edges[i].size()); copy(_edges[i].begin(), _edges[i].end(), diffSet.begin()+originalSize); } for (;i<nNewEdges; ++i) { int originalSize = diffSet.size(); diffSet.resize(diffSet.size()+newEdges[i].size()); copy(_edges[i].begin(), _edges[i].end(), diffSet.begin()+originalSize); } sort(diffSet.begin(), diffSet.end()); it = unique(diffSet.begin(), diffSet.end()); diffSet.resize(it-diffSet.begin()); return diffSet; }