Exheredludis/paludis/repositories/fake/fake_repository_base.cc
Saleem Abdulrasool 64ba7d5be8 modernize: use default method synthesis
Convert a number of destructors to default synthesized functions.  Try to
inline a few instances into the header.  It should be possible to inline all of
them, however, gcc seems to emit a number of warnings.  Furthermore, some of the
destructors are pure-virtualed, but provide an implementation.  Placing the
definition into the header causes ODR violations.
2016-08-06 11:58:04 -07:00

207 lines
5.9 KiB
C++

/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Ciaran McCreesh
*
* This file is part of the Paludis package manager. Paludis is free software;
* you can redistribute it and/or modify it under the terms of the GNU General
* Public License version 2, as published by the Free Software Foundation.
*
* Paludis 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., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <paludis/repositories/fake/fake_repository_base.hh>
#include <paludis/repositories/fake/fake_package_id.hh>
#include <paludis/util/stringify.hh>
#include <paludis/util/pimp-impl.hh>
#include <paludis/util/wrapped_forward_iterator.hh>
#include <paludis/util/set.hh>
#include <paludis/util/sequence.hh>
#include <paludis/util/wrapped_output_iterator.hh>
#include <paludis/util/make_named_values.hh>
#include <paludis/user_dep_spec.hh>
#include <paludis/hook.hh>
#include <functional>
#include <map>
#include <algorithm>
/** \file
* Imp for FakeRepositoryBase.
*
* \ingroup grpfakerepository
*/
using namespace paludis;
namespace paludis
{
template<>
struct Imp<FakeRepositoryBase>
{
std::shared_ptr<CategoryNamePartSet> category_names;
std::map<CategoryNamePart, std::shared_ptr<PackageNamePartSet> > package_names;
std::map<QualifiedPackageName, std::shared_ptr<PackageIDSequence> > ids;
const Environment * const env;
Imp(const Environment * const);
};
Imp<FakeRepositoryBase>::Imp(const Environment * const e) :
category_names(std::make_shared<CategoryNamePartSet>()),
env(e)
{
}
}
FakeRepositoryBase::FakeRepositoryBase(const Environment * const e,
const RepositoryName & our_name, const RepositoryCapabilities & caps) :
Repository(e, our_name, caps),
_imp(e)
{
}
FakeRepositoryBase::~FakeRepositoryBase() = default;
bool
FakeRepositoryBase::has_category_named(const CategoryNamePart & c, const RepositoryContentMayExcludes &) const
{
return (_imp->category_names->end() != _imp->category_names->find(c));
}
bool
FakeRepositoryBase::has_package_named(const QualifiedPackageName & q, const RepositoryContentMayExcludes & x) const
{
return has_category_named(q.category(), x) &&
(_imp->package_names.find(q.category())->second->end() !=
_imp->package_names.find(q.category())->second->find(q.package()));
}
std::shared_ptr<const CategoryNamePartSet>
FakeRepositoryBase::category_names(const RepositoryContentMayExcludes &) const
{
return _imp->category_names;
}
std::shared_ptr<const QualifiedPackageNameSet>
FakeRepositoryBase::package_names(const CategoryNamePart & c, const RepositoryContentMayExcludes & x) const
{
std::shared_ptr<QualifiedPackageNameSet> result(std::make_shared<QualifiedPackageNameSet>());
if (! has_category_named(c, x))
return result;
PackageNamePartSet::ConstIterator p(_imp->package_names.find(c)->second->begin()),
p_end(_imp->package_names.find(c)->second->end());
for ( ; p != p_end ; ++p)
result->insert(c + *p);
return result;
}
std::shared_ptr<const PackageIDSequence>
FakeRepositoryBase::package_ids(const QualifiedPackageName & n, const RepositoryContentMayExcludes & x) const
{
if (! has_category_named(n.category(), x))
return std::make_shared<PackageIDSequence>();
if (! has_package_named(n, x))
return std::make_shared<PackageIDSequence>();
return _imp->ids.find(n)->second;
}
void
FakeRepositoryBase::add_category(const CategoryNamePart & c)
{
_imp->category_names->insert(c);
_imp->package_names.insert(std::make_pair(c, std::make_shared<PackageNamePartSet>()));
}
void
FakeRepositoryBase::add_package(const QualifiedPackageName & q)
{
add_category(q.category());
_imp->package_names.find(q.category())->second->insert(q.package());
_imp->ids.insert(std::make_pair(q, std::make_shared<PackageIDSequence>()));
}
namespace
{
struct VersionIs
{
const VersionSpec version;
VersionIs(const VersionSpec & v) :
version(v)
{
}
bool operator() (const std::shared_ptr<const PackageID> & i) const
{
return i->version() == version;
}
};
}
std::shared_ptr<FakePackageID>
FakeRepositoryBase::add_version(const QualifiedPackageName & q, const VersionSpec & v)
{
add_package(q);
if (_imp->ids.find(q)->second->end() != std::find_if(_imp->ids.find(q)->second->begin(),
_imp->ids.find(q)->second->end(), VersionIs(v)))
throw InternalError(PALUDIS_HERE, "duplicate id added");
std::shared_ptr<FakePackageID> id(std::make_shared<FakePackageID>(_imp->env, name(), q, v));
_imp->ids.find(q)->second->push_back(id);
return id;
}
std::shared_ptr<FakePackageID>
FakeRepositoryBase::add_version(const std::string & c, const std::string & p,
const std::string & v)
{
return add_version(CategoryNamePart(c) + PackageNamePart(p), VersionSpec(v, user_version_spec_options()));
}
void
FakeRepositoryBase::invalidate()
{
}
const Environment *
FakeRepositoryBase::environment() const
{
return _imp->env;
}
void
FakeRepositoryBase::need_keys_added() const
{
}
void
FakeRepositoryBase::populate_sets() const
{
}
HookResult
FakeRepositoryBase::perform_hook(const Hook &, const std::shared_ptr<OutputManager> &)
{
return make_named_values<HookResult>(n::max_exit_status() = 0, n::output() = "");
}
bool
FakeRepositoryBase::sync(
const std::string &,
const std::string &,
const std::shared_ptr<OutputManager> &) const
{
return false;
}