/* vim: set sw=4 sts=4 et foldmethod=syntax : */ /* * Copyright (c) 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace paludis; #include namespace paludis { template <> struct Imp { mutable std::list > masks; mutable std::list > overridden_masks; }; template <> struct WrappedForwardIteratorTraits { typedef std::list >::const_iterator UnderlyingIterator; }; template <> struct WrappedForwardIteratorTraits { typedef std::list >::const_iterator UnderlyingIterator; }; } PackageID::PackageID() : _imp() { } PackageID::~PackageID() { } void PackageID::add_mask(const std::shared_ptr & k) const { _imp->masks.push_back(k); } void PackageID::add_overridden_mask(const std::shared_ptr & k) const { _imp->overridden_masks.push_back(k); } PackageID::MasksConstIterator PackageID::begin_masks() const { need_masks_added(); return MasksConstIterator(_imp->masks.begin()); } PackageID::MasksConstIterator PackageID::end_masks() const { need_masks_added(); return MasksConstIterator(_imp->masks.end()); } PackageID::OverriddenMasksConstIterator PackageID::begin_overridden_masks() const { need_masks_added(); return OverriddenMasksConstIterator(_imp->overridden_masks.begin()); } PackageID::OverriddenMasksConstIterator PackageID::end_overridden_masks() const { need_masks_added(); return OverriddenMasksConstIterator(_imp->overridden_masks.end()); } bool PackageID::masked() const { return begin_masks() != end_masks(); } std::ostream & paludis::operator<< (std::ostream & s, const PackageID & i) { s << i.canonical_form(idcf_full); return s; } bool PackageIDSetComparator::operator() (const std::shared_ptr & a, const std::shared_ptr & b) const { if (a->name() < b->name()) return true; if (a->name() > b->name()) return false; if (a->version() < b->version()) return true; if (a->version() > b->version()) return false; if (a->repository_name().value() < b->repository_name().value()) return true; if (a->repository_name().value() > b->repository_name().value()) return false; return a->arbitrary_less_than_comparison(*b); } bool paludis::operator== (const PackageID & a, const PackageID & b) { return (a.name() == b.name()) && (a.version() == b.version()) && (a.repository_name() == b.repository_name()) && (! a.arbitrary_less_than_comparison(b)) && (! b.arbitrary_less_than_comparison(a)); } namespace paludis { template <> struct Imp { std::unordered_map > m; }; } PackageIDComparator::PackageIDComparator(const Environment * const e) : _imp() { unsigned c(0); for (auto r(e->begin_repositories()), r_end(e->end_repositories()) ; r != r_end ; ++r) _imp->m.insert(std::make_pair((*r)->name(), ++c)); } PackageIDComparator::PackageIDComparator(const PackageIDComparator & other) : _imp() { _imp->m = other._imp->m; } PackageIDComparator::~PackageIDComparator() { } bool PackageIDComparator::operator() (const std::shared_ptr & a, const std::shared_ptr & b) const { if (a->name() < b->name()) return true; if (a->name() > b->name()) return false; if (a->version() < b->version()) return true; if (a->version() > b->version()) return false; std::unordered_map >::const_iterator ma(_imp->m.find(a->repository_name())), mb(_imp->m.find(b->repository_name())); if (ma == _imp->m.end() || mb == _imp->m.end()) throw InternalError(PALUDIS_HERE, "Repository not in database"); if (ma->second < mb->second) return true; if (ma->second > mb->second) return false; return a->arbitrary_less_than_comparison(*b); } std::size_t PackageID::hash() const { return (Hash()(name()) << 0) ^ (Hash()(version()) << 5) ^ (Hash()(repository_name()) << 9) ^ (extra_hash_value() << 13); } void PackageID::can_drop_in_memory_cache() const { } namespace paludis { template class Sequence >; template class WrappedForwardIterator >::ConstIteratorTag, const std::shared_ptr >; template class WrappedForwardIterator >::ReverseConstIteratorTag, const std::shared_ptr >; template class WrappedOutputIterator >::InserterTag, std::shared_ptr >; template class Set, PackageIDSetComparator>; template class WrappedForwardIterator, PackageIDSetComparator>::ConstIteratorTag, const std::shared_ptr >; template class WrappedOutputIterator, PackageIDSetComparator>::InserterTag, std::shared_ptr >; template class WrappedForwardIterator >; template class WrappedForwardIterator >; }