summaryrefslogtreecommitdiff
path: root/qpid/cpp/include/qpid/types/Variant.h
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp/include/qpid/types/Variant.h')
-rw-r--r--qpid/cpp/include/qpid/types/Variant.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/qpid/cpp/include/qpid/types/Variant.h b/qpid/cpp/include/qpid/types/Variant.h
new file mode 100644
index 0000000000..4459fc4123
--- /dev/null
+++ b/qpid/cpp/include/qpid/types/Variant.h
@@ -0,0 +1,181 @@
+#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*/