You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2013/02/18 22:19:00 UTC
svn commit: r1447507 - in
/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util: UUID.cpp
UUID.h
Author: tabish
Date: Mon Feb 18 21:19:00 2013
New Revision: 1447507
URL: http://svn.apache.org/r1447507
Log:
internalize the apr_uuid bits so it can be removed later without affecting ABI. Also benefits the user since the APR includes aren't in the UUID.h
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.h
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.cpp?rev=1447507&r1=1447506&r2=1447507&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.cpp Mon Feb 18 21:19:00 2013
@@ -17,7 +17,9 @@
#include "UUID.h"
#include <apr_strings.h>
+#include <stdio.h>
#include <apr_md5.h>
+#include <apr_uuid.h>
#include <decaf/lang/exceptions/RuntimeException.h>
#include <decaf/lang/exceptions/UnsupportedOperationException.h>
#include <decaf/lang/exceptions/IllegalArgumentException.h>
@@ -28,18 +30,147 @@ using namespace decaf::util;
using namespace decaf::lang;
////////////////////////////////////////////////////////////////////////////////
-UUID::UUID(long long mostSigBits, long long leastSigBits) :
- apr_uuid(), mostSigBits(mostSigBits), leastSigBits(leastSigBits), uuidVersion(0) {
+namespace decaf {
+namespace util {
- memcpy(&apr_uuid.data[0], &mostSigBits, sizeof(long long));
- memcpy(&apr_uuid.data[sizeof(long long)], &leastSigBits, sizeof(long long));
+ class UUIDImpl {
+ private:
+
+ UUIDImpl(const UUIDImpl&);
+ UUIDImpl& operator= (const UUIDImpl&);
+
+ public:
+
+ unsigned char data[16];
+ unsigned long long mostSigBits;
+ unsigned long long leastSigBits;
+ int uuidVersion;
+
+ UUIDImpl() : mostSigBits(0), leastSigBits(0), uuidVersion(0) {
+ }
+
+ UUIDImpl(long long mostSigBits, long long leastSigBits) :
+ mostSigBits(mostSigBits), leastSigBits(leastSigBits), uuidVersion(0) {
+
+ memcpy(&data[0], &mostSigBits, sizeof(long long));
+ memcpy(&data[sizeof(long long)], &leastSigBits, sizeof(long long));
+
+ // Version indicator, set when a UUID is generated
+ this->uuidVersion = (int) (mostSigBits & 0x000000000000F000LL) >> 12;
+ }
+
+ void format(char *buffer) {
+ sprintf(buffer,
+ "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7],
+ data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15]);
+ }
+
+ private:
+
+ /* convert a pair of hex digits to an integer value [0,255] */
+ #if 'A' == 65
+ static unsigned char parseHexpair(const char* s) {
+ int result;
+ int temp;
+
+ result = s[0] - '0';
+ if (result > 48) {
+ result = (result - 39) << 4;
+ } else if (result > 16) {
+ result = (result - 7) << 4;
+ } else {
+ result = result << 4;
+ }
+
+ temp = s[1] - '0';
+ if (temp > 48) {
+ result |= temp - 39;
+ } else if (temp > 16) {
+ result |= temp - 7;
+ } else {
+ result |= temp;
+ }
+
+ return (unsigned char)result;
+ }
+ #else
+ static unsigned char parseHexpair(const char* s) {
+ int result;
+
+ if (isdigit(*s)) {
+ result = (*s - '0') << 4;
+ } else {
+ if (isupper(*s)) {
+ result = (*s - 'A' + 10) << 4;
+ } else {
+ result = (*s - 'a' + 10) << 4;
+ }
+ }
+
+ ++s;
+ if (isdigit(*s)) {
+ result |= (*s - '0');
+ } else {
+ if (isupper(*s)) {
+ result |= (*s - 'A' + 10);
+ } else {
+ result |= (*s - 'a' + 10);
+ }
+ }
+
+ return (unsigned char)result;
+ }
+ #endif
+
+ public:
+
+ void parse(const char* uuidString) {
+ int i;
+
+ for (i = 0; i < 36; ++i) {
+ char c = uuidString[i];
+ if (!isxdigit(c) && !(c == '-' && (i == 8 || i == 13 || i == 18 || i == 23)))
+ throw lang::exceptions::IllegalArgumentException(
+ __FILE__, __LINE__, "Invalid UUID String: ", uuidString);
+ }
+
+ if (uuidString[36] != '\0') {
+ throw lang::exceptions::IllegalArgumentException(
+ __FILE__, __LINE__, "Invalid UUID String: ", uuidString);
+ }
+
+ data[0] = parseHexpair(&uuidString[0]);
+ data[1] = parseHexpair(&uuidString[2]);
+ data[2] = parseHexpair(&uuidString[4]);
+ data[3] = parseHexpair(&uuidString[6]);
+
+ data[4] = parseHexpair(&uuidString[9]);
+ data[5] = parseHexpair(&uuidString[11]);
+
+ data[6] = parseHexpair(&uuidString[14]);
+ data[7] = parseHexpair(&uuidString[16]);
+
+ data[8] = parseHexpair(&uuidString[19]);
+ data[9] = parseHexpair(&uuidString[21]);
+
+ for (i = 6; i--;) {
+ data[10 + i] = parseHexpair(&uuidString[i*2+24]);
+ }
+ }
+ };
+
+}}
+
+////////////////////////////////////////////////////////////////////////////////
+UUID::UUID(long long mostSigBits, long long leastSigBits) : uuid(new UUIDImpl(mostSigBits, leastSigBits)) {
- // Version indicator, set when a UUID is generated
- this->uuidVersion = (int) (mostSigBits & 0x000000000000F000LL) >> 12;
}
////////////////////////////////////////////////////////////////////////////////
-UUID::~UUID() {}
+UUID::~UUID() {
+ delete this->uuid;
+}
////////////////////////////////////////////////////////////////////////////////
int UUID::compareTo(const UUID& value) const {
@@ -64,21 +195,21 @@ bool UUID::operator<(const UUID& value)
////////////////////////////////////////////////////////////////////////////////
std::string UUID::toString() const {
- char buffer[APR_UUID_FORMATTED_LENGTH + 1] = { 0 };
- apr_uuid_format(&buffer[0], &apr_uuid);
+ char buffer[37] = { 0 };
+ this->uuid->format(&buffer[0]);
return &buffer[0];
}
////////////////////////////////////////////////////////////////////////////////
long long UUID::getLeastSignificantBits() const {
- return this->leastSigBits;
+ return this->uuid->leastSigBits;
}
////////////////////////////////////////////////////////////////////////////////
long long UUID::getMostSignificantBits() const {
long long result = 0;
- memcpy(&result, &this->apr_uuid.data[sizeof(long long)], sizeof(long long));
- return this->mostSigBits;
+ memcpy(&result, &this->uuid->data[sizeof(long long)], sizeof(long long));
+ return this->uuid->mostSigBits;
}
////////////////////////////////////////////////////////////////////////////////
@@ -89,7 +220,7 @@ long long UUID::node() {
__FILE__, __LINE__, "UUID::node - Only a Version 1 UUID supports this operation.");
}
- return (this->leastSigBits & 0x0000FFFFFFFFFFFFULL);
+ return (this->uuid->leastSigBits & 0x0000FFFFFFFFFFFFULL);
}
////////////////////////////////////////////////////////////////////////////////
@@ -101,9 +232,9 @@ long long UUID::timestamp() {
}
// Mask out the version and shift values around to make time.
- long long timeLow = (mostSigBits & 0xFFFFFFFF00000000ULL) >> 32;
- long long timeMid = (mostSigBits & 0x00000000FFFF0000ULL) << 16;
- long long timeHigh = (mostSigBits & 0x0000000000000FFFULL) << 48;
+ long long timeLow = (uuid->mostSigBits & 0xFFFFFFFF00000000ULL) >> 32;
+ long long timeMid = (uuid->mostSigBits & 0x00000000FFFF0000ULL) << 16;
+ long long timeHigh = (uuid->mostSigBits & 0x0000000000000FFFULL) << 48;
return timeLow | timeMid | timeHigh;
}
@@ -116,19 +247,19 @@ int UUID::clockSequence() {
__FILE__, __LINE__, "UUID::node - Only a Version 1 UUID supports this operation.");
}
- return (int) ((this->leastSigBits & 0x3FFF000000000000ULL) >> 48);
+ return (int) ((this->uuid->leastSigBits & 0x3FFF000000000000ULL) >> 48);
}
////////////////////////////////////////////////////////////////////////////////
int UUID::variant() {
// determine variant field
- if ((this->leastSigBits & 0x8000000000000000ULL) == 0) {
+ if ((this->uuid->leastSigBits & 0x8000000000000000ULL) == 0) {
// MSB0 not set, NCS backwards compatibility variant
return 0;
- } else if ((this->leastSigBits & 0x4000000000000000ULL) != 0) {
+ } else if ((this->uuid->leastSigBits & 0x4000000000000000ULL) != 0) {
// MSB1 set, either MS reserved or future reserved
- return (int) ((this->leastSigBits & 0xE000000000000000ULL) >> 61);
+ return (int) ((this->uuid->leastSigBits & 0xE000000000000000ULL) >> 61);
}
// MSB1 not set, RFC 4122 variant
@@ -137,7 +268,7 @@ int UUID::variant() {
////////////////////////////////////////////////////////////////////////////////
int UUID::version() {
- return this->uuidVersion;
+ return this->uuid->uuidVersion;
}
////////////////////////////////////////////////////////////////////////////////
@@ -217,12 +348,9 @@ UUID UUID::nameUUIDFromBytes(const char*
////////////////////////////////////////////////////////////////////////////////
UUID UUID::fromString(const std::string& name) {
- apr_uuid_t temp;
+ UUIDImpl temp;
- if (apr_uuid_parse(&temp, name.c_str()) != APR_SUCCESS) {
- throw lang::exceptions::IllegalArgumentException(
- __FILE__, __LINE__, "UUID::fromString - Invalid UUID String: ", name.c_str());
- }
+ temp.parse(name.c_str());
long long mostSigBits = 0;
long long leastSigBits = 0;
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.h?rev=1447507&r1=1447506&r2=1447507&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.h (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/util/UUID.h Mon Feb 18 21:19:00 2013
@@ -20,12 +20,13 @@
#include <decaf/util/Config.h>
#include <decaf/lang/Comparable.h>
-#include <apr_uuid.h>
#include <string>
#include <vector>
-namespace decaf{
-namespace util{
+namespace decaf {
+namespace util {
+
+ class UUIDImpl;
/**
* A class that represents an immutable universally unique identifier (UUID).
@@ -65,17 +66,7 @@ namespace util{
class DECAF_API UUID : public lang::Comparable<UUID> {
private:
- // APR Uuid Type
- apr_uuid_t apr_uuid;
-
- // Copy of the High part of the data
- unsigned long long mostSigBits;
-
- // Copy of the Low part of the data
- unsigned long long leastSigBits;
-
- // Version indicator, set when a UUID is generated
- int uuidVersion;
+ UUIDImpl* uuid;
public: