You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by nm...@apache.org on 2007/01/24 21:36:45 UTC
svn commit: r499559 - in
/incubator/activemq/activemq-cpp/trunk/activemq-cpp: src/main/
src/main/activemq/core/ src/main/activemq/util/ vs2005-build/
Author: nmittler
Date: Wed Jan 24 12:36:44 2007
New Revision: 499559
URL: http://svn.apache.org/viewvc?view=rev&rev=499559
Log:
Making Session.close() also close any non-closed child producers and consumers.
Added:
incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Set.h
Modified:
incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am
incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.cpp
incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.h
incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Map.h
incubator/activemq/activemq-cpp/trunk/activemq-cpp/vs2005-build/vs2005-activemq.vcproj
Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am?view=diff&rev=499559&r1=499558&r2=499559
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am Wed Jan 24 12:36:44 2007
@@ -246,6 +246,7 @@
activemq/util/Map.h \
activemq/util/Math.h \
activemq/util/PrimitiveMap.h \
+ activemq/util/Set.h \
activemq/util/URISupport.h \
cms/DeliveryMode.h \
cms/TemporaryQueue.h \
Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.cpp?view=diff&rev=499559&r1=499558&r2=499559
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.cpp Wed Jan 24 12:36:44 2007
@@ -61,7 +61,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-ActiveMQSession::~ActiveMQSession(void)
+ActiveMQSession::~ActiveMQSession()
{
try
{
@@ -73,7 +73,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-void ActiveMQSession::close(void) throw ( cms::CMSException )
+void ActiveMQSession::close() throw ( cms::CMSException )
{
// If we're already close, just get outta' here.
if( closed ) {
@@ -82,26 +82,42 @@
try
{
- // Mark as done.
- closed = true;
+ // Get the complete list of closeable session resources.
+ std::vector<cms::Closeable*> allResources;
+ synchronized( &closableSessionResources ) {
+ allResources = closableSessionResources.toArray();
+ }
+ // Close all of the resources.
+ for( unsigned int ix=0; ix<allResources.size(); ++ix ){
+ cms::Closeable* resource = allResources[ix];
+ try{
+ resource->close();
+ } catch( cms::CMSException& ex ){
+ /* Absorb */
+ }
+ }
+
// Destroy the Transaction
if( transaction != NULL ){
delete transaction;
transaction = NULL;
}
-
+
// Destroy this sessions resources
connection->getConnectionData()->
getConnector()->destroyResource( sessionInfo );
sessionInfo = NULL;
+
+ // Now indicate that this session is closed.
+ closed = true;
}
AMQ_CATCH_NOTHROW( ActiveMQException )
AMQ_CATCHALL_NOTHROW( )
}
////////////////////////////////////////////////////////////////////////////////
-void ActiveMQSession::commit(void) throw ( cms::CMSException )
+void ActiveMQSession::commit() throw ( cms::CMSException )
{
try
{
@@ -120,7 +136,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-void ActiveMQSession::rollback(void) throw ( cms::CMSException )
+void ActiveMQSession::rollback() throw ( cms::CMSException )
{
try
{
@@ -194,13 +210,21 @@
"ActiveMQSession::createConsumer - Session Already Closed" );
}
+ // Create the consumer instance.
ActiveMQConsumer* consumer = new ActiveMQConsumer(
connection->getConnectionData()->getConnector()->
createConsumer( destination,
sessionInfo,
selector,
noLocal ), this );
+
+ // Add the consumer to the map of closeable session resources.
+ synchronized( &closableSessionResources ) {
+ closableSessionResources.add( consumer );
+ }
+ // Register this consumer as a listener of messages from the
+ // connection.
connection->addMessageListener(
consumer->getConsumerInfo()->getConsumerId(), consumer );
@@ -227,10 +251,18 @@
"ActiveMQSession::createProducer - Session Already Closed" );
}
+ // Create the consumer instance.
ActiveMQConsumer* consumer = new ActiveMQConsumer(
connection->getConnectionData()->getConnector()->
createDurableConsumer( destination, sessionInfo, name, selector, noLocal ), this );
+ // Add the consumer to the map of closeable session resources.
+ synchronized( &closableSessionResources ) {
+ closableSessionResources.add( consumer );
+ }
+
+ // Register the consumer as a listener of messages from the
+ // connection.
connection->addMessageListener(
consumer->getConsumerInfo()->getConsumerId(), consumer );
@@ -254,9 +286,17 @@
"ActiveMQSession::createProducer - Session Already Closed" );
}
- return new ActiveMQProducer(
+ // Create the producer instance.
+ ActiveMQProducer* producer = new ActiveMQProducer(
connection->getConnectionData()->getConnector()->
createProducer( destination, sessionInfo ), this );
+
+ // Add the producer to the map of closeable session resources.
+ synchronized( &closableSessionResources ) {
+ closableSessionResources.add( producer );
+ }
+
+ return producer;
}
AMQ_CATCH_RETHROW( ActiveMQException )
AMQ_CATCHALL_THROW( ActiveMQException )
@@ -303,7 +343,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-cms::TemporaryQueue* ActiveMQSession::createTemporaryQueue(void)
+cms::TemporaryQueue* ActiveMQSession::createTemporaryQueue()
throw ( cms::CMSException )
{
try
@@ -324,7 +364,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-cms::TemporaryTopic* ActiveMQSession::createTemporaryTopic(void)
+cms::TemporaryTopic* ActiveMQSession::createTemporaryTopic()
throw ( cms::CMSException )
{
try
@@ -345,7 +385,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-cms::Message* ActiveMQSession::createMessage(void)
+cms::Message* ActiveMQSession::createMessage()
throw ( cms::CMSException )
{
try
@@ -365,7 +405,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-cms::BytesMessage* ActiveMQSession::createBytesMessage(void)
+cms::BytesMessage* ActiveMQSession::createBytesMessage()
throw ( cms::CMSException )
{
try
@@ -403,7 +443,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-cms::TextMessage* ActiveMQSession::createTextMessage(void)
+cms::TextMessage* ActiveMQSession::createTextMessage()
throw ( cms::CMSException )
{
try
@@ -439,7 +479,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-cms::MapMessage* ActiveMQSession::createMapMessage(void)
+cms::MapMessage* ActiveMQSession::createMapMessage()
throw ( cms::CMSException )
{
try
@@ -460,14 +500,14 @@
}
////////////////////////////////////////////////////////////////////////////////
-cms::Session::AcknowledgeMode ActiveMQSession::getAcknowledgeMode(void) const
+cms::Session::AcknowledgeMode ActiveMQSession::getAcknowledgeMode() const
{
return sessionInfo != NULL ?
sessionInfo->getAckMode() : Session::AUTO_ACKNOWLEDGE;
}
////////////////////////////////////////////////////////////////////////////////
-bool ActiveMQSession::isTransacted(void) const
+bool ActiveMQSession::isTransacted() const
{
return sessionInfo != NULL ?
sessionInfo->getAckMode() == Session::SESSION_TRANSACTED : false;
@@ -554,6 +594,14 @@
transaction->removeFromTransaction( consumer );
}
}
+
+ // Remove the entry from the session resource map if it's there
+ cms::Closeable* closeableResource = dynamic_cast<cms::Closeable*>(resource);
+ if( closeableResource != NULL ){
+ synchronized( &closableSessionResources ) {
+ closableSessionResources.remove( closeableResource );
+ }
+ }
// Free its resources.
connection->getConnectionData()->
@@ -564,7 +612,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-cms::ExceptionListener* ActiveMQSession::getExceptionListener(void)
+cms::ExceptionListener* ActiveMQSession::getExceptionListener()
{
if( connection != NULL )
{
Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.h?view=diff&rev=499559&r1=499558&r2=499559
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQSession.h Wed Jan 24 12:36:44 2007
@@ -21,6 +21,8 @@
#include <cms/ExceptionListener.h>
#include <activemq/connector/SessionInfo.h>
#include <activemq/core/ActiveMQSessionResource.h>
+#include <activemq/util/Set.h>
+#include <set>
namespace activemq{
namespace core{
@@ -36,17 +38,30 @@
{
private:
- // SessionInfo for this Session
+ /**
+ * SessionInfo for this Session
+ */
connector::SessionInfo* sessionInfo;
- // Transaction Management object
+ /**
+ * Transaction Management object
+ */
ActiveMQTransaction* transaction;
- // Connection
+ /**
+ * Connection
+ */
ActiveMQConnection* connection;
- // Bool to indicate if this session was closed.
+ /**
+ * Bool to indicate if this session was closed.
+ */
bool closed;
+
+ /**
+ * The set of closable session resources (consumers and producers).
+ */
+ util::Set<cms::Closeable*> closableSessionResources;
public:
@@ -54,7 +69,7 @@
const util::Properties& properties,
ActiveMQConnection* connection );
- virtual ~ActiveMQSession(void);
+ virtual ~ActiveMQSession();
public: // Implements Mehtods
@@ -62,21 +77,21 @@
* Closes the Session
* @throw CMSException
*/
- virtual void close(void) throw ( cms::CMSException );
+ virtual void close() throw ( cms::CMSException );
/**
* Commits all messages done in this transaction and releases any
* locks currently held.
* @throws CMSException
*/
- virtual void commit(void) throw ( cms::CMSException );
+ virtual void commit() throw ( cms::CMSException );
/**
* Rollsback all messages done in this transaction and releases any
* locks currently held.
* @throws CMSException
*/
- virtual void rollback(void) throw ( cms::CMSException );
+ virtual void rollback() throw ( cms::CMSException );
/**
* Creates a MessageConsumer for the specified destination.
@@ -160,28 +175,28 @@
* Creates a TemporaryQueue object.
* @throws CMSException
*/
- virtual cms::TemporaryQueue* createTemporaryQueue(void)
+ virtual cms::TemporaryQueue* createTemporaryQueue()
throw ( cms::CMSException );
/**
* Creates a TemporaryTopic object.
* @throws CMSException
*/
- virtual cms::TemporaryTopic* createTemporaryTopic(void)
+ virtual cms::TemporaryTopic* createTemporaryTopic()
throw ( cms::CMSException );
/**
* Creates a new Message
* @throws CMSException
*/
- virtual cms::Message* createMessage(void)
+ virtual cms::Message* createMessage()
throw ( cms::CMSException );
/**
* Creates a BytesMessage
* @throws CMSException
*/
- virtual cms::BytesMessage* createBytesMessage(void)
+ virtual cms::BytesMessage* createBytesMessage()
throw ( cms::CMSException );
/**
@@ -199,7 +214,7 @@
* Creates a new TextMessage
* @throws CMSException
*/
- virtual cms::TextMessage* createTextMessage(void)
+ virtual cms::TextMessage* createTextMessage()
throw ( cms::CMSException );
/**
@@ -214,20 +229,20 @@
* Creates a new TextMessage
* @throws CMSException
*/
- virtual cms::MapMessage* createMapMessage(void)
+ virtual cms::MapMessage* createMapMessage()
throw ( cms::CMSException );
/**
* Returns the acknowledgement mode of the session.
* @return the Sessions Acknowledge Mode
*/
- virtual cms::Session::AcknowledgeMode getAcknowledgeMode(void) const;
+ virtual cms::Session::AcknowledgeMode getAcknowledgeMode() const;
/**
* Gets if the Sessions is a Transacted Session
* @return transacted true - false.
*/
- virtual bool isTransacted(void) const;
+ virtual bool isTransacted() const;
public: // ActiveMQSession specific Methods
@@ -268,14 +283,14 @@
* exceptions that occur in the context of another thread.
* @returns cms::ExceptionListener pointer or NULL
*/
- virtual cms::ExceptionListener* getExceptionListener(void);
+ virtual cms::ExceptionListener* getExceptionListener();
/**
* Gets the Session Information object for this session, if the
* session is closed than this returns null
* @return SessionInfo Pointer
*/
- virtual connector::SessionInfo* getSessionInfo(void) {
+ virtual connector::SessionInfo* getSessionInfo() {
return sessionInfo;
}
Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Map.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Map.h?view=diff&rev=499559&r1=499558&r2=499559
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Map.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Map.h Wed Jan 24 12:36:44 2007
@@ -21,6 +21,8 @@
#include <map>
#include <vector>
#include <activemq/exceptions/NoSuchElementException.h>
+#include <activemq/concurrent/Synchronizable.h>
+#include <activemq/concurrent/Mutex.h>
namespace activemq{
namespace util{
@@ -30,18 +32,39 @@
* a more user-friendly interface and to provide common
* functions that do not exist in std::map.
*/
- template <typename K, typename V> class Map
+ template <typename K, typename V> class Map : public concurrent::Synchronizable
{
private:
std::map<K,V> valueMap;
+ concurrent::Mutex mutex;
public:
+ /**
+ * Default constructor - does nothing.
+ */
Map(){};
+
+ /**
+ * Copy constructor - copies the content of the given map into this
+ * one.
+ * @param source The source map.
+ */
+ Map( const Map& source ){
+ copy( source );
+ }
+
virtual ~Map(){};
/**
+ * Copies the content of the source map into this map. Erases
+ * all existing data in this map.
+ * @param source The source object to copy from.
+ */
+ virtual void copy( const Map& source );
+
+ /**
* Removes all keys and values from this map.
*/
virtual void clear();
@@ -105,7 +128,87 @@
* @return the entire set of values in this map as a std::vector.
*/
virtual std::vector<V> getValues() const;
+
+ public: // Methods from Synchronizable
+
+ /**
+ * Locks the object.
+ * @throws ActiveMQException
+ */
+ virtual void lock() throw(exceptions::ActiveMQException) {
+ mutex.lock();
+ }
+
+ /**
+ * Unlocks the object.
+ * @throws ActiveMQException
+ */
+ virtual void unlock() throw(exceptions::ActiveMQException) {
+ mutex.unlock();
+ }
+
+ /**
+ * Waits on a signal from this object, which is generated
+ * by a call to Notify. Must have this object locked before
+ * calling.
+ * @throws ActiveMQException
+ */
+ virtual void wait() throw(exceptions::ActiveMQException) {
+ mutex.wait();
+ }
+
+ /**
+ * Waits on a signal from this object, which is generated
+ * by a call to Notify. Must have this object locked before
+ * calling. This wait will timeout after the specified time
+ * interval.
+ * @param millisecs the time in millisecsonds to wait, or
+ * WAIT_INIFINITE
+ * @throws ActiveMQException
+ */
+ virtual void wait(unsigned long millisecs)
+ throw(exceptions::ActiveMQException) {
+ mutex.wait(millisecs);
+ }
+
+ /**
+ * Signals a waiter on this object that it can now wake
+ * up and continue. Must have this object locked before
+ * calling.
+ * @throws ActiveMQException
+ */
+ virtual void notify() throw( exceptions::ActiveMQException ) {
+ mutex.notify();
+ }
+
+ /**
+ * Signals the waiters on this object that it can now wake
+ * up and continue. Must have this object locked before
+ * calling.
+ * @throws ActiveMQException
+ */
+ virtual void notifyAll() throw( exceptions::ActiveMQException ) {
+ mutex.notifyAll();
+ }
};
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename K, typename V>
+ void Map<K,V>::copy( const Map<K,V>& source ) {
+
+ // Get an iterator to the beginning of the source map.
+ typename std::map<K,V>::const_iterator iter;
+ iter = source.valueMap.begin();
+
+ // Erase the content of this object.
+ clear();
+
+ // Add all of the entries to this map.
+ for( ; iter != source.valueMap.end(); iter++ ){
+ setValue( iter->first, iter->second );
+ }
+
+ }
////////////////////////////////////////////////////////////////////////////
template <typename K, typename V>
Added: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Set.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Set.h?view=auto&rev=499559
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Set.h (added)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/util/Set.h Wed Jan 24 12:36:44 2007
@@ -0,0 +1,231 @@
+/*
+ * 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.
+ */
+
+#ifndef ACTIVEMQ_UTIL_SET_H_
+#define ACTIVEMQ_UTIL_SET_H_
+
+#include <set>
+#include <vector>
+#include <activemq/exceptions/NoSuchElementException.h>
+#include <activemq/concurrent/Synchronizable.h>
+#include <activemq/concurrent/Mutex.h>
+
+namespace activemq{
+namespace util{
+
+ /**
+ * Map template that wraps around a std::map to provide
+ * a more user-friendly interface and to provide common
+ * functions that do not exist in std::map.
+ */
+ template <typename E> class Set : public concurrent::Synchronizable
+ {
+ private:
+
+ std::set<E> values;
+ concurrent::Mutex mutex;
+
+ public:
+
+ /**
+ * Default constructor - does nothing.
+ */
+ Set(){};
+
+ /**
+ * Copy constructor - copies the content of the given set into this
+ * one.
+ * @param source The source set.
+ */
+ Set( const Set& source ){
+ copy( source );
+ }
+
+ virtual ~Set(){};
+
+ /**
+ * Copies the content of the source set into this set. Erases
+ * all existing data in this st.
+ * @param source The source object to copy from.
+ */
+ virtual void copy( const Set& source );
+
+ /**
+ * Removes all values from this set.
+ */
+ virtual void clear();
+
+ /**
+ * Indicates whether or this set contains the given value.
+ * @param value The value to look up.
+ * @return true if this set contains the value, otherwise false.
+ */
+ virtual bool contains( const E& value ) const;
+
+ /**
+ * @return if the set contains any element or not, TRUE or FALSE
+ */
+ virtual bool isEmpty() const;
+
+ /**
+ * @return The number of elements in this set.
+ */
+ virtual unsigned int size() const;
+
+ /**
+ * Adds the given value to the set.
+ * @param value The value to add.
+ */
+ virtual void add( const E& value );
+
+ /**
+ * Removes the value from the set.
+ * @param value The value to be removed.
+ */
+ virtual void remove( const E& value );
+
+ /**
+ * @return the all values in this set as a std::vector.
+ */
+ virtual std::vector<E> toArray() const;
+
+ public: // Methods from Synchronizable
+
+ /**
+ * Locks the object.
+ * @throws ActiveMQException
+ */
+ virtual void lock() throw(exceptions::ActiveMQException) {
+ mutex.lock();
+ }
+
+ /**
+ * Unlocks the object.
+ * @throws ActiveMQException
+ */
+ virtual void unlock() throw(exceptions::ActiveMQException) {
+ mutex.unlock();
+ }
+
+ /**
+ * Waits on a signal from this object, which is generated
+ * by a call to Notify. Must have this object locked before
+ * calling.
+ * @throws ActiveMQException
+ */
+ virtual void wait() throw(exceptions::ActiveMQException) {
+ mutex.wait();
+ }
+
+ /**
+ * Waits on a signal from this object, which is generated
+ * by a call to Notify. Must have this object locked before
+ * calling. This wait will timeout after the specified time
+ * interval.
+ * @param millisecs the time in millisecsonds to wait, or
+ * WAIT_INIFINITE
+ * @throws ActiveMQException
+ */
+ virtual void wait(unsigned long millisecs)
+ throw(exceptions::ActiveMQException) {
+ mutex.wait(millisecs);
+ }
+
+ /**
+ * Signals a waiter on this object that it can now wake
+ * up and continue. Must have this object locked before
+ * calling.
+ * @throws ActiveMQException
+ */
+ virtual void notify() throw( exceptions::ActiveMQException ) {
+ mutex.notify();
+ }
+
+ /**
+ * Signals the waiters on this object that it can now wake
+ * up and continue. Must have this object locked before
+ * calling.
+ * @throws ActiveMQException
+ */
+ virtual void notifyAll() throw( exceptions::ActiveMQException ) {
+ mutex.notifyAll();
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename E>
+ void Set<E>::copy( const Set<E>& source ) {
+
+ // Add all of the entries to this map.
+ values = source.values;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename E>
+ void Set<E>::clear(){
+ values.clear();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename E>
+ bool Set<E>::contains(const E& value) const{
+ typename std::set<E>::const_iterator iter;
+ iter = values.find(value);
+ return iter != values.end();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename E>
+ bool Set<E>::isEmpty() const{
+ return values.empty();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename E>
+ unsigned int Set<E>::size() const{
+ return values.size();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename E>
+ void Set<E>::add( const E& value ){
+ values.insert(value);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename E>
+ void Set<E>::remove( const E& value ){
+ values.erase(value);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ template <typename E>
+ std::vector<E> Set<E>::toArray() const{
+ std::vector<E> valueArray(values.size());
+
+ typename std::set<E>::const_iterator iter;
+ iter=values.begin();
+ for( int ix=0; iter != values.end(); ++iter, ++ix ){
+ valueArray.push_back( *iter );
+ }
+
+ return valueArray;
+ }
+
+}}
+
+#endif /*ACTIVEMQ_UTIL_SET_H_*/
Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/vs2005-build/vs2005-activemq.vcproj
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/vs2005-build/vs2005-activemq.vcproj?view=diff&rev=499559&r1=499558&r2=499559
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/vs2005-build/vs2005-activemq.vcproj (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/vs2005-build/vs2005-activemq.vcproj Wed Jan 24 12:36:44 2007
@@ -328,6 +328,10 @@
>
</File>
<File
+ RelativePath="..\src\main\activemq\util\Set.h"
+ >
+ </File>
+ <File
RelativePath="..\src\main\activemq\util\SimpleProperties.h"
>
</File>