From 3097509ae43d93c1832638f80ba2ad5810fbef44 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Mon, 21 Apr 2008 18:59:31 +0000 Subject: Better workaround for boost::ptr_map incompatibility between boost 1.33 and 1.34, based on public properties of ptr::map types rather than version numbers. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@650221 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/broker/Connection.cpp | 6 +-- cpp/src/qpid/broker/DtxManager.cpp | 8 +-- cpp/src/qpid/broker/PreviewConnection.cpp | 6 +-- cpp/src/qpid/broker/SemanticState.cpp | 12 ++--- cpp/src/qpid/ptr_map.h | 89 +++++-------------------------- cpp/src/tests/interop_runner.cpp | 2 +- 6 files changed, 30 insertions(+), 93 deletions(-) diff --git a/cpp/src/qpid/broker/Connection.cpp b/cpp/src/qpid/broker/Connection.cpp index ef1100a2ec..cfa722e130 100644 --- a/cpp/src/qpid/broker/Connection.cpp +++ b/cpp/src/qpid/broker/Connection.cpp @@ -40,7 +40,7 @@ using namespace boost; using namespace qpid::sys; using namespace qpid::framing; using namespace qpid::sys; -using namespace qpid::ptr_map; +using qpid::ptr_map_ptr; using qpid::management::ManagementAgent; using qpid::management::ManagementObject; using qpid::management::Manageable; @@ -143,7 +143,7 @@ void Connection::idleIn(){} void Connection::closed(){ // Physically closed, suspend open sessions. try { for (ChannelMap::iterator i = channels.begin(); i != channels.end(); ++i) - get_pointer(i)->localSuspend(); + ptr_map_ptr(i)->localSuspend(); while (!exclusiveQueues.empty()) { Queue::shared_ptr q(exclusiveQueues.front()); q->releaseExclusiveOwnership(); @@ -186,7 +186,7 @@ SessionHandler& Connection::getChannel(ChannelId id) { if (i == channels.end()) { i = channels.insert(id, new SessionHandler(*this, id)).first; } - return *get_pointer(i); + return *ptr_map_ptr(i); } ManagementObject::shared_ptr Connection::GetManagementObject (void) const diff --git a/cpp/src/qpid/broker/DtxManager.cpp b/cpp/src/qpid/broker/DtxManager.cpp index fb6b3f019e..47f389a57d 100644 --- a/cpp/src/qpid/broker/DtxManager.cpp +++ b/cpp/src/qpid/broker/DtxManager.cpp @@ -29,7 +29,7 @@ using boost::intrusive_ptr; using qpid::sys::Mutex; -using namespace qpid::ptr_map; +using qpid::ptr_map_ptr; using namespace qpid::broker; using namespace qpid::framing; @@ -95,7 +95,7 @@ DtxWorkRecord* DtxManager::getWork(const std::string& xid) if (i == work.end()) { throw InvalidArgumentException(QPID_MSG("Unrecognised xid " << xid)); } - return get_pointer(i); + return ptr_map_ptr(i); } void DtxManager::remove(const std::string& xid) @@ -116,7 +116,7 @@ DtxWorkRecord* DtxManager::createWork(std::string xid) if (i != work.end()) { throw CommandInvalidException(QPID_MSG("Xid " << xid << " is already known (use 'join' to add work to an existing xid)")); } else { - return get_pointer(work.insert(xid, new DtxWorkRecord(xid, store)).first); + return ptr_map_ptr(work.insert(xid, new DtxWorkRecord(xid, store)).first); } } @@ -147,7 +147,7 @@ void DtxManager::timedout(const std::string& xid) if (i == work.end()) { QPID_LOG(warning, "Transaction timeout failed: no record for xid"); } else { - get_pointer(i)->timedout(); + ptr_map_ptr(i)->timedout(); //TODO: do we want to have a timed task to cleanup, or can we rely on an explicit completion? //timer.add(intrusive_ptr(new DtxCleanup(60*30/*30 mins*/, *this, xid))); } diff --git a/cpp/src/qpid/broker/PreviewConnection.cpp b/cpp/src/qpid/broker/PreviewConnection.cpp index ad4497b24e..2643c85824 100644 --- a/cpp/src/qpid/broker/PreviewConnection.cpp +++ b/cpp/src/qpid/broker/PreviewConnection.cpp @@ -40,7 +40,7 @@ using namespace boost; using namespace qpid::sys; using namespace qpid::framing; using namespace qpid::sys; -using namespace qpid::ptr_map; +using qpid::ptr_map_ptr; using qpid::management::ManagementAgent; using qpid::management::ManagementObject; using qpid::management::Manageable; @@ -139,7 +139,7 @@ void PreviewConnection::idleIn(){} void PreviewConnection::closed(){ // Physically closed, suspend open sessions. try { for (ChannelMap::iterator i = channels.begin(); i != channels.end(); ++i) - get_pointer(i)->localSuspend(); + ptr_map_ptr(i)->localSuspend(); while (!exclusiveQueues.empty()) { Queue::shared_ptr q(exclusiveQueues.front()); q->releaseExclusiveOwnership(); @@ -183,7 +183,7 @@ PreviewSessionHandler& PreviewConnection::getChannel(ChannelId id) { if (i == channels.end()) { i = channels.insert(id, new PreviewSessionHandler(*this, id)).first; } - return *get_pointer(i); + return *ptr_map_ptr(i); } ManagementObject::shared_ptr PreviewConnection::GetManagementObject (void) const diff --git a/cpp/src/qpid/broker/SemanticState.cpp b/cpp/src/qpid/broker/SemanticState.cpp index c2f6e3c307..2c2d099fb1 100644 --- a/cpp/src/qpid/broker/SemanticState.cpp +++ b/cpp/src/qpid/broker/SemanticState.cpp @@ -58,7 +58,7 @@ using boost::intrusive_ptr; using namespace qpid::broker; using namespace qpid::framing; using namespace qpid::sys; -using namespace qpid::ptr_map; +using qpid::ptr_map_ptr; SemanticState::SemanticState(DeliveryAdapter& da, SessionContext& ss) : session(ss), @@ -77,7 +77,7 @@ SemanticState::SemanticState(DeliveryAdapter& da, SessionContext& ss) SemanticState::~SemanticState() { //cancel all consumers for (ConsumerImplMap::iterator i = consumers.begin(); i != consumers.end(); i++) { - cancel(*get_pointer(i)); + cancel(*ptr_map_ptr(i)); } if (dtxBuffer.get()) { @@ -105,7 +105,7 @@ void SemanticState::consume(DeliveryToken::shared_ptr token, string& tagInOut, void SemanticState::cancel(const string& tag){ ConsumerImplMap::iterator i = consumers.find(tag); if (i != consumers.end()) { - cancel(*get_pointer(i)); + cancel(*ptr_map_ptr(i)); consumers.erase(i); //should cancel all unacked messages for this consumer so that //they are not redelivered on recovery @@ -429,7 +429,7 @@ void SemanticState::ack(DeliveryId first, DeliveryId last, bool cumulative) void SemanticState::requestDispatch() { for (ConsumerImplMap::iterator i = consumers.begin(); i != consumers.end(); i++) { - requestDispatch(*get_pointer(i)); + requestDispatch(*ptr_map_ptr(i)); } } @@ -445,7 +445,7 @@ void SemanticState::complete(DeliveryRecord& delivery) delivery.subtractFrom(outstanding); ConsumerImplMap::iterator i = consumers.find(delivery.getTag()); if (i != consumers.end()) { - get_pointer(i)->complete(delivery); + ptr_map_ptr(i)->complete(delivery); } } @@ -514,7 +514,7 @@ SemanticState::ConsumerImpl& SemanticState::find(const std::string& destination) if (i == consumers.end()) { throw NotFoundException(QPID_MSG("Unknown destination " << destination)); } else { - return *get_pointer(i); + return *ptr_map_ptr(i); } } diff --git a/cpp/src/qpid/ptr_map.h b/cpp/src/qpid/ptr_map.h index e9a1d507a6..92da79a2e5 100644 --- a/cpp/src/qpid/ptr_map.h +++ b/cpp/src/qpid/ptr_map.h @@ -23,98 +23,35 @@ */ #include -#include +#include +#include namespace qpid { -namespace ptr_map { /** @file * Workaround for API change between boost 1.33 and 1.34. * * To be portable across these versions, code using boost::ptr_map - * iterators should use get_pointer(i) to get the pointer from - * a boost::ptr_map iterator. + * iterators should use ptr_map_ptr(i) to get the pointer from + * boost::ptr_map::iterator i. * * Can be removed when we no longer support platforms on 1.33. * * @see http://www.boost.org/libs/ptr_container/doc/ptr_container.html#upgrading-from-boost-v-1-33 */ -#include -#if (BOOST_VERSION < 103400) +typedef boost::is_same::iterator::value_type, + int> IsOldPtrMap; -template -typename PtrMapIter::pointer get_pointer(const PtrMapIter& i) -{ return &*i; } +template +typename boost::enable_if::type +ptr_map_ptr(const Iter& i) { return &*i; } -#else +template +typename boost::disable_if::type +ptr_map_ptr(const Iter& i) { return i->second; } -template -typename boost::remove_const::type -get_pointer(const PtrMapIter& i) -{ return i->second; } - -#endif - -}} // namespace qpid::ptr_map - -#endif /*!QPID_PTR_MAP*/ -#ifndef QPID_PTR_MAP -#define QPID_PTR_MAP - -/* - * - * 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 -#include - -namespace qpid { -namespace ptr_map { - -/** @file - * Workaround for API change between boost 1.33 and 1.34. - * - * To be portable across these versions, code using boost::ptr_map - * iterators should use get_pointer(i) to get the pointer from - * a boost::ptr_map iterator. - * - * Can be removed when we no longer support platforms on 1.33. - * - * @see http://www.boost.org/libs/ptr_container/doc/ptr_container.html#upgrading-from-boost-v-1-33 - */ -#if (BOOST_VERSION < 103400) - -template -typename PtrMapIter::pointer get_pointer(const PtrMapIter& i) -{ return &*i; } - -#else - -template -typename PtrMapIter::value_type::second_type get_pointer(const PtrMapIter& i) -{ return i->second; } - -#endif - -}} // namespace qpid::ptr_map +} // namespace qpid #endif /*!QPID_PTR_MAP*/ diff --git a/cpp/src/tests/interop_runner.cpp b/cpp/src/tests/interop_runner.cpp index 824af7f3b7..1d77408eff 100644 --- a/cpp/src/tests/interop_runner.cpp +++ b/cpp/src/tests/interop_runner.cpp @@ -203,7 +203,7 @@ void Listener::shutdown() bool Listener::invite(const string& name) { TestMap::iterator i = tests.find(name); - test = (i != tests.end()) ? qpid::ptr_map::get_pointer(i) : 0; + test = (i != tests.end()) ? qpid::ptr_map_ptr(i) : 0; return test; } -- cgit v1.2.1