Exheredludis/paludis/version_spec.hh
David Leverton 27173447c8 Unify =* behaviour
Gentoo changed =* to mean almost the same thing as it does in Exherbo
in bug 560466; the difference being that float-like components aren't
treated specially, for example 1.0123 doesn't match a dep saying
=1.012*.  Since nothing in Exherbo relies on this anyway, just make it
the same everywhere.
2015-11-08 22:31:38 +00:00

225 lines
6.4 KiB
C++

/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2005, 2006, 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_VERSION_SPEC_HH
#define PALUDIS_GUARD_PALUDIS_VERSION_SPEC_HH 1
#include <paludis/version_spec-fwd.hh>
#include <paludis/util/exception.hh>
#include <paludis/util/pimp.hh>
#include <paludis/util/operators.hh>
#include <paludis/util/named_value.hh>
#include <paludis/util/wrapped_forward_iterator.hh>
#include <iosfwd>
#include <string>
/** \file
* Declarations for VersionSpec classes.
*
* \ingroup g_names
*
* \section Examples
*
* - \ref example_version_spec.cc "example_version_spec.cc"
* - \ref example_version_operator.cc "example_version_operator.cc"
*/
namespace paludis
{
/**
* Thrown if a VersionSpec is created from an invalid version string.
*
* \ingroup g_exceptions
* \ingroup g_names
*/
class PALUDIS_VISIBLE BadVersionSpecError :
public NameError
{
public:
///\name Basic operations
///\{
BadVersionSpecError(const std::string & name) noexcept;
BadVersionSpecError(const std::string & name, const std::string & msg) noexcept;
///\}
};
namespace n
{
typedef Name<struct name_number_value> number_value;
typedef Name<struct name_text> text;
typedef Name<struct name_type> type;
}
/**
* A VersionSpec component part.
*
* This is mostly for use by the Exheres 'ever' API.
*
* The version 1.2x_pre3_rc-scm would be split up into these parts:
*
* - (type, number_value, text)
* - (vsct_number, "1", "1")
* - (vsct_number, "2", ".2")
* - (vsct_letter, "x", "x")
* - (vsct_pre, "3", "_pre3")
* - (vsct_rc, "MAX" "_rc0")
* - (vsct_scm, "0" "-scm")
*
* The type and number_value are mostly for internal use. In particular, the
* number_value is not always what you might expect it to be.
*
* The text includes any preceeding delimiter.
*
* \ingroup g_names
* \since 0.32
*/
struct VersionSpecComponent
{
NamedValue<n::number_value, std::string> number_value;
NamedValue<n::text, std::string> text;
NamedValue<n::type, VersionSpecComponentType> type;
};
/**
* A VersionSpec represents a version number (for example, 1.2.3b-r1).
*
* \ingroup g_names
*/
class PALUDIS_VISIBLE VersionSpec :
public relational_operators::HasRelationalOperators
{
friend std::ostream & operator<< (std::ostream &, const VersionSpec &);
private:
Pimp<VersionSpec> _imp;
public:
///\name Basic operations
///\{
/**
* Constructor.
*
* \param options \since 0.38
*/
VersionSpec(const std::string & text, const VersionSpecOptions & options);
/**
* Copy constructor.
*/
VersionSpec(const VersionSpec & other);
/**
* Destructor.
*/
~VersionSpec();
/**
* Assignment.
*/
const VersionSpec & operator= (const VersionSpec & other);
std::size_t hash() const PALUDIS_ATTRIBUTE((warn_unused_result));
///\}
///\name Comparison operators
///\{
/**
* Comparison function for ~ depend operator.
*/
bool tilde_compare(const VersionSpec & other) const;
/**
* Comparison function for ~> depend operator (gems).
*/
bool tilde_greater_compare(const VersionSpec & other) const;
/**
* Comparison function for =* depend operator.
*/
bool equal_star_compare(const VersionSpec & other) const;
/**
* Compare to another version.
*/
int compare(const VersionSpec & other) const;
bool operator== (const VersionSpec &) const;
bool operator< (const VersionSpec &) const;
///\}
/**
* Remove the revision part.
*/
VersionSpec remove_revision() const;
/**
* Revision part only (or "r0").
*/
std::string revision_only() const;
/**
* Bump ourself.
*
* This is used by the ~> operator. It returns a version where the
* next to last number is one greater (e.g. 5.3.1 => 5.4). Any non
* number parts are stripped (e.g. 1.2.3_alpha4-r5 => 1.3).
*/
VersionSpec bump() const;
/**
* Are we an -scm package, or something pretending to be one?
*/
bool is_scm() const;
/**
* Do we have a -try part?
*/
bool has_try_part() const;
/**
* Do we have an -scm part?
*
* Use is_scm() if -9999 etc is desired.
*/
bool has_scm_part() const;
/**
* Do we have a local revision (-r1.2...)?
*/
bool has_local_revision() const;
struct ConstIteratorTag;
typedef WrappedForwardIterator<ConstIteratorTag, const VersionSpecComponent> ConstIterator;
ConstIterator begin() const;
ConstIterator end() const;
};
extern template class PALUDIS_VISIBLE WrappedForwardIterator<VersionSpec::ConstIteratorTag, const VersionSpecComponent>;
}
#endif