00001 #ifndef QPID_TYPES_VARIANT_H
00002 #define QPID_TYPES_VARIANT_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <list>
00025 #include <map>
00026 #include <ostream>
00027 #include <string>
00028 #include "Uuid.h"
00029 #include "qpid/types/Exception.h"
00030 #include "qpid/sys/IntegerTypes.h"
00031 #include "qpid/types/ImportExport.h"
00032
00033 namespace qpid {
00034 namespace types {
00035
00039 struct QPID_TYPES_CLASS_EXTERN InvalidConversion : public Exception
00040 {
00041 QPID_TYPES_EXTERN InvalidConversion(const std::string& msg);
00042 QPID_TYPES_EXTERN ~InvalidConversion() throw();
00043 };
00044
00045 enum VariantType {
00046 VAR_VOID = 0,
00047 VAR_BOOL,
00048 VAR_UINT8,
00049 VAR_UINT16,
00050 VAR_UINT32,
00051 VAR_UINT64,
00052 VAR_INT8,
00053 VAR_INT16,
00054 VAR_INT32,
00055 VAR_INT64,
00056 VAR_FLOAT,
00057 VAR_DOUBLE,
00058 VAR_STRING,
00059 VAR_MAP,
00060 VAR_LIST,
00061 VAR_UUID
00062 };
00063
00064 QPID_TYPES_EXTERN std::string getTypeName(VariantType type);
00065
00066 QPID_TYPES_EXTERN bool isIntegerType(VariantType type);
00067
00068 class VariantImpl;
00069
00073 class QPID_TYPES_CLASS_EXTERN Variant
00074 {
00075 public:
00076 typedef std::map<std::string, Variant> Map;
00077 typedef std::list<Variant> List;
00078
00079 QPID_TYPES_EXTERN Variant();
00080 QPID_TYPES_EXTERN Variant(bool);
00081 QPID_TYPES_EXTERN Variant(uint8_t);
00082 QPID_TYPES_EXTERN Variant(uint16_t);
00083 QPID_TYPES_EXTERN Variant(uint32_t);
00084 QPID_TYPES_EXTERN Variant(uint64_t);
00085 QPID_TYPES_EXTERN Variant(int8_t);
00086 QPID_TYPES_EXTERN Variant(int16_t);
00087 QPID_TYPES_EXTERN Variant(int32_t);
00088 QPID_TYPES_EXTERN Variant(int64_t);
00089 QPID_TYPES_EXTERN Variant(float);
00090 QPID_TYPES_EXTERN Variant(double);
00091 QPID_TYPES_EXTERN Variant(const std::string&);
00092 QPID_TYPES_EXTERN Variant(const char*);
00093 QPID_TYPES_EXTERN Variant(const Map&);
00094 QPID_TYPES_EXTERN Variant(const List&);
00095 QPID_TYPES_EXTERN Variant(const Variant&);
00096 QPID_TYPES_EXTERN Variant(const Uuid&);
00097
00098 QPID_TYPES_EXTERN ~Variant();
00099
00100 QPID_TYPES_EXTERN VariantType getType() const;
00101 QPID_TYPES_EXTERN bool isVoid() const;
00102
00103 QPID_TYPES_EXTERN Variant& operator=(bool);
00104 QPID_TYPES_EXTERN Variant& operator=(uint8_t);
00105 QPID_TYPES_EXTERN Variant& operator=(uint16_t);
00106 QPID_TYPES_EXTERN Variant& operator=(uint32_t);
00107 QPID_TYPES_EXTERN Variant& operator=(uint64_t);
00108 QPID_TYPES_EXTERN Variant& operator=(int8_t);
00109 QPID_TYPES_EXTERN Variant& operator=(int16_t);
00110 QPID_TYPES_EXTERN Variant& operator=(int32_t);
00111 QPID_TYPES_EXTERN Variant& operator=(int64_t);
00112 QPID_TYPES_EXTERN Variant& operator=(float);
00113 QPID_TYPES_EXTERN Variant& operator=(double);
00114 QPID_TYPES_EXTERN Variant& operator=(const std::string&);
00115 QPID_TYPES_EXTERN Variant& operator=(const char*);
00116 QPID_TYPES_EXTERN Variant& operator=(const Map&);
00117 QPID_TYPES_EXTERN Variant& operator=(const List&);
00118 QPID_TYPES_EXTERN Variant& operator=(const Variant&);
00119 QPID_TYPES_EXTERN Variant& operator=(const Uuid&);
00120
00125 QPID_TYPES_EXTERN Variant& parse(const std::string&);
00126
00127 QPID_TYPES_EXTERN bool asBool() const;
00128 QPID_TYPES_EXTERN uint8_t asUint8() const;
00129 QPID_TYPES_EXTERN uint16_t asUint16() const;
00130 QPID_TYPES_EXTERN uint32_t asUint32() const;
00131 QPID_TYPES_EXTERN uint64_t asUint64() const;
00132 QPID_TYPES_EXTERN int8_t asInt8() const;
00133 QPID_TYPES_EXTERN int16_t asInt16() const;
00134 QPID_TYPES_EXTERN int32_t asInt32() const;
00135 QPID_TYPES_EXTERN int64_t asInt64() const;
00136 QPID_TYPES_EXTERN float asFloat() const;
00137 QPID_TYPES_EXTERN double asDouble() const;
00138 QPID_TYPES_EXTERN std::string asString() const;
00139 QPID_TYPES_EXTERN Uuid asUuid() const;
00140
00141 QPID_TYPES_EXTERN operator bool() const;
00142 QPID_TYPES_EXTERN operator uint8_t() const;
00143 QPID_TYPES_EXTERN operator uint16_t() const;
00144 QPID_TYPES_EXTERN operator uint32_t() const;
00145 QPID_TYPES_EXTERN operator uint64_t() const;
00146 QPID_TYPES_EXTERN operator int8_t() const;
00147 QPID_TYPES_EXTERN operator int16_t() const;
00148 QPID_TYPES_EXTERN operator int32_t() const;
00149 QPID_TYPES_EXTERN operator int64_t() const;
00150 QPID_TYPES_EXTERN operator float() const;
00151 QPID_TYPES_EXTERN operator double() const;
00152 QPID_TYPES_EXTERN operator std::string() const;
00153 QPID_TYPES_EXTERN operator Uuid() const;
00154
00155 QPID_TYPES_EXTERN const Map& asMap() const;
00156 QPID_TYPES_EXTERN Map& asMap();
00157 QPID_TYPES_EXTERN const List& asList() const;
00158 QPID_TYPES_EXTERN List& asList();
00163 QPID_TYPES_EXTERN const std::string& getString() const;
00164 QPID_TYPES_EXTERN std::string& getString();
00165
00166 QPID_TYPES_EXTERN void setEncoding(const std::string&);
00167 QPID_TYPES_EXTERN const std::string& getEncoding() const;
00168
00169 QPID_TYPES_EXTERN bool isEqualTo(const Variant& a) const;
00170
00171 QPID_TYPES_EXTERN void reset();
00172 private:
00173 VariantImpl* impl;
00174 };
00175
00176 #ifndef SWIG
00177 QPID_TYPES_EXTERN std::ostream& operator<<(std::ostream& out, const Variant& value);
00178 QPID_TYPES_EXTERN std::ostream& operator<<(std::ostream& out, const Variant::Map& map);
00179 QPID_TYPES_EXTERN std::ostream& operator<<(std::ostream& out, const Variant::List& list);
00180 QPID_TYPES_EXTERN bool operator==(const Variant& a, const Variant& b);
00181 QPID_TYPES_EXTERN bool operator!=(const Variant& a, const Variant& b);
00182 #endif
00183 }}
00184
00185 #endif