Exheredludis/paludis/repositories/e/e_slot_key.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

140 lines
3.9 KiB
C++

/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2010, 2011, 2012, 2013 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/e/e_slot_key.hh>
#include <paludis/repositories/e/eapi.hh>
#include <paludis/util/singleton-impl.hh>
#include <paludis/util/hashes.hh>
#include <paludis/util/singleton-impl.hh>
#include <paludis/util/pimp-impl.hh>
#include <paludis/util/make_named_values.hh>
#include <paludis/name.hh>
#include <paludis/slot.hh>
#include <tuple>
#include <unordered_map>
using namespace paludis;
using namespace paludis::erepository;
namespace
{
struct ESlotKey :
MetadataValueKey<Slot>
{
const Slot slot_value;
const std::shared_ptr<const EAPIMetadataVariable> variable;
const MetadataKeyType key_type;
ESlotKey(const Slot & v, const std::shared_ptr<const EAPIMetadataVariable> & m, const MetadataKeyType t) :
slot_value(v),
variable(m),
key_type(t)
{
}
~ESlotKey() override = default;
const Slot parse_value() const override
{
return slot_value;
}
const std::string raw_name() const override
{
return variable->name();
}
const std::string human_name() const override
{
return variable->description();
}
MetadataKeyType type() const override
{
return key_type;
}
};
typedef std::tuple<std::shared_ptr<const EAPIMetadataVariable>, std::string, MetadataKeyType> ESlotKeyStoreIndex;
struct ESlotKeyStoreHash
{
std::size_t operator() (const ESlotKeyStoreIndex & p) const
{
return
Hash<std::string>()(std::get<0>(p)->description()) ^
std::get<0>(p)->flat_list_index() ^
Hash<std::string>()(std::get<0>(p)->name()) ^
Hash<std::string>()(std::get<1>(p)) ^
static_cast<int>(std::get<2>(p));
}
};
}
namespace paludis
{
template <>
struct Imp<ESlotKeyStore>
{
mutable std::mutex mutex;
mutable std::unordered_map<ESlotKeyStoreIndex, std::shared_ptr<const ESlotKey>, ESlotKeyStoreHash> store;
};
}
ESlotKeyStore::ESlotKeyStore() :
_imp()
{
}
ESlotKeyStore::~ESlotKeyStore() = default;
const std::shared_ptr<const MetadataValueKey<Slot> >
ESlotKeyStore::fetch(
const EAPI & eapi,
const std::shared_ptr<const EAPIMetadataVariable> & v,
const std::string & ss,
const MetadataKeyType mkt) const
{
std::string s(ss), t(ss);
if (eapi.supported()->ebuild_options()->has_subslots())
{
auto p(s.find('/'));
if (std::string::npos != p)
{
s = ss.substr(0, p);
t = ss.substr(p + 1);
}
}
std::unique_lock<std::mutex> lock(_imp->mutex);
ESlotKeyStoreIndex x(v, ss, mkt);
auto i(_imp->store.find(x));
if (i == _imp->store.end())
i = _imp->store.insert(std::make_pair(x, std::make_shared<const ESlotKey>(make_named_values<Slot>(
n::match_values() = std::make_pair(SlotName(s), SlotName(t)),
n::parallel_value() = s,
n::raw_value() = ss), v, mkt))).first;
return i->second;
}