Exheredludis/paludis/mask.hh
2011-06-12 01:12:11 +01:00

210 lines
5.8 KiB
C++

/* 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
*/
#ifndef PALUDIS_GUARD_PALUDIS_MASK_HH
#define PALUDIS_GUARD_PALUDIS_MASK_HH 1
#include <paludis/mask-fwd.hh>
#include <paludis/package_id-fwd.hh>
#include <paludis/dep_spec-fwd.hh>
#include <paludis/util/visitor.hh>
#include <paludis/util/attributes.hh>
#include <paludis/util/fs_path.hh>
#include <paludis/util/sequence-fwd.hh>
#include <paludis/util/named_value.hh>
#include <paludis/util/type_list.hh>
#include <string>
/** \file
* Declarations for mask classes.
*
* \ingroup g_mask
*
* \section Examples
*
* - \ref example_mask.cc "example_mask.cc" (for masks)
*/
namespace paludis
{
namespace n
{
typedef Name<struct name_comment> comment;
typedef Name<struct name_mask> mask;
typedef Name<struct name_mask_file> mask_file;
typedef Name<struct name_override_reason> override_reason;
typedef Name<struct name_token> token;
}
/**
* A Mask represents one reason why a PackageID is masked (not available to
* be installed).
*
* A basic Mask has:
*
* - A single character key, which can be used by clients if they need a
* very compact way of representing a mask.
*
* - A description.
*
* Subclasses provide additional information.
*
* \ingroup g_mask
* \since 0.26
* \nosubgrouping
*/
class PALUDIS_VISIBLE Mask :
public virtual DeclareAbstractAcceptMethods<Mask, MakeTypeList<
UserMask, UnacceptedMask, RepositoryMask, UnsupportedMask>::Type>
{
public:
///\name Basic operations
///\{
virtual ~Mask() = 0;
///\}
/**
* A single character key, which can be used by clients if they need
* a very compact way of representing a mask.
*/
virtual char key() const = 0;
/**
* A description of the mask.
*/
virtual const std::string description() const = 0;
};
/**
* A UserMask is a Mask due to user configuration.
*
* \ingroup g_mask
* \since 0.26
* \nosubgrouping
*/
class PALUDIS_VISIBLE UserMask :
public Mask,
public ImplementAcceptMethods<Mask, UserMask>
{
public:
/**
* An associated token, for Environment::unmasked_by_user. Might be empty,
* but is probably "user".
*
* \since 0.60
*/
virtual const std::string token() const;
};
/**
* An UnacceptedMask is a Mask that signifies that a particular value or
* combination of values in (for example) a MetadataCollectionKey or
* MetadataSpecTreeKey is not accepted by user configuration.
*
* \ingroup g_mask
* \since 0.26
* \nosubgrouping
*/
class PALUDIS_VISIBLE UnacceptedMask :
public Mask,
public ImplementAcceptMethods<Mask, UnacceptedMask>
{
public:
/**
* Fetch the raw name of the metadata key that is not accepted.
*
* \since 0.59
*/
virtual const std::string unaccepted_key_name() const = 0;
};
/**
* A RepositoryMask is a Mask that signifies that a PackageID has been
* marked as masked by a Repository.
*
* \ingroup g_mask
* \since 0.26
* \nosubgrouping
*/
class PALUDIS_VISIBLE RepositoryMask :
public Mask,
public ImplementAcceptMethods<Mask, RepositoryMask>
{
public:
/**
* An associated comment. Might be empty.
*
* \since 0.59
*/
virtual const std::string comment() const = 0;
/**
* An associated token, for Environment::unmasked_by_user. Might be empty.
*
* \since 0.59
*/
virtual const std::string token() const = 0;
/**
* The file whence the mask originates.
*
* \since 0.59
*/
virtual const FSPath mask_file() const = 0;
};
/**
* An UnsupportedMask is a Mask that signifies that a PackageID is not
* supported, for example because it is broken or because it uses an
* unrecognised EAPI.
*
* \ingroup g_mask
* \since 0.26
* \nosubgrouping
*/
class PALUDIS_VISIBLE UnsupportedMask :
public Mask,
public ImplementAcceptMethods<Mask, UnsupportedMask>
{
public:
/**
* An explanation of why we are unsupported.
*/
virtual const std::string explanation() const = 0;
};
/**
* An OverriddenMask holds a Mask and an explanation of why it has been overridden.
*
* \ingroup g_mask
* \since 0.34
*/
struct OverriddenMask
{
NamedValue<n::mask, std::shared_ptr<const Mask> > mask;
NamedValue<n::override_reason, MaskOverrideReason> override_reason;
};
}
#endif