Nested<const int> SegmentSoup::neighbors() const { if (nodes() && !neighbors_.size()) { Array<int> lengths(nodes()); for(int s=0;s<elements.size();s++) for(int a=0;a<2;a++) lengths[elements[s][a]]++; neighbors_ = Nested<int>(lengths); for(int s=0;s<elements.size();s++) { int i,j;elements[s].get(i,j); neighbors_(i,neighbors_.size(i)-lengths[i]--) = j; neighbors_(j,neighbors_.size(j)-lengths[j]--) = i; } // Sort and remove duplicates if necessary bool need_copy = false; for(int i=0;i<nodes();i++) { RawArray<int> n = neighbors_[i]; sort(n); int* last = std::unique(n.begin(),n.end()); if(last!=n.end()) need_copy = true; lengths[i] = int(last-n.begin()); } if (need_copy) { Nested<int> copy(lengths); for(int i=0;i<nodes();i++) copy[i] = neighbors_[i].slice(0,lengths[i]); neighbors_ = copy; } } return neighbors_; }