Exheredludis/paludis/util/named_value.hh
Saleem Abdulrasool a473745932 paludis: use default'ed methods
Convert the library to use C++11 default members.  Converted using clang-tidy.
2016-12-03 19:02:49 -08:00

137 lines
4.0 KiB
C++

/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2008, 2009, 2010 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_NAMED_VALUE_HH
#define PALUDIS_GUARD_PALUDIS_UTIL_NAMED_VALUE_HH 1
#include <paludis/util/named_value-fwd.hh>
#include <paludis/util/tribool.hh>
#include <utility>
#include <type_traits>
#include <string>
namespace paludis
{
/**
* A NamedValue is used to hold a member of type V_ for a class.
*
* NamedValue is used to simplify 'plain old data' style classes, and to
* provide compiler-time-checked named parameters for functions. Use
* thestruct.themember() and thestruct.themember() = to access the real
* underlying values.
*
* Usually a struct containing NamedValue objects will be constructed using
* the make_named_values() function. For each NamedValue object,
* make_named_values() takes a parameter in the form
* <code>n::whatever_K_is() = the_value</code>.
*
* In all cases, NamedValue members are listed in name-sorted order, and
* the same name is used for K_ and the member name.
*
* \ingroup g_oo
*/
template <typename K_, typename V_>
class NamedValue
{
static_assert(! std::is_reference<V_>::value, "Tried to make a NamedValue hold a reference");
private:
V_ _value;
public:
typedef K_ KeyType;
typedef V_ ValueType;
template <typename T_>
NamedValue(const NamedValue<K_, T_> & v) :
_value(v())
{
}
template <typename T_>
NamedValue(NamedValue<K_, T_> && v) :
_value(std::move(v()))
{
}
explicit NamedValue(const V_ & v) :
_value(v)
{
}
explicit NamedValue(V_ && v) :
_value(v)
{
}
NamedValue(const NamedValue & v) = default;
NamedValue(NamedValue && v) :
_value(std::move(v._value))
{
}
NamedValue & operator=(const NamedValue & v) = default;
V_ & operator() ()
{
return _value;
}
const V_ & operator() () const
{
return _value;
}
};
/**
* A Name is used to make the assignment for NamedValue keys work.
*
* \ingroup g_oo
*/
template <typename T_>
class Name
{
public:
template <typename V_>
NamedValue<Name<T_>, V_> operator= (const V_ & v) const
{
return NamedValue<Name<T_>, V_>(v);
}
template <typename V_>
NamedValue<Name<T_>, typename std::remove_reference<V_>::type> operator= (V_ && v) const
{
return NamedValue<Name<T_>, typename std::remove_reference<V_>::type>(v);
}
NamedValue<Name<T_>, std::string> operator= (const char * const v) const
{
return NamedValue<Name<T_>, std::string>(std::string(v));
}
NamedValue<Name<T_>, Tribool> operator= (TriboolIndeterminateValueType) const
{
return NamedValue<Name<T_>, Tribool>(Tribool(indeterminate));
}
};
}
#endif