diff options
author | Gordon Sim <gsim@apache.org> | 2010-01-15 15:17:01 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2010-01-15 15:17:01 +0000 |
commit | 04db3be5386fbc601d11fab7da48b592c997c590 (patch) | |
tree | 732ee326d1b8f7d065fe11dd86c86437705aa465 /qpid/cpp/include | |
parent | 9bd81bba1b45eb52b07d30d2a44e7ef669769de4 (diff) | |
download | qpid-python-04db3be5386fbc601d11fab7da48b592c997c590.tar.gz |
QPID-2323: add a Uuid type and allow it as the value of a Variant.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@899657 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/include')
-rw-r--r-- | qpid/cpp/include/qpid/framing/FieldValue.h | 16 | ||||
-rw-r--r-- | qpid/cpp/include/qpid/messaging/Uuid.h | 93 | ||||
-rw-r--r-- | qpid/cpp/include/qpid/messaging/Variant.h | 8 |
3 files changed, 116 insertions, 1 deletions
diff --git a/qpid/cpp/include/qpid/framing/FieldValue.h b/qpid/cpp/include/qpid/framing/FieldValue.h index 7b4dee1529..e5746c8065 100644 --- a/qpid/cpp/include/qpid/framing/FieldValue.h +++ b/qpid/cpp/include/qpid/framing/FieldValue.h @@ -99,6 +99,7 @@ class FieldValue { template <class T, int W> T getIntegerValue() const; template <class T, int W> T getFloatingPointValue() const; + template <int W> void getFixedWidthValue(unsigned char*) const; template <class T> bool get(T&) const; protected: @@ -209,6 +210,16 @@ inline T FieldValue::getFloatingPointValue() const { } } +template <int W> void FieldValue::getFixedWidthValue(unsigned char* value) const +{ + FixedWidthValue<W>* const fwv = dynamic_cast< FixedWidthValue<W>* const>(data.get()); + if (fwv) { + for (uint i = 0; i < W; ++i) value[i] = fwv->rawOctets()[i]; + } else { + throw InvalidConversionException(); + } +} + template <> inline float FieldValue::get<float>() const { return getFloatingPointValue<float, 4>(); @@ -417,6 +428,11 @@ class ListValue : public FieldValue { QPID_COMMON_EXTERN ListValue(const List&); }; +class UuidValue : public FieldValue { + public: + QPID_COMMON_EXTERN UuidValue(const unsigned char*); +}; + template <class T> bool getEncodedValue(FieldTable::ValuePtr vptr, T& value) { diff --git a/qpid/cpp/include/qpid/messaging/Uuid.h b/qpid/cpp/include/qpid/messaging/Uuid.h new file mode 100644 index 0000000000..d1caac6013 --- /dev/null +++ b/qpid/cpp/include/qpid/messaging/Uuid.h @@ -0,0 +1,93 @@ +#ifndef QPID_MESSAGING_UUID_H +#define QPID_MESSAGING_UUID_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 "qpid/client/ClientImportExport.h" +#include <iosfwd> + +namespace qpid { +namespace messaging { + +class Uuid +{ + public: + static const size_t SIZE; + /** + * If unique is true, this will generate a new unique uuid, if not + * it will construct a null uuid. + */ + QPID_CLIENT_EXTERN Uuid(bool unique=false); + QPID_CLIENT_EXTERN Uuid(const Uuid&); + QPID_CLIENT_EXTERN Uuid& operator=(const Uuid&); + /** Copy the UUID from data16, which must point to a 16-byte UUID */ + QPID_CLIENT_EXTERN Uuid(const unsigned char* data16); + + /** Set to a new unique identifier. */ + QPID_CLIENT_EXTERN void generate(); + + /** Set to all zeros. */ + QPID_CLIENT_EXTERN void clear(); + + /** Test for null (all zeros). */ + QPID_CLIENT_EXTERN bool isNull() const; + QPID_CLIENT_EXTERN operator bool() const; + QPID_CLIENT_EXTERN bool operator!() const; + + /** String value in format 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb. */ + QPID_CLIENT_EXTERN std::string str() const; + + QPID_CLIENT_EXTERN size_t size() const; + QPID_CLIENT_EXTERN const unsigned char* data() const; + + friend bool operator==(const Uuid&, const Uuid&); + friend bool operator!=(const Uuid&, const Uuid&); + friend bool operator<(const Uuid&, const Uuid&); + friend bool operator>(const Uuid&, const Uuid&); + friend bool operator<=(const Uuid&, const Uuid&); + friend bool operator>=(const Uuid&, const Uuid&); + friend std::ostream& operator<<(std::ostream&, Uuid); + friend std::istream& operator>>(std::istream&, Uuid&); + + private: + unsigned char bytes[16]; +}; + +/** Returns true if the uuids are equal, false otherwise. **/ +QPID_CLIENT_EXTERN bool operator==(const Uuid&, const Uuid&); +/** Returns true if the uuids are NOT equal, false if they are. **/ +QPID_CLIENT_EXTERN bool operator!=(const Uuid&, const Uuid&); + +QPID_CLIENT_EXTERN bool operator<(const Uuid&, const Uuid&); +QPID_CLIENT_EXTERN bool operator>(const Uuid&, const Uuid&); +QPID_CLIENT_EXTERN bool operator<=(const Uuid&, const Uuid&); +QPID_CLIENT_EXTERN bool operator>=(const Uuid&, const Uuid&); + +/** Print in format 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb. */ +QPID_CLIENT_EXTERN std::ostream& operator<<(std::ostream&, Uuid); + +/** Read from format 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb. */ +QPID_CLIENT_EXTERN std::istream& operator>>(std::istream&, Uuid&); + +}} // namespace qpid::messaging + +#endif /*!QPID_MESSAGING_UUID_H*/ diff --git a/qpid/cpp/include/qpid/messaging/Variant.h b/qpid/cpp/include/qpid/messaging/Variant.h index de5cef4d67..0bf62a9909 100644 --- a/qpid/cpp/include/qpid/messaging/Variant.h +++ b/qpid/cpp/include/qpid/messaging/Variant.h @@ -25,6 +25,7 @@ #include <map> #include <ostream> #include <string> +#include "Uuid.h" #include "qpid/Exception.h" #include "qpid/sys/IntegerTypes.h" #include "qpid/client/ClientImportExport.h" @@ -55,7 +56,8 @@ enum VariantType { VAR_DOUBLE, VAR_STRING, VAR_MAP, - VAR_LIST + VAR_LIST, + VAR_UUID }; class VariantImpl; @@ -86,6 +88,7 @@ class Variant QPID_CLIENT_EXTERN Variant(const Map&); QPID_CLIENT_EXTERN Variant(const List&); QPID_CLIENT_EXTERN Variant(const Variant&); + QPID_CLIENT_EXTERN Variant(const Uuid&); QPID_CLIENT_EXTERN ~Variant(); @@ -108,6 +111,7 @@ class Variant QPID_CLIENT_EXTERN Variant& operator=(const Map&); QPID_CLIENT_EXTERN Variant& operator=(const List&); QPID_CLIENT_EXTERN Variant& operator=(const Variant&); + QPID_CLIENT_EXTERN Variant& operator=(const Uuid&); QPID_CLIENT_EXTERN bool asBool() const; QPID_CLIENT_EXTERN uint8_t asUint8() const; @@ -121,6 +125,7 @@ class Variant QPID_CLIENT_EXTERN float asFloat() const; QPID_CLIENT_EXTERN double asDouble() const; QPID_CLIENT_EXTERN std::string asString() const; + QPID_CLIENT_EXTERN Uuid asUuid() const; QPID_CLIENT_EXTERN operator bool() const; QPID_CLIENT_EXTERN operator uint8_t() const; @@ -134,6 +139,7 @@ class Variant QPID_CLIENT_EXTERN operator float() const; QPID_CLIENT_EXTERN operator double() const; QPID_CLIENT_EXTERN operator const char*() const; + QPID_CLIENT_EXTERN operator Uuid() const; QPID_CLIENT_EXTERN const Map& asMap() const; QPID_CLIENT_EXTERN Map& asMap(); |