From 6dc6fabb8a074fcef35cd9ac409245702f3e386d Mon Sep 17 00:00:00 2001 From: Ciaran McCreesh Date: Fri, 11 Mar 2011 20:21:58 +0000 Subject: Pool --- paludis/util/pool.hh | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 paludis/util/pool.hh (limited to 'paludis/util/pool.hh') diff --git a/paludis/util/pool.hh b/paludis/util/pool.hh new file mode 100644 index 000000000..58e919b38 --- /dev/null +++ b/paludis/util/pool.hh @@ -0,0 +1,132 @@ +/* vim: set sw=4 sts=4 et foldmethod=syntax : */ + +/* + * Copyright (c) 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 + */ + +#ifndef PALUDIS_GUARD_PALUDIS_UTIL_POOL_HH +#define PALUDIS_GUARD_PALUDIS_UTIL_POOL_HH 1 + +#include +#include +#include + +namespace paludis +{ + class PoolKeysHasher; + class PoolKeysComparator; + + template + class PALUDIS_VISIBLE Pool : + public Singleton > + { + friend class Singleton >; + + private: + Pimp > _imp; + + Pool(); + ~Pool(); + + public: + template + const std::shared_ptr create(Args_ ...) const PALUDIS_ATTRIBUTE((warn_unused_result)); + }; + + class PALUDIS_VISIBLE PoolKey + { + private: + int _tc; + + protected: + explicit PoolKey(int tc); + + virtual bool same_value(const PoolKey &) const = 0; + + public: + virtual ~PoolKey() = 0; + + virtual std::size_t hash() const = 0; + + bool same_type_and_value(const PoolKey &) const; + }; + + template + class PALUDIS_VISIBLE ConcretePoolKey : + public PoolKey + { + friend class PoolKeysHasher; + friend class PoolKeysComparator; + + private: + T_ _value; + + public: + explicit ConcretePoolKey(const T_ &); + + virtual ~ConcretePoolKey(); + + virtual std::size_t hash() const; + + bool same_value(const PoolKey &) const; + }; + + class PALUDIS_VISIBLE PoolKeys + { + friend class PoolKeysHasher; + friend class PoolKeysComparator; + + private: + Pimp _imp; + + void add_one(const std::shared_ptr &); + void add(); + + public: + PoolKeys(); + PoolKeys(const PoolKeys &); + ~PoolKeys(); + + template + void add(const Arg_ &, const Args_ & ...); + }; + + class PALUDIS_VISIBLE PoolKeysHasher + { + public: + std::size_t operator() (const PoolKeys &) const PALUDIS_VISIBLE; + }; + + class PALUDIS_VISIBLE PoolKeysComparator + { + public: + bool operator() (const PoolKeys &, const PoolKeys &) const PALUDIS_VISIBLE; + }; + + class PALUDIS_VISIBLE PoolKeyTypeCodes + { + private: + static int next(); + + public: + template + static int get(); + }; + + extern template class Pimp; +} + +#endif -- cgit v1.2.3