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 2009/02/04 21:54:26 UTC
svn commit: r740875 - in /activemq/activemq-cpp/trunk/src:
main/decaf/lang/Pointer.h main/decaf/util/Comparator.h
main/decaf/util/Map.h test/activemq/commands/BrokerIdTest.cpp
test/activemq/commands/BrokerIdTest.h test/testRegistry.cpp
Author: tabish
Date: Wed Feb 4 20:54:25 2009
New Revision: 740875
URL: http://svn.apache.org/viewvc?rev=740875&view=rev
Log:
Adds the ability to define what the comparison is for map keys, defaults to the standard std::less comparator. Completes the definition of the Comparator interface in Util, adds a PointerComparator to the Pointer class so that the elements in a Pointer can be compared based on the actual contained objects and not just the underlying pointer value. Adds some test cases to validate these classes.
Modified:
activemq/activemq-cpp/trunk/src/main/decaf/lang/Pointer.h
activemq/activemq-cpp/trunk/src/main/decaf/util/Comparator.h
activemq/activemq-cpp/trunk/src/main/decaf/util/Map.h
activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.cpp
activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.h
activemq/activemq-cpp/trunk/src/test/testRegistry.cpp
Modified: activemq/activemq-cpp/trunk/src/main/decaf/lang/Pointer.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/lang/Pointer.h?rev=740875&r1=740874&r2=740875&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/lang/Pointer.h (original)
+++ activemq/activemq-cpp/trunk/src/main/decaf/lang/Pointer.h Wed Feb 4 20:54:25 2009
@@ -21,6 +21,7 @@
#include <decaf/util/Config.h>
#include <decaf/lang/exceptions/NullPointerException.h>
#include <decaf/util/concurrent/atomic/AtomicInteger.h>
+#include <decaf/util/Comparator.h>
#include <memory>
namespace decaf {
@@ -357,6 +358,35 @@
return right.get() != left;
}
+ /**
+ * This implementation of Comparator is designed to allows objects in a Collection
+ * to be sorted or tested for equality based on the value of the Object being Pointed
+ * to and not the value of the contained pointer in the Pointer instance. This can
+ * be useful in the case where a series of values in a Collection is more efficiently
+ * accessed in the Objects Natural Order and not the underlying pointers location in
+ * memory.
+ * <p>
+ * Also this allows Pointer objects that Point to different instances of the same type
+ * to be compared based on the comparison of the object itself and not just the value of
+ * the pointer.
+ */
+ template< typename T, typename R = AtomicRefCounter<T> >
+ class PointerComparator : public decaf::util::Comparator< Pointer<T,R> > {
+ public:
+
+ // Allows for operator less on types that implement Comparable or provide
+ // a workable operator <
+ virtual bool operator() ( const Pointer<T,R>& left, const Pointer<T,R>& right ) const {
+ return *left < *right;
+ }
+
+ // Requires that the type in the pointer is an instance of a Comparable.
+ virtual int compare( const Pointer<T,R>& left, const Pointer<T,R>& right ) const {
+ return left->compareTo( *right );
+ }
+
+ };
+
}}
////////////////////////////////////////////////////////////////////////////////
Modified: activemq/activemq-cpp/trunk/src/main/decaf/util/Comparator.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/util/Comparator.h?rev=740875&r1=740874&r2=740875&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/util/Comparator.h (original)
+++ activemq/activemq-cpp/trunk/src/main/decaf/util/Comparator.h Wed Feb 4 20:54:25 2009
@@ -19,6 +19,7 @@
#define _DECAF_UTIL_COMPARATOR_H_
#include <decaf/util/Config.h>
+#include <algorithm>
namespace decaf{
namespace util{
@@ -35,13 +36,23 @@
* every e1 and e2 in S.
*/
template<typename T>
- class Comparator
- {
+ class Comparator : public std::binary_function< T, T, bool > {
public:
virtual ~Comparator() {}
/**
+ * Implementation of the Binary function interface as a means of allowing
+ * a Comparator to be passed to an STL Map for use as the sorting criteria.
+ *
+ * @param left - the Left hand side operand.
+ * @param right - the Right hand side operand.
+ *
+ * @return true if the vale of left is less than the value of right.
+ */
+ virtual bool operator() ( const T&, const T& ) const = 0;
+
+ /**
* Compares its two arguments for order. Returns a negative integer, zero,
* or a positive integer as the first argument is less than, equal to, or
* greater than the second.
@@ -67,7 +78,7 @@
* @returns a negative integer, zero, or a positive integer as the first
* argument is less than, equal to, or greater than the second.
*/
- virtual int compare( const E& o1, const E& o2 ) = 0;
+ virtual int compare( const T& o1, const T& o2 ) const = 0;
};
Modified: activemq/activemq-cpp/trunk/src/main/decaf/util/Map.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/util/Map.h?rev=740875&r1=740874&r2=740875&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/util/Map.h (original)
+++ activemq/activemq-cpp/trunk/src/main/decaf/util/Map.h Wed Feb 4 20:54:25 2009
@@ -36,7 +36,7 @@
public concurrent::Synchronizable {
private:
- std::map<K,V> valueMap;
+ std::map<K,V, COMPARE> valueMap;
concurrent::Mutex mutex;
public:
Modified: activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.cpp?rev=740875&r1=740874&r2=740875&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.cpp (original)
+++ activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.cpp Wed Feb 4 20:54:25 2009
@@ -18,15 +18,90 @@
#include "BrokerIdTest.h"
#include <activemq/commands/BrokerId.h>
+#include <decaf/util/Map.h>
+#include <decaf/lang/Pointer.h>
+#include <decaf/lang/Comparable.h>
+
+////////////////////////////////////////////////////////////////////////////////
+namespace activemq{
+namespace commands{
+
+ struct BrokerIdComparitor :
+ public std::binary_function< activemq::commands::BrokerId*,
+ activemq::commands::BrokerId*, bool>
+ {
+ bool operator() ( const activemq::commands::BrokerId* left,
+ const activemq::commands::BrokerId* right ) const
+ {
+ if( left == NULL && right == NULL ) {
+ return false;
+ } else if( left == NULL && right != NULL ) {
+ return true;
+ } else if( left != NULL && right == NULL ) {
+ return false;
+ }
+
+ return left->compareTo( *right ) == -1;
+ }
+ };
+
+}}
using namespace std;
using namespace activemq;
using namespace activemq::commands;
+using namespace decaf;
+using namespace decaf::lang;
+using namespace decaf::util;
+
+////////////////////////////////////////////////////////////////////////////////
+void BrokerIdTest::test() {
+
+ BrokerId myCommand2;
+ BrokerId myCommand3;
+ BrokerId myCommand1;
+ CPPUNIT_ASSERT( myCommand1.getDataStructureType() == BrokerId::ID_BROKERID );
+
+ myCommand1.setValue( "A" );
+ myCommand2.setValue( "B" );
+ myCommand3.setValue( "C" );
+
+ Map< BrokerId*, int, BrokerIdComparitor > testMap;
+
+ testMap.setValue( &myCommand1, 0 );
+ testMap.setValue( &myCommand3, 0 );
+ testMap.setValue( &myCommand2, 0 );
+
+ CPPUNIT_ASSERT( testMap.getKeys().at( 0 )->getValue() == "A" );
+ CPPUNIT_ASSERT( testMap.getKeys().at( 1 )->getValue() == "B" );
+ CPPUNIT_ASSERT( testMap.getKeys().at( 2 )->getValue() == "C" );
+}
////////////////////////////////////////////////////////////////////////////////
-void BrokerIdTest::test()
-{
- BrokerId myCommand;
+void BrokerIdTest::test2() {
+
+ typedef PointerComparator< BrokerId > COMPARATOR;
+
+ Pointer<BrokerId> myCommand1( new BrokerId );
+ Pointer<BrokerId> myCommand2( new BrokerId );
+ Pointer<BrokerId> myCommand3( new BrokerId );
+
+ myCommand1->setValue( "A" );
+ myCommand2->setValue( "A" );
+ myCommand3->setValue( "C" );
+
+ CPPUNIT_ASSERT( myCommand1->compareTo( *myCommand2 ) == 0 );
+ CPPUNIT_ASSERT( myCommand1->compareTo( *myCommand3 ) == -1 );
+
+ Map< Pointer<BrokerId>, int, COMPARATOR > testMap;
+
+ testMap.setValue( myCommand3, 0 );
+ testMap.setValue( myCommand1, 0 );
+ CPPUNIT_ASSERT( testMap.size() == 2 );
+
+ testMap.setValue( myCommand2, 0 );
+ CPPUNIT_ASSERT( testMap.size() == 2 );
- CPPUNIT_ASSERT( myCommand.getDataStructureType() == BrokerId::ID_BROKERID );
+ CPPUNIT_ASSERT( testMap.getKeys().at( 0 )->getValue() == "A" );
+ CPPUNIT_ASSERT( testMap.getKeys().at( 1 )->getValue() == "C" );
}
Modified: activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.h?rev=740875&r1=740874&r2=740875&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.h (original)
+++ activemq/activemq-cpp/trunk/src/test/activemq/commands/BrokerIdTest.h Wed Feb 4 20:54:25 2009
@@ -28,6 +28,7 @@
CPPUNIT_TEST_SUITE( BrokerIdTest );
CPPUNIT_TEST( test );
+ CPPUNIT_TEST( test2 );
CPPUNIT_TEST_SUITE_END();
public:
@@ -36,6 +37,7 @@
virtual ~BrokerIdTest() {}
virtual void test();
+ virtual void test2();
};
Modified: activemq/activemq-cpp/trunk/src/test/testRegistry.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/testRegistry.cpp?rev=740875&r1=740874&r2=740875&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/testRegistry.cpp (original)
+++ activemq/activemq-cpp/trunk/src/test/testRegistry.cpp Wed Feb 4 20:54:25 2009
@@ -20,8 +20,8 @@
//#include <activemq/commands/BrokerInfoTest.h>
//CPPUNIT_TEST_SUITE_REGISTRATION( activemq::commands::BrokerInfoTest );
-//#include <activemq/commands/BrokerIdTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( activemq::commands::BrokerIdTest );
+#include <activemq/commands/BrokerIdTest.h>
+CPPUNIT_TEST_SUITE_REGISTRATION( activemq::commands::BrokerIdTest );
//#include <activemq/commands/ActiveMQTopicTest.h>
//CPPUNIT_TEST_SUITE_REGISTRATION( activemq::commands::ActiveMQTopicTest );
//#include <activemq/commands/ActiveMQTextMessageTest.h>