Exheredludis/paludis/spec_tree.cc
2013-05-23 20:57:29 +01:00

630 lines
31 KiB
C++

/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 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/spec_tree.hh>
#include <paludis/util/sequence-impl.hh>
#include <paludis/util/wrapped_forward_iterator-impl.hh>
#include <paludis/util/indirect_iterator-impl.hh>
#include <algorithm>
using namespace paludis;
using namespace paludis::spec_tree_internals;
template <typename Tree_, typename Item_>
LeafNode<Tree_, Item_>::LeafNode(const std::shared_ptr<const Item_> & i) :
_spec(i)
{
}
template <typename Tree_, typename Item_>
template <typename OtherTree_>
LeafNode<Tree_, Item_>::operator LeafNode<OtherTree_, Item_> () const
{
return LeafNode<OtherTree_, Item_>(_spec);
}
template <typename Tree_, typename Item_>
const std::shared_ptr<const Item_>
LeafNode<Tree_, Item_>::spec() const
{
return _spec;
}
template <typename Tree_>
BasicInnerNode<Tree_>::BasicInnerNode() :
_child_list(std::make_shared<ChildList>())
{
}
template <typename Tree_>
typename BasicInnerNode<Tree_>::ConstIterator
BasicInnerNode<Tree_>::begin() const
{
return ConstIterator(_child_list->begin());
}
template <typename Tree_>
typename BasicInnerNode<Tree_>::ConstIterator
BasicInnerNode<Tree_>::end() const
{
return ConstIterator(_child_list->end());
}
template <typename Tree_>
void
BasicInnerNode<Tree_>::append_node(const std::shared_ptr<const BasicNode<Tree_> > & t)
{
_child_list->push_back(t);
}
template <typename Tree_>
template <typename T_>
const std::shared_ptr<typename Tree_::template NodeType<T_>::Type>
BasicInnerNode<Tree_>::append(const std::shared_ptr<const T_> & t)
{
const std::shared_ptr<typename Tree_::template NodeType<T_>::Type> tt(
std::make_shared<typename Tree_::template NodeType<T_>::Type>(t));
append_node(tt);
return tt;
}
template <typename Tree_>
template <typename T_>
const std::shared_ptr<typename Tree_::template NodeType<T_>::Type>
BasicInnerNode<Tree_>::append(const std::shared_ptr<T_> & t)
{
return append(std::shared_ptr<const T_>(t));
}
template <typename Tree_, typename Item_>
InnerNode<Tree_, Item_>::InnerNode(const std::shared_ptr<const Item_> & i) :
_spec(i)
{
}
template <typename Tree_, typename Item_>
const std::shared_ptr<const Item_>
InnerNode<Tree_, Item_>::spec() const
{
return _spec;
}
template <typename NodeList_, typename RootNode_>
SpecTree<NodeList_, RootNode_>::SpecTree(const std::shared_ptr<RootNode_> & spec) :
_top(std::make_shared<typename InnerNodeType<RootNode_>::Type>(spec))
{
}
template <typename NodeList_, typename RootNode_>
SpecTree<NodeList_, RootNode_>::SpecTree(const std::shared_ptr<const RootNode_> & spec) :
_top(std::make_shared<typename InnerNodeType<RootNode_>::Type>(spec))
{
}
template <typename NodeList_, typename RootNode_>
const std::shared_ptr<typename SpecTree<NodeList_, RootNode_>::template InnerNodeType<RootNode_>::Type>
SpecTree<NodeList_, RootNode_>::top()
{
return _top;
}
template <typename NodeList_, typename RootNode_>
const std::shared_ptr<const typename SpecTree<NodeList_, RootNode_>::template InnerNodeType<RootNode_>::Type>
SpecTree<NodeList_, RootNode_>::top() const
{
return _top;
}
namespace
{
template <typename Tree_, typename OtherTree_, typename Item_>
struct InnerNodeCopier
{
InnerNode<OtherTree_, Item_> result;
InnerNodeCopier(const std::shared_ptr<const Item_> & i) :
result(i)
{
}
template <typename T_>
void visit(const LeafNode<Tree_, T_> & n)
{
result.append(n.spec());
}
template <typename T_>
void visit(const InnerNode<Tree_, T_> & n)
{
result.append_node(std::make_shared<InnerNode<OtherTree_, T_>>(n));
}
};
}
template <typename Tree_, typename Item_>
template <typename OtherTree_>
InnerNode<Tree_, Item_>::operator InnerNode<OtherTree_, Item_> () const
{
InnerNodeCopier<Tree_, OtherTree_, Item_> copier(this->spec());
std::for_each(indirect_iterator(this->begin()), indirect_iterator(this->end()), accept_visitor(copier));
return copier.result;
}
namespace paludis
{
template <typename T_>
struct WrappedForwardIteratorTraits<BasicInnerNodeConstIteratorTag<T_> >
{
typedef typename Sequence<std::shared_ptr<const BasicNode<T_> > >::ConstIterator UnderlyingIterator;
};
}
namespace paludis
{
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<PlainTextDepSpec>,
SpecTreeLeafNodeType<PlainTextLabelDepSpec>,
SpecTreeLeafNodeType<SimpleURIDepSpec>,
SpecTreeLeafNodeType<FetchableURIDepSpec>,
SpecTreeLeafNodeType<LicenseDepSpec>,
SpecTreeLeafNodeType<PackageDepSpec>,
SpecTreeLeafNodeType<BlockDepSpec>,
SpecTreeLeafNodeType<URILabelsDepSpec>,
SpecTreeLeafNodeType<DependenciesLabelsDepSpec>,
SpecTreeLeafNodeType<NamedSetDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>,
SpecTreeInnerNodeType<AnyDepSpec>,
SpecTreeInnerNodeType<ExactlyOneDepSpec>,
SpecTreeInnerNodeType<AtMostOneDepSpec>,
SpecTreeInnerNodeType<ConditionalDepSpec>
>::Type, AllDepSpec>;
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<LicenseDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>,
SpecTreeInnerNodeType<AnyDepSpec>,
SpecTreeInnerNodeType<ConditionalDepSpec>
>::Type, AllDepSpec>;
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<FetchableURIDepSpec>,
SpecTreeLeafNodeType<URILabelsDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>,
SpecTreeInnerNodeType<ConditionalDepSpec>
>::Type, AllDepSpec>;
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<SimpleURIDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>,
SpecTreeInnerNodeType<ConditionalDepSpec>
>::Type, AllDepSpec>;
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<PackageDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>,
SpecTreeInnerNodeType<ConditionalDepSpec>
>::Type, AllDepSpec>;
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<PlainTextDepSpec>,
SpecTreeLeafNodeType<PlainTextLabelDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>,
SpecTreeInnerNodeType<ConditionalDepSpec>
>::Type, AllDepSpec>;
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<PlainTextDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>,
SpecTreeInnerNodeType<AnyDepSpec>,
SpecTreeInnerNodeType<ExactlyOneDepSpec>,
SpecTreeInnerNodeType<AtMostOneDepSpec>,
SpecTreeInnerNodeType<ConditionalDepSpec>
>::Type, AllDepSpec>;
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<PackageDepSpec>,
SpecTreeLeafNodeType<BlockDepSpec>,
SpecTreeLeafNodeType<DependenciesLabelsDepSpec>,
SpecTreeLeafNodeType<NamedSetDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>,
SpecTreeInnerNodeType<AnyDepSpec>,
SpecTreeInnerNodeType<ConditionalDepSpec>
>::Type, AllDepSpec>;
template class SpecTree<MakeTypeList<
SpecTreeLeafNodeType<PackageDepSpec>,
SpecTreeLeafNodeType<NamedSetDepSpec>,
SpecTreeInnerNodeType<AllDepSpec>
>::Type, AllDepSpec>;
/* GenericSpecTree */
template const std::shared_ptr<GenericSpecTree::NodeType<PackageDepSpec>::Type>
BasicInnerNode<GenericSpecTree>::append<PackageDepSpec>(const std::shared_ptr<const PackageDepSpec> &);
template const std::shared_ptr<GenericSpecTree::NodeType<PackageDepSpec>::Type>
BasicInnerNode<GenericSpecTree>::append<PackageDepSpec>(const std::shared_ptr<PackageDepSpec> &);
template const std::shared_ptr<GenericSpecTree::NodeType<NamedSetDepSpec>::Type>
BasicInnerNode<GenericSpecTree>::append<NamedSetDepSpec>(const std::shared_ptr<const NamedSetDepSpec> &);
template const std::shared_ptr<GenericSpecTree::NodeType<NamedSetDepSpec>::Type>
BasicInnerNode<GenericSpecTree>::append<NamedSetDepSpec>(const std::shared_ptr<NamedSetDepSpec> &);
namespace spec_tree_internals
{
template class BasicInnerNode<GenericSpecTree>;
}
template class WrappedForwardIterator<BasicInnerNode<GenericSpecTree>::ConstIteratorTag,
const std::shared_ptr<const BasicNode<GenericSpecTree> > >;
namespace spec_tree_internals
{
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, PackageDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, BlockDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, DependenciesLabelsDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, NamedSetDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, PlainTextDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, PlainTextLabelDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, SimpleURIDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, FetchableURIDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, LicenseDepSpec>;
template class PALUDIS_VISIBLE LeafNode<GenericSpecTree, URILabelsDepSpec>;
template class PALUDIS_VISIBLE InnerNode<GenericSpecTree, AllDepSpec>;
template class PALUDIS_VISIBLE InnerNode<GenericSpecTree, AnyDepSpec>;
template class PALUDIS_VISIBLE InnerNode<GenericSpecTree, ExactlyOneDepSpec>;
template class PALUDIS_VISIBLE InnerNode<GenericSpecTree, AtMostOneDepSpec>;
template class PALUDIS_VISIBLE InnerNode<GenericSpecTree, ConditionalDepSpec>;
}
}
/* DependencySpecTree */
template const std::shared_ptr<DependencySpecTree::NodeType<PackageDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<PackageDepSpec>(const std::shared_ptr<const PackageDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<PackageDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<PackageDepSpec>(const std::shared_ptr<PackageDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<NamedSetDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<NamedSetDepSpec>(const std::shared_ptr<const NamedSetDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<NamedSetDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<NamedSetDepSpec>(const std::shared_ptr<NamedSetDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<BlockDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<BlockDepSpec>(const std::shared_ptr<const BlockDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<BlockDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<BlockDepSpec>(const std::shared_ptr<BlockDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<DependenciesLabelsDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<DependenciesLabelsDepSpec>(const std::shared_ptr<const DependenciesLabelsDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<DependenciesLabelsDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<DependenciesLabelsDepSpec>(const std::shared_ptr<DependenciesLabelsDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<AnyDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<AnyDepSpec>(const std::shared_ptr<const AnyDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<AnyDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<AnyDepSpec>(const std::shared_ptr<AnyDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<AllDepSpec>(const std::shared_ptr<const AllDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<AllDepSpec>(const std::shared_ptr<AllDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<const ConditionalDepSpec> &);
template const std::shared_ptr<DependencySpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<DependencySpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<ConditionalDepSpec> &);
namespace paludis
{
template class WrappedForwardIterator<BasicInnerNode<DependencySpecTree>::ConstIteratorTag,
const std::shared_ptr<const BasicNode<DependencySpecTree> > >;
namespace spec_tree_internals
{
template class BasicInnerNode<DependencySpecTree>;
template class PALUDIS_VISIBLE LeafNode<DependencySpecTree, PackageDepSpec>;
template class PALUDIS_VISIBLE LeafNode<DependencySpecTree, BlockDepSpec>;
template class PALUDIS_VISIBLE LeafNode<DependencySpecTree, DependenciesLabelsDepSpec>;
template class PALUDIS_VISIBLE LeafNode<DependencySpecTree, NamedSetDepSpec>;
template class PALUDIS_VISIBLE InnerNode<DependencySpecTree, AllDepSpec>;
template class PALUDIS_VISIBLE InnerNode<DependencySpecTree, AnyDepSpec>;
template class PALUDIS_VISIBLE InnerNode<DependencySpecTree, ConditionalDepSpec>;
}
}
/* SetSpecTree */
template const std::shared_ptr<SetSpecTree::NodeType<PackageDepSpec>::Type>
BasicInnerNode<SetSpecTree>::append<PackageDepSpec>(const std::shared_ptr<const PackageDepSpec> &);
template const std::shared_ptr<SetSpecTree::NodeType<PackageDepSpec>::Type>
BasicInnerNode<SetSpecTree>::append<PackageDepSpec>(const std::shared_ptr<PackageDepSpec> &);
template const std::shared_ptr<SetSpecTree::NodeType<NamedSetDepSpec>::Type>
BasicInnerNode<SetSpecTree>::append<NamedSetDepSpec>(const std::shared_ptr<const NamedSetDepSpec> &);
template const std::shared_ptr<SetSpecTree::NodeType<NamedSetDepSpec>::Type>
BasicInnerNode<SetSpecTree>::append<NamedSetDepSpec>(const std::shared_ptr<NamedSetDepSpec> &);
template const std::shared_ptr<SetSpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<SetSpecTree>::append<AllDepSpec>(const std::shared_ptr<const AllDepSpec> &);
template const std::shared_ptr<SetSpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<SetSpecTree>::append<AllDepSpec>(const std::shared_ptr<AllDepSpec> &);
namespace paludis
{
template class WrappedForwardIterator<BasicInnerNode<SetSpecTree>::ConstIteratorTag,
const std::shared_ptr<const BasicNode<SetSpecTree> > >;
namespace spec_tree_internals
{
template class BasicInnerNode<SetSpecTree>;
template class PALUDIS_VISIBLE LeafNode<SetSpecTree, PackageDepSpec>;
template class PALUDIS_VISIBLE LeafNode<SetSpecTree, NamedSetDepSpec>;
template class PALUDIS_VISIBLE InnerNode<SetSpecTree, AllDepSpec>;
}
}
/* PlainTextSpecTree */
template const std::shared_ptr<PlainTextSpecTree::NodeType<PlainTextDepSpec>::Type>
BasicInnerNode<PlainTextSpecTree>::append<PlainTextDepSpec>(const std::shared_ptr<const PlainTextDepSpec> &);
template const std::shared_ptr<PlainTextSpecTree::NodeType<PlainTextDepSpec>::Type>
BasicInnerNode<PlainTextSpecTree>::append<PlainTextDepSpec>(const std::shared_ptr<PlainTextDepSpec> &);
template const std::shared_ptr<PlainTextSpecTree::NodeType<PlainTextLabelDepSpec>::Type>
BasicInnerNode<PlainTextSpecTree>::append<PlainTextLabelDepSpec>(const std::shared_ptr<const PlainTextLabelDepSpec> &);
template const std::shared_ptr<PlainTextSpecTree::NodeType<PlainTextLabelDepSpec>::Type>
BasicInnerNode<PlainTextSpecTree>::append<PlainTextLabelDepSpec>(const std::shared_ptr<PlainTextLabelDepSpec> &);
template const std::shared_ptr<PlainTextSpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<PlainTextSpecTree>::append<AllDepSpec>(const std::shared_ptr<const AllDepSpec> &);
template const std::shared_ptr<PlainTextSpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<PlainTextSpecTree>::append<AllDepSpec>(const std::shared_ptr<AllDepSpec> &);
template const std::shared_ptr<PlainTextSpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<PlainTextSpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<const ConditionalDepSpec> &);
template const std::shared_ptr<PlainTextSpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<PlainTextSpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<ConditionalDepSpec> &);
namespace paludis
{
template class WrappedForwardIterator<BasicInnerNode<PlainTextSpecTree>::ConstIteratorTag,
const std::shared_ptr<const BasicNode<PlainTextSpecTree> > >;
namespace spec_tree_internals
{
template class BasicInnerNode<PlainTextSpecTree>;
template class PALUDIS_VISIBLE LeafNode<PlainTextSpecTree, PlainTextDepSpec>;
template class PALUDIS_VISIBLE LeafNode<PlainTextSpecTree, PlainTextLabelDepSpec>;
template class PALUDIS_VISIBLE InnerNode<PlainTextSpecTree, AllDepSpec>;
template class PALUDIS_VISIBLE InnerNode<PlainTextSpecTree, ConditionalDepSpec>;
}
}
/* RequiredUseSpecTree */
template const std::shared_ptr<RequiredUseSpecTree::NodeType<PlainTextDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<PlainTextDepSpec>(const std::shared_ptr<const PlainTextDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<PlainTextDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<PlainTextDepSpec>(const std::shared_ptr<PlainTextDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<AllDepSpec>(const std::shared_ptr<const AllDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<AllDepSpec>(const std::shared_ptr<AllDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<AnyDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<AnyDepSpec>(const std::shared_ptr<const AnyDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<AnyDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<AnyDepSpec>(const std::shared_ptr<AnyDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<ExactlyOneDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<ExactlyOneDepSpec>(const std::shared_ptr<const ExactlyOneDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<ExactlyOneDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<ExactlyOneDepSpec>(const std::shared_ptr<ExactlyOneDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<AtMostOneDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<AtMostOneDepSpec>(const std::shared_ptr<const AtMostOneDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<AtMostOneDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<AtMostOneDepSpec>(const std::shared_ptr<AtMostOneDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<const ConditionalDepSpec> &);
template const std::shared_ptr<RequiredUseSpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<RequiredUseSpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<ConditionalDepSpec> &);
namespace paludis
{
template class WrappedForwardIterator<BasicInnerNode<RequiredUseSpecTree>::ConstIteratorTag,
const std::shared_ptr<const BasicNode<RequiredUseSpecTree> > >;
namespace spec_tree_internals
{
template class BasicInnerNode<RequiredUseSpecTree>;
template class PALUDIS_VISIBLE LeafNode<RequiredUseSpecTree, PlainTextDepSpec>;
template class PALUDIS_VISIBLE InnerNode<RequiredUseSpecTree, AllDepSpec>;
template class PALUDIS_VISIBLE InnerNode<RequiredUseSpecTree, AnyDepSpec>;
template class PALUDIS_VISIBLE InnerNode<RequiredUseSpecTree, ExactlyOneDepSpec>;
template class PALUDIS_VISIBLE InnerNode<RequiredUseSpecTree, AtMostOneDepSpec>;
template class PALUDIS_VISIBLE InnerNode<RequiredUseSpecTree, ConditionalDepSpec>;
}
}
/* SimpleURISpecTree */
template const std::shared_ptr<SimpleURISpecTree::NodeType<SimpleURIDepSpec>::Type>
BasicInnerNode<SimpleURISpecTree>::append<SimpleURIDepSpec>(const std::shared_ptr<const SimpleURIDepSpec> &);
template const std::shared_ptr<SimpleURISpecTree::NodeType<SimpleURIDepSpec>::Type>
BasicInnerNode<SimpleURISpecTree>::append<SimpleURIDepSpec>(const std::shared_ptr<SimpleURIDepSpec> &);
template const std::shared_ptr<SimpleURISpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<SimpleURISpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<const ConditionalDepSpec> &);
template const std::shared_ptr<SimpleURISpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<SimpleURISpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<ConditionalDepSpec> &);
template const std::shared_ptr<SimpleURISpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<SimpleURISpecTree>::append<AllDepSpec>(const std::shared_ptr<const AllDepSpec> &);
template const std::shared_ptr<SimpleURISpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<SimpleURISpecTree>::append<AllDepSpec>(const std::shared_ptr<AllDepSpec> &);
namespace paludis
{
template class WrappedForwardIterator<BasicInnerNode<SimpleURISpecTree>::ConstIteratorTag,
const std::shared_ptr<const BasicNode<SimpleURISpecTree> > >;
namespace spec_tree_internals
{
template class BasicInnerNode<SimpleURISpecTree>;
template class PALUDIS_VISIBLE LeafNode<SimpleURISpecTree, SimpleURIDepSpec>;
template class PALUDIS_VISIBLE InnerNode<SimpleURISpecTree, AllDepSpec>;
template class PALUDIS_VISIBLE InnerNode<SimpleURISpecTree, ConditionalDepSpec>;
}
}
/* FetchableURISpecTree */
template const std::shared_ptr<FetchableURISpecTree::NodeType<FetchableURIDepSpec>::Type>
BasicInnerNode<FetchableURISpecTree>::append<FetchableURIDepSpec>(const std::shared_ptr<const FetchableURIDepSpec> &);
template const std::shared_ptr<FetchableURISpecTree::NodeType<FetchableURIDepSpec>::Type>
BasicInnerNode<FetchableURISpecTree>::append<FetchableURIDepSpec>(const std::shared_ptr<FetchableURIDepSpec> &);
template const std::shared_ptr<FetchableURISpecTree::NodeType<URILabelsDepSpec>::Type>
BasicInnerNode<FetchableURISpecTree>::append<URILabelsDepSpec>(const std::shared_ptr<const URILabelsDepSpec> &);
template const std::shared_ptr<FetchableURISpecTree::NodeType<URILabelsDepSpec>::Type>
BasicInnerNode<FetchableURISpecTree>::append<URILabelsDepSpec>(const std::shared_ptr<URILabelsDepSpec> &);
template const std::shared_ptr<FetchableURISpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<FetchableURISpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<const ConditionalDepSpec> &);
template const std::shared_ptr<FetchableURISpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<FetchableURISpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<ConditionalDepSpec> &);
template const std::shared_ptr<FetchableURISpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<FetchableURISpecTree>::append<AllDepSpec>(const std::shared_ptr<const AllDepSpec> &);
template const std::shared_ptr<FetchableURISpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<FetchableURISpecTree>::append<AllDepSpec>(const std::shared_ptr<AllDepSpec> &);
namespace paludis
{
template class WrappedForwardIterator<BasicInnerNode<FetchableURISpecTree>::ConstIteratorTag,
const std::shared_ptr<const BasicNode<FetchableURISpecTree> > >;
namespace spec_tree_internals
{
template class BasicInnerNode<FetchableURISpecTree>;
template class PALUDIS_VISIBLE LeafNode<FetchableURISpecTree, FetchableURIDepSpec>;
template class PALUDIS_VISIBLE LeafNode<FetchableURISpecTree, URILabelsDepSpec>;
template class PALUDIS_VISIBLE InnerNode<FetchableURISpecTree, AllDepSpec>;
template class PALUDIS_VISIBLE InnerNode<FetchableURISpecTree, ConditionalDepSpec>;
}
}
/* LicenseSpecTree */
template const std::shared_ptr<LicenseSpecTree::NodeType<LicenseDepSpec>::Type>
BasicInnerNode<LicenseSpecTree>::append<LicenseDepSpec>(const std::shared_ptr<const LicenseDepSpec> &);
template const std::shared_ptr<LicenseSpecTree::NodeType<LicenseDepSpec>::Type>
BasicInnerNode<LicenseSpecTree>::append<LicenseDepSpec>(const std::shared_ptr<LicenseDepSpec> &);
template const std::shared_ptr<LicenseSpecTree::NodeType<AnyDepSpec>::Type>
BasicInnerNode<LicenseSpecTree>::append<AnyDepSpec>(const std::shared_ptr<const AnyDepSpec> &);
template const std::shared_ptr<LicenseSpecTree::NodeType<AnyDepSpec>::Type>
BasicInnerNode<LicenseSpecTree>::append<AnyDepSpec>(const std::shared_ptr<AnyDepSpec> &);
template const std::shared_ptr<LicenseSpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<LicenseSpecTree>::append<AllDepSpec>(const std::shared_ptr<const AllDepSpec> &);
template const std::shared_ptr<LicenseSpecTree::NodeType<AllDepSpec>::Type>
BasicInnerNode<LicenseSpecTree>::append<AllDepSpec>(const std::shared_ptr<AllDepSpec> &);
template const std::shared_ptr<LicenseSpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<LicenseSpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<const ConditionalDepSpec> &);
template const std::shared_ptr<LicenseSpecTree::NodeType<ConditionalDepSpec>::Type>
BasicInnerNode<LicenseSpecTree>::append<ConditionalDepSpec>(const std::shared_ptr<ConditionalDepSpec> &);
namespace paludis
{
template class WrappedForwardIterator<BasicInnerNode<LicenseSpecTree>::ConstIteratorTag,
const std::shared_ptr<const BasicNode<LicenseSpecTree> > >;
namespace spec_tree_internals
{
template class BasicInnerNode<LicenseSpecTree>;
template class PALUDIS_VISIBLE LeafNode<LicenseSpecTree, LicenseDepSpec>;
template class PALUDIS_VISIBLE InnerNode<LicenseSpecTree, AllDepSpec>;
template class PALUDIS_VISIBLE InnerNode<LicenseSpecTree, AnyDepSpec>;
template class PALUDIS_VISIBLE InnerNode<LicenseSpecTree, ConditionalDepSpec>;
}
}
/* SetSpecTree -> DependencySpecTree */
template InnerNode<SetSpecTree, AllDepSpec>::operator InnerNode<DependencySpecTree, AllDepSpec> () const;
template LeafNode<SetSpecTree, PackageDepSpec>::operator LeafNode<DependencySpecTree, PackageDepSpec> () const;
template LeafNode<SetSpecTree, NamedSetDepSpec>::operator LeafNode<DependencySpecTree, NamedSetDepSpec> () const;
/* SetSpecTree -> GenericSpecTree */
template InnerNode<SetSpecTree, AllDepSpec>::operator InnerNode<GenericSpecTree, AllDepSpec> () const;
template LeafNode<SetSpecTree, PackageDepSpec>::operator LeafNode<GenericSpecTree, PackageDepSpec> () const;
template LeafNode<SetSpecTree, NamedSetDepSpec>::operator LeafNode<GenericSpecTree, NamedSetDepSpec> () const;
/* DependencySpecTree -> GenericSpecTree */
template InnerNode<DependencySpecTree, AllDepSpec>::operator InnerNode<GenericSpecTree, AllDepSpec> () const;
template InnerNode<DependencySpecTree, AnyDepSpec>::operator InnerNode<GenericSpecTree, AnyDepSpec> () const;
template InnerNode<DependencySpecTree, ConditionalDepSpec>::operator InnerNode<GenericSpecTree, ConditionalDepSpec> () const;
template LeafNode<DependencySpecTree, PackageDepSpec>::operator LeafNode<GenericSpecTree, PackageDepSpec> () const;
template LeafNode<DependencySpecTree, NamedSetDepSpec>::operator LeafNode<GenericSpecTree, NamedSetDepSpec> () const;
template LeafNode<DependencySpecTree, DependenciesLabelsDepSpec>::operator LeafNode<GenericSpecTree, DependenciesLabelsDepSpec> () const;
template LeafNode<DependencySpecTree, BlockDepSpec>::operator LeafNode<GenericSpecTree, BlockDepSpec> () const;
/* LicenseSpecTree -> GenericSpecTree */
template InnerNode<LicenseSpecTree, AllDepSpec>::operator InnerNode<GenericSpecTree, AllDepSpec> () const;
template InnerNode<LicenseSpecTree, AnyDepSpec>::operator InnerNode<GenericSpecTree, AnyDepSpec> () const;
template InnerNode<LicenseSpecTree, ConditionalDepSpec>::operator InnerNode<GenericSpecTree, ConditionalDepSpec> () const;
template LeafNode<LicenseSpecTree, LicenseDepSpec>::operator LeafNode<GenericSpecTree, LicenseDepSpec> () const;
/* SimpleURISpecTree -> GenericSpecTree */
template InnerNode<SimpleURISpecTree, AllDepSpec>::operator InnerNode<GenericSpecTree, AllDepSpec> () const;
template InnerNode<SimpleURISpecTree, ConditionalDepSpec>::operator InnerNode<GenericSpecTree, ConditionalDepSpec> () const;
template LeafNode<SimpleURISpecTree, SimpleURIDepSpec>::operator LeafNode<GenericSpecTree, SimpleURIDepSpec> () const;
/* FetchableURISpecTree -> GenericSpecTree */
template InnerNode<FetchableURISpecTree, AllDepSpec>::operator InnerNode<GenericSpecTree, AllDepSpec> () const;
template InnerNode<FetchableURISpecTree, ConditionalDepSpec>::operator InnerNode<GenericSpecTree, ConditionalDepSpec> () const;
template LeafNode<FetchableURISpecTree, FetchableURIDepSpec>::operator LeafNode<GenericSpecTree, FetchableURIDepSpec> () const;
template LeafNode<FetchableURISpecTree, URILabelsDepSpec>::operator LeafNode<GenericSpecTree, URILabelsDepSpec> () const;
/* PlainTextSpecTree -> GenericSpecTree */
template InnerNode<PlainTextSpecTree, AllDepSpec>::operator InnerNode<GenericSpecTree, AllDepSpec> () const;
template InnerNode<PlainTextSpecTree, ConditionalDepSpec>::operator InnerNode<GenericSpecTree, ConditionalDepSpec> () const;
template LeafNode<PlainTextSpecTree, PlainTextDepSpec>::operator LeafNode<GenericSpecTree, PlainTextDepSpec> () const;
template LeafNode<PlainTextSpecTree, PlainTextLabelDepSpec>::operator LeafNode<GenericSpecTree, PlainTextLabelDepSpec> () const;
/* RequiredUseSpecTree -> GenericSpecTree */
template InnerNode<RequiredUseSpecTree, AllDepSpec>::operator InnerNode<GenericSpecTree, AllDepSpec> () const;
template InnerNode<RequiredUseSpecTree, AnyDepSpec>::operator InnerNode<GenericSpecTree, AnyDepSpec> () const;
template InnerNode<RequiredUseSpecTree, ExactlyOneDepSpec>::operator InnerNode<GenericSpecTree, ExactlyOneDepSpec> () const;
template InnerNode<RequiredUseSpecTree, AtMostOneDepSpec>::operator InnerNode<GenericSpecTree, AtMostOneDepSpec> () const;
template InnerNode<RequiredUseSpecTree, ConditionalDepSpec>::operator InnerNode<GenericSpecTree, ConditionalDepSpec> () const;
template LeafNode<RequiredUseSpecTree, PlainTextDepSpec>::operator LeafNode<GenericSpecTree, PlainTextDepSpec> () const;