CServerPath CServerPath::GetCommonParent(const CServerPath& path) const { if (*this == path) { return *this; } if (empty() || path.empty()) { return CServerPath(); } if (m_type != path.m_type || (!traits[m_type].prefixmode && m_data->m_prefix != path.m_data->m_prefix)) { return CServerPath(); } if (!HasParent()) { if (path.IsSubdirOf(*this, false)) { return *this; } else { return CServerPath(); } } else if (!path.HasParent()) { if (IsSubdirOf(path, false)) { return path; } else { return CServerPath(); } } CServerPath parent; parent.m_type = m_type; CServerPathData& parentData = parent.m_data.get(); tConstSegmentIter last = m_data->m_segments.end(); tConstSegmentIter last2 = path.m_data->m_segments.end(); if (traits[m_type].prefixmode == 1) { if (!m_data->m_prefix) { --last; } if (!path.m_data->m_prefix) { --last2; } parentData.m_prefix = GetParent().m_data->m_prefix; } else parentData.m_prefix = m_data->m_prefix; tConstSegmentIter iter = m_data->m_segments.begin(); tConstSegmentIter iter2 = path.m_data->m_segments.begin(); while (iter != last && iter2 != last2) { if (*iter != *iter2) { if (!traits[m_type].has_root && parentData.m_segments.empty()) { return CServerPath(); } else { return parent; } } parentData.m_segments.push_back(*iter); ++iter; ++iter2; } return parent; }
CServerPath CServerPath::GetCommonParent(const CServerPath& path) const { if (*this == path) return *this; if (m_bEmpty || path.m_bEmpty) return CServerPath(); if (m_type != path.m_type || (!traits[m_type].prefixmode && m_data->m_prefix != path.m_data->m_prefix)) { return CServerPath(); } if (!HasParent()) { if (path.IsSubdirOf(*this, false)) return *this; else return CServerPath(); } else if (!path.HasParent()) { if (IsSubdirOf(path, false)) return path; else return CServerPath(); } CServerPath parent; parent.m_bEmpty = false; parent.m_type = m_type; CServerPathData& parentData = parent.m_data.Get(); std::list<wxString>::const_iterator last = m_data->m_segments.end(); std::list<wxString>::const_iterator last2 = path.m_data->m_segments.end(); if (traits[m_type].prefixmode == 1) { if (m_data->m_prefix.empty()) last--; if (path.m_data->m_prefix.empty()) last2--; parentData.m_prefix = GetParent().m_data->m_prefix; } else parentData.m_prefix = m_data->m_prefix; std::list<wxString>::const_iterator iter = m_data->m_segments.begin(); std::list<wxString>::const_iterator iter2 = path.m_data->m_segments.begin(); while (iter != last && iter2 != last2) { if (*iter != *iter2) { if (!traits[m_type].has_root && parentData.m_segments.empty()) return CServerPath(); else return parent; } parentData.m_segments.push_back(*iter); iter++; iter2++; } return parent; }