blob: 4459fc4123b6e906afbdefa7933366ee865d39ab [file] [log] [blame]
#ifndef QPID_TYPES_VARIANT_H
#define QPID_TYPES_VARIANT_H
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include <list>
#include <map>
#include <ostream>
#include <string>
#include "Uuid.h"
#include "qpid/types/Exception.h"
#include "qpid/sys/IntegerTypes.h"
#include "qpid/types/ImportExport.h"
namespace qpid {
namespace types {
/**
* Thrown when an illegal conversion of a variant is attempted.
*/
struct QPID_TYPES_CLASS_EXTERN InvalidConversion : public Exception
{
InvalidConversion(const std::string& msg);
};
enum VariantType {
VAR_VOID = 0,
VAR_BOOL,
VAR_UINT8,
VAR_UINT16,
VAR_UINT32,
VAR_UINT64,
VAR_INT8,
VAR_INT16,
VAR_INT32,
VAR_INT64,
VAR_FLOAT,
VAR_DOUBLE,
VAR_STRING,
VAR_MAP,
VAR_LIST,
VAR_UUID
};
std::string getTypeName(VariantType type);
class VariantImpl;
/**
* Represents a value of variable type.
*/
class QPID_TYPES_CLASS_EXTERN Variant
{
public:
typedef std::map<std::string, Variant> Map;
typedef std::list<Variant> List;
QPID_TYPES_EXTERN Variant();
QPID_TYPES_EXTERN Variant(bool);
QPID_TYPES_EXTERN Variant(uint8_t);
QPID_TYPES_EXTERN Variant(uint16_t);
QPID_TYPES_EXTERN Variant(uint32_t);
QPID_TYPES_EXTERN Variant(uint64_t);
QPID_TYPES_EXTERN Variant(int8_t);
QPID_TYPES_EXTERN Variant(int16_t);
QPID_TYPES_EXTERN Variant(int32_t);
QPID_TYPES_EXTERN Variant(int64_t);
QPID_TYPES_EXTERN Variant(float);
QPID_TYPES_EXTERN Variant(double);
QPID_TYPES_EXTERN Variant(const std::string&);
QPID_TYPES_EXTERN Variant(const char*);
QPID_TYPES_EXTERN Variant(const Map&);
QPID_TYPES_EXTERN Variant(const List&);
QPID_TYPES_EXTERN Variant(const Variant&);
QPID_TYPES_EXTERN Variant(const Uuid&);
QPID_TYPES_EXTERN ~Variant();
QPID_TYPES_EXTERN VariantType getType() const;
QPID_TYPES_EXTERN bool isVoid() const;
QPID_TYPES_EXTERN Variant& operator=(bool);
QPID_TYPES_EXTERN Variant& operator=(uint8_t);
QPID_TYPES_EXTERN Variant& operator=(uint16_t);
QPID_TYPES_EXTERN Variant& operator=(uint32_t);
QPID_TYPES_EXTERN Variant& operator=(uint64_t);
QPID_TYPES_EXTERN Variant& operator=(int8_t);
QPID_TYPES_EXTERN Variant& operator=(int16_t);
QPID_TYPES_EXTERN Variant& operator=(int32_t);
QPID_TYPES_EXTERN Variant& operator=(int64_t);
QPID_TYPES_EXTERN Variant& operator=(float);
QPID_TYPES_EXTERN Variant& operator=(double);
QPID_TYPES_EXTERN Variant& operator=(const std::string&);
QPID_TYPES_EXTERN Variant& operator=(const char*);
QPID_TYPES_EXTERN Variant& operator=(const Map&);
QPID_TYPES_EXTERN Variant& operator=(const List&);
QPID_TYPES_EXTERN Variant& operator=(const Variant&);
QPID_TYPES_EXTERN Variant& operator=(const Uuid&);
/**
* Parses the argument and assigns itself the appropriate
* value. Recognises integers, doubles and booleans.
*/
QPID_TYPES_EXTERN Variant& parse(const std::string&);
QPID_TYPES_EXTERN bool asBool() const;
QPID_TYPES_EXTERN uint8_t asUint8() const;
QPID_TYPES_EXTERN uint16_t asUint16() const;
QPID_TYPES_EXTERN uint32_t asUint32() const;
QPID_TYPES_EXTERN uint64_t asUint64() const;
QPID_TYPES_EXTERN int8_t asInt8() const;
QPID_TYPES_EXTERN int16_t asInt16() const;
QPID_TYPES_EXTERN int32_t asInt32() const;
QPID_TYPES_EXTERN int64_t asInt64() const;
QPID_TYPES_EXTERN float asFloat() const;
QPID_TYPES_EXTERN double asDouble() const;
QPID_TYPES_EXTERN std::string asString() const;
QPID_TYPES_EXTERN Uuid asUuid() const;
QPID_TYPES_EXTERN operator bool() const;
QPID_TYPES_EXTERN operator uint8_t() const;
QPID_TYPES_EXTERN operator uint16_t() const;
QPID_TYPES_EXTERN operator uint32_t() const;
QPID_TYPES_EXTERN operator uint64_t() const;
QPID_TYPES_EXTERN operator int8_t() const;
QPID_TYPES_EXTERN operator int16_t() const;
QPID_TYPES_EXTERN operator int32_t() const;
QPID_TYPES_EXTERN operator int64_t() const;
QPID_TYPES_EXTERN operator float() const;
QPID_TYPES_EXTERN operator double() const;
QPID_TYPES_EXTERN operator std::string() const;
QPID_TYPES_EXTERN operator Uuid() const;
QPID_TYPES_EXTERN const Map& asMap() const;
QPID_TYPES_EXTERN Map& asMap();
QPID_TYPES_EXTERN const List& asList() const;
QPID_TYPES_EXTERN List& asList();
/**
* Unlike asString(), getString() will not do any conversions and
* will throw InvalidConversion if the type is not STRING.
*/
QPID_TYPES_EXTERN const std::string& getString() const;
QPID_TYPES_EXTERN std::string& getString();
QPID_TYPES_EXTERN void setEncoding(const std::string&);
QPID_TYPES_EXTERN const std::string& getEncoding() const;
QPID_TYPES_EXTERN bool isEqualTo(const Variant& a) const;
QPID_TYPES_EXTERN void reset();
private:
VariantImpl* impl;
};
#ifndef SWIG
QPID_TYPES_EXTERN std::ostream& operator<<(std::ostream& out, const Variant& value);
QPID_TYPES_EXTERN std::ostream& operator<<(std::ostream& out, const Variant::Map& map);
QPID_TYPES_EXTERN std::ostream& operator<<(std::ostream& out, const Variant::List& list);
QPID_TYPES_EXTERN bool operator==(const Variant& a, const Variant& b);
#endif
}} // namespace qpid::types
#endif /*!QPID_TYPES_VARIANT_H*/