vmime/src/utility/path.cpp

257 lines
4.3 KiB
C++
Raw Normal View History

2004-10-05 10:28:21 +00:00
//
2005-03-18 21:33:11 +00:00
// VMime library (http://www.vmime.org)
// Copyright (C) 2002-2005 Vincent Richard <vincent@vincent-richard.net>
2004-10-05 10:28:21 +00:00
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include "vmime/utility/path.hpp"
2004-10-05 10:28:21 +00:00
#include <algorithm>
namespace vmime {
namespace utility {
path::path()
{
}
path::path(const component& c)
{
m_list.push_back(c);
}
path::path(const path& p)
2005-07-12 22:28:02 +00:00
: object()
2004-10-05 10:28:21 +00:00
{
m_list.resize(p.m_list.size());
std::copy(p.m_list.begin(), p.m_list.end(), m_list.begin());
}
path::path(const string& s)
{
m_list.push_back(component(s));
}
path path::operator/(const path& p) const
{
path pr(*this);
pr /= p;
return (pr);
}
path path::operator/(const component& c) const
{
path pr(*this);
pr /= c;
return (pr);
}
path& path::operator/=(const path& p)
{
const list::size_type size = m_list.size();
m_list.resize(size + p.m_list.size());
std::copy(p.m_list.begin(), p.m_list.end(), m_list.begin() + size);
return (*this);
}
path& path::operator/=(const component& c)
{
m_list.push_back(c);
return (*this);
}
2004-10-21 15:05:47 +00:00
path path::getParent() const
2004-10-05 10:28:21 +00:00
{
path p;
2004-10-21 15:05:47 +00:00
if (!isEmpty())
2004-10-05 10:28:21 +00:00
{
p.m_list.resize(m_list.size() - 1);
std::copy(m_list.begin(), m_list.end() - 1, p.m_list.begin());
}
return (p);
}
path& path::operator=(const path& p)
{
m_list.resize(p.m_list.size());
std::copy(p.m_list.begin(), p.m_list.end(), m_list.begin());
return (*this);
}
path& path::operator=(const component& c)
{
m_list.resize(1);
m_list[0] = c;
return (*this);
}
const bool path::operator==(const path& p) const
{
if (m_list.size() != p.m_list.size())
return (false);
list::const_iterator i = m_list.begin();
list::const_iterator j = p.m_list.begin();
bool equal = true;
for ( ; equal && i != m_list.end() ; ++i, ++j)
//equal = (*i == *j);
2004-10-21 15:05:47 +00:00
equal = ((*i).getBuffer() == (*j).getBuffer());
2004-10-05 10:28:21 +00:00
return (equal);
}
const bool path::operator!=(const path& p) const
{
return (!(*this == p));
}
2004-10-21 15:05:47 +00:00
const bool path::isEmpty() const
2004-10-05 10:28:21 +00:00
{
return (m_list.empty());
}
2004-10-21 15:05:47 +00:00
const path::component path::getLastComponent() const
2004-10-05 10:28:21 +00:00
{
2005-01-02 14:10:16 +00:00
return (m_list[m_list.size() - 1]);
2004-10-05 10:28:21 +00:00
}
2004-10-21 15:05:47 +00:00
path::component& path::getLastComponent()
2004-10-05 10:28:21 +00:00
{
return (m_list[m_list.size() - 1]);
}
2004-10-21 15:05:47 +00:00
const int path::getSize() const
2004-10-05 10:28:21 +00:00
{
return (m_list.size());
}
const path::component& path::operator[](const int x) const
{
return (m_list[x]);
}
path::component& path::operator[](const int x)
{
return (m_list[x]);
}
const bool path::isDirectParentOf(const path& p) const
{
2004-10-21 15:05:47 +00:00
if (p.getSize() != getSize() + 1)
2004-10-05 10:28:21 +00:00
return (false);
bool equal = true;
2004-10-21 15:05:47 +00:00
for (list::size_type i = 0 ; equal && i < m_list.size() ; ++i)
2004-10-05 10:28:21 +00:00
equal = (m_list[i] == p.m_list[i]);
return (equal);
}
2004-12-22 09:15:15 +00:00
const bool path::isParentOf(const path& p) const
{
if (p.getSize() < getSize() + 1)
return (false);
bool equal = true;
for (list::size_type i = 0 ; equal && i < m_list.size() ; ++i)
equal = (m_list[i] == p.m_list[i]);
return (equal);
}
2004-12-22 09:52:32 +00:00
void path::renameParent(const path& oldPath, const path& newPath)
{
if (isEmpty() || oldPath.getSize() > getSize())
return;
bool equal = true;
list::size_type i;
for (i = 0 ; equal && i < oldPath.m_list.size() ; ++i)
equal = (m_list[i] == oldPath.m_list[i]);
if (i != oldPath.m_list.size())
return;
list newList;
for (list::size_type j = 0 ; j < newPath.m_list.size() ; ++j)
newList.push_back(newPath.m_list[j]);
for (list::size_type j = i ; j < m_list.size() ; ++j)
newList.push_back(m_list[j]);
m_list.resize(newList.size());
std::copy(newList.begin(), newList.end(), m_list.begin());
}
void path::appendComponent(const path::component& c)
{
m_list.push_back(c);
}
const path::component& path::getComponentAt(const int pos) const
{
return (m_list[pos]);
}
path::component& path::getComponentAt(const int pos)
{
return (m_list[pos]);
}
2004-10-05 10:28:21 +00:00
} // utility
} // vmime