/usr/include/camp/value.hpp is in libcamp0.7-dev 0.7.1.1-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | /****************************************************************************
**
** Copyright (C) 2009-2010 TECHNOGERMA Systems France and/or its subsidiary(-ies).
** Contact: Technogerma Systems France Information (contact@technogerma.fr)
**
** This file is part of the CAMP library.
**
** CAMP is free software: you can redistribute it and/or modify
** it under the terms of the GNU Lesser General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** CAMP 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 Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public License
** along with CAMP. If not, see <http://www.gnu.org/licenses/>.
**
****************************************************************************/
#ifndef CAMP_VALUE_HPP
#define CAMP_VALUE_HPP
#include <camp/config.hpp>
#include <camp/type.hpp>
#include <camp/enumobject.hpp>
#include <camp/userobject.hpp>
#include <camp/valuemapper.hpp>
#include <camp/detail/valueimpl.hpp>
#ifndef Q_MOC_RUN
#include <boost/operators.hpp>
#endif
#include <iosfwd>
#include <string>
// Visual C++ produces some unnecessary warnings with boost/variant.hpp
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4100) // "assignment operator could not be generated"
#pragma warning(disable: 4512) // "unreferenced formal parameter"
#endif
#include <boost/variant.hpp>
#ifdef _MSC_VER
#pragma warning(pop)
#endif
namespace camp
{
/**
* \brief Variant class which is used to wrap values in the CAMP system
*
* The Value class can store any type of variable, and supports conversion
* to any type compatible with the stored type.
*
* \code
* camp::Value v1 = true;
* camp::Value v2 = 10;
* camp::Value v3 = "24.5";
* camp::Value v4 = myObject;
*
* bool b = v1; // b == true
* std::string s = v2; // s == "10"
* float f = v3; // f == 24.5
* MyObject o = v4; // o == myObject
* \endcode
*
* It also supports unary and binary visitation for type-safe processing
* depending on the stored type.
*
* \remark The set of supported types can be extended by specializing the
* camp_ext::ValueMapper template.
*
* \sa ValueVisitor, camp_ext::ValueMapper
*/
class CAMP_API Value : boost::totally_ordered<Value>
{
public:
/**
* \brief Default constructor, constructs a null value
*/
Value();
/**
* \brief Copy constructor
*
* \param other Value to copy
*/
Value(const Value& other);
/**
* \brief Construct the value from a variable of type T
*
* \param val Value to store
*/
template <typename T>
Value(const T& val);
/**
* \brief Return the CAMP type of the value
*
* \return Type of the value
*/
Type type() const;
/**
* \brief Convert the value to the type T
*
* \return Value converted to T
*
* \throw BadType the stored value is not convertible to T
*/
template <typename T>
T to() const;
/**
* \brief Cast operator to implicitely convert the value to a type T
*
* \return Value converted to T
*
* \throw BadType the stored value is not convertible to T
*/
template <typename T>
operator T() const;
/**
* \brief Check if the stored value can be converted to a type T
*
* If this function returns true, then calling to<T>() or operator T() will succeed.
*
* \return True if conversion is possible, false otherwise
*/
template <typename T>
bool isCompatible() const;
/**
* \brief Visit the value with a unary visitor
*
* Using this function allows to dispatch an operation depending on the stored type.
*
* \param visitor Visitor to apply (must inherit from ValueVisitor<type_to_return>)
*
* \return Value returned by the visitor
*/
template <typename T>
typename T::result_type visit(T visitor) const;
/**
* \brief Visit the value and another one with a binary visitor
*
* Using this function allows to dispatch a binary operation depending on the stored type
* of both values.
*
* \param visitor Visitor to apply (must inherit from ValueVisitor<type_to_return>)
* \param other Other value to visit
*
* \return Value returned by the visitor
*/
template <typename T>
typename T::result_type visit(T visitor, const Value& other) const;
/**
* \brief Operator == to compare equality between two values
*
* Two values are equal if their CAMP type and value are equal.
* It uses the == operator of the stored type.
*
* \param other Value to compare with this
*
* \return True if both values are the same, false otherwise
*/
bool operator==(const Value& other) const;
/**
* \brief Operator < to compare two values
*
* \param other Value to compare with this
*
* \return True if this < other
*/
bool operator<(const Value& other) const;
public:
/**
* \brief Special Value instance representing an empty value
*/
static const Value nothing;
private:
typedef boost::variant<NoType, bool, long, double, std::string, EnumObject, UserObject> Variant;
Variant m_value; ///< Stored value
Type m_type; ///< CAMP type of the value
};
/**
* \brief Overload of operator >> to extract a camp::Value from a standard stream
*
* \param stream Source input stream
* \param value Value to fill
*
* \return Reference to the input stream
*/
CAMP_API std::istream& operator>>(std::istream& stream, Value& value);
/**
* \brief Overload of operator << to print a camp::Value into a standard stream
*
* \param stream Target output stream
* \param value Value to print
*
* \return Reference to the output stream
*/
CAMP_API std::ostream& operator<<(std::ostream& stream, const Value& value);
} // namespace camp
#include <camp/value.inl>
#endif // CAMP_VALUE_HPP
|