summaryrefslogtreecommitdiff
path: root/cpp/src/qmf/ObjectIdImpl.cpp
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2009-05-22 21:40:57 +0000
committerTed Ross <tross@apache.org>2009-05-22 21:40:57 +0000
commit36319d26120c163c0c36598038859dad716ac358 (patch)
tree5e3087d14842f7ac87aaa89513ff204e0f1d40de /cpp/src/qmf/ObjectIdImpl.cpp
parent2cd113fc9e5c810ca8045dc1d70bcd6efd685f47 (diff)
downloadqpid-python-36319d26120c163c0c36598038859dad716ac358.tar.gz
QPID-1874 - First drop of the second-generation QMF libraries.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@777720 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qmf/ObjectIdImpl.cpp')
-rw-r--r--cpp/src/qmf/ObjectIdImpl.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/cpp/src/qmf/ObjectIdImpl.cpp b/cpp/src/qmf/ObjectIdImpl.cpp
new file mode 100644
index 0000000000..83fd6cc34f
--- /dev/null
+++ b/cpp/src/qmf/ObjectIdImpl.cpp
@@ -0,0 +1,192 @@
+/*
+ * 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 "ObjectIdImpl.h"
+#include <stdlib.h>
+
+using namespace std;
+using namespace qmf;
+using qpid::framing::Buffer;
+
+
+void AgentAttachment::setBanks(uint32_t broker, uint32_t agent)
+{
+ first =
+ ((uint64_t) (broker & 0x000fffff)) << 28 |
+ ((uint64_t) (agent & 0x0fffffff));
+}
+
+ObjectIdImpl::ObjectIdImpl(Buffer& buffer) : envelope(new ObjectId(this)), agent(0)
+{
+ decode(buffer);
+}
+
+ObjectIdImpl::ObjectIdImpl(AgentAttachment* a, uint8_t flags, uint16_t seq, uint64_t object) :
+ envelope(new ObjectId(this)), agent(a)
+{
+ first =
+ ((uint64_t) (flags & 0x0f)) << 60 |
+ ((uint64_t) (seq & 0x0fff)) << 48;
+ second = object;
+}
+
+void ObjectIdImpl::decode(Buffer& buffer)
+{
+ first = buffer.getLongLong();
+ second = buffer.getLongLong();
+}
+
+void ObjectIdImpl::encode(Buffer& buffer) const
+{
+ if (agent == 0)
+ buffer.putLongLong(first);
+ else
+ buffer.putLongLong(first | agent->first);
+ buffer.putLongLong(second);
+}
+
+void ObjectIdImpl::fromString(const std::string& repr)
+{
+#define FIELDS 5
+#if defined (_WIN32) && !defined (atoll)
+# define atoll(X) _atoi64(X)
+#endif
+
+ std::string copy(repr.c_str());
+ char* cText;
+ char* field[FIELDS];
+ bool atFieldStart = true;
+ int idx = 0;
+
+ cText = const_cast<char*>(copy.c_str());
+ for (char* cursor = cText; *cursor; cursor++) {
+ if (atFieldStart) {
+ if (idx >= FIELDS)
+ return; // TODO error
+ field[idx++] = cursor;
+ atFieldStart = false;
+ } else {
+ if (*cursor == '-') {
+ *cursor = '\0';
+ atFieldStart = true;
+ }
+ }
+ }
+
+ if (idx != FIELDS)
+ return; // TODO error
+
+ first = (atoll(field[0]) << 60) +
+ (atoll(field[1]) << 48) +
+ (atoll(field[2]) << 28) +
+ atoll(field[3]);
+ second = atoll(field[4]);
+ agent = 0;
+}
+
+bool ObjectIdImpl::operator==(const ObjectIdImpl& other) const
+{
+ uint64_t otherFirst = agent == 0 ? other.first : other.first & 0xffff000000000000LL;
+
+ return first == otherFirst && second == other.second;
+}
+
+bool ObjectIdImpl::operator<(const ObjectIdImpl& other) const
+{
+ uint64_t otherFirst = agent == 0 ? other.first : other.first & 0xffff000000000000LL;
+
+ return (first < otherFirst) || ((first == otherFirst) && (second < other.second));
+}
+
+bool ObjectIdImpl::operator>(const ObjectIdImpl& other) const
+{
+ uint64_t otherFirst = agent == 0 ? other.first : other.first & 0xffff000000000000LL;
+
+ return (first > otherFirst) || ((first == otherFirst) && (second > other.second));
+}
+
+
+//==================================================================
+// Wrappers
+//==================================================================
+
+ObjectId::ObjectId()
+{
+ impl = new ObjectIdImpl(this);
+}
+
+ObjectId::ObjectId(ObjectIdImpl* i)
+{
+ impl = i;
+}
+
+ObjectId::~ObjectId()
+{
+ delete impl;
+}
+
+uint64_t ObjectId::getObjectNum() const
+{
+ return impl->getObjectNum();
+}
+
+uint32_t ObjectId::getObjectNumHi() const
+{
+ return impl->getObjectNumHi();
+}
+
+uint32_t ObjectId::getObjectNumLo() const
+{
+ return impl->getObjectNumLo();
+}
+
+bool ObjectId::isDurable() const
+{
+ return impl->isDurable();
+}
+
+bool ObjectId::operator==(const ObjectId& other) const
+{
+ return *impl == *other.impl;
+}
+
+bool ObjectId::operator!=(const ObjectId& other) const
+{
+ return !(*impl == *other.impl);
+}
+
+bool ObjectId::operator<(const ObjectId& other) const
+{
+ return *impl < *other.impl;
+}
+
+bool ObjectId::operator>(const ObjectId& other) const
+{
+ return *impl > *other.impl;
+}
+
+bool ObjectId::operator<=(const ObjectId& other) const
+{
+ return !(*impl > *other.impl);
+}
+
+bool ObjectId::operator>=(const ObjectId& other) const
+{
+ return !(*impl < *other.impl);
+}