MSPriorityQueue refactoring, bug fix
authorkhizmax <libcds.dev@gmail.com>
Fri, 10 Oct 2014 04:51:54 +0000 (08:51 +0400)
committerkhizmax <libcds.dev@gmail.com>
Fri, 10 Oct 2014 04:51:54 +0000 (08:51 +0400)
15 files changed:
cds/container/mspriority_queue.h
cds/container/segmented_queue.h
cds/intrusive/mspriority_queue.h
change.log
projects/source.test-hdr.mk
tests/test-hdr/deque/hdr_fcdeque.cpp
tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_dyn.cpp
tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_static.cpp
tests/test-hdr/priority_queue/hdr_mspqueue_dyn.cpp
tests/test-hdr/priority_queue/hdr_mspqueue_static.cpp
tests/test-hdr/priority_queue/hdr_pqueue.h
tests/test-hdr/queue/hdr_segmented_queue.h
tests/test-hdr/stack/hdr_fcstack.cpp
tests/unit/pqueue/pqueue_type.h
tests/unit/stack/stack_type.h

index c47a93067eb49d78178f7d4a2793e8a5e5acf841..1bc48565448bf1a07d00cfe53d3ec31867262a27 100644 (file)
@@ -25,31 +25,44 @@ namespace cds { namespace container {
         using cds::intrusive::mspriority_queue::empty_stat;
 #endif
 
-        /// Type traits for MSPriorityQueue
+        /// MSPriorityQueue traits
         /**
-            The type traits for cds::container::MSPriorityQueue is the same as for
-            cds::intrusive::MSPriorityQueue (see cds::intrusive::mspriority_queue::type_traits)
+            The traits for \p %cds::container::MSPriorityQueue is the same as for
+            \p cds::intrusive::MSPriorityQueue (see \p cds::intrusive::mspriority_queue::traits)
             plus some additional properties.
         */
-        struct type_traits: public cds::intrusive::mspriority_queue::type_traits
+        struct traits: public cds::intrusive::mspriority_queue::traits
         {
             /// The allocator use to allocate memory for values
             typedef CDS_DEFAULT_ALLOCATOR   allocator;
 
             /// Move policy
             /**
-                The move policy used in MSPriorityQueue::pop functions
+                The move policy used in \p MSPriorityQueue::pop functions
                 to move item's value.
-                Default is opt::v::assignment_move_policy.
+                Default is \p opt::v::assignment_move_policy.
             */
             typedef cds::opt::v::assignment_move_policy  move_policy;
         };
 
         /// Metafunction converting option list to traits
         /**
-            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
-
-            See \ref MSPriorityQueue, \ref type_traits, \ref cds::opt::make_options.
+            \p Options are:
+            - \p opt::buffer - the buffer type for heap array. Possible type are: \p opt::v::static_buffer, \p opt::v::dynamic_buffer.
+                Default is \p %opt::v::dynamic_buffer.
+                You may specify any type of values for the buffer since at instantiation time
+                the \p buffer::rebind member metafunction is called to change the type of values stored in the buffer.
+            - \p opt::compare - priority compare functor. No default functor is provided.
+                If the option is not specified, the \p opt::less is used.
+            - \p opt::less - specifies binary predicate used for priority compare. Default is \p std::less<T>.
+            - \p opt::lock_type - lock type. Default is \p cds::lock::Spin.
+            - \p opt::back_off - back-off strategy. Default is \p cds::backoff::yield
+            - \p opt::allocator - allocator (like \p std::allocator) for the values of queue's items.
+                Default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::move_policy - policy for moving item's value. Default is \p opt::v::assignment_move_policy.
+                If the compiler supports move semantics it would be better to specify the move policy
+                based on the move semantics for type \p T.
+            - \p opt::stat - internal statistics. Available types: \p mspriority_queue::stat, \p mspriority_queue::empty_stat (the default, no overhead)
         */
         template <typename... Options>
         struct make_traits {
@@ -57,7 +70,7 @@ namespace cds { namespace container {
             typedef implementation_defined type ;   ///< Metafunction result
 #   else
             typedef typename cds::opt::make_options<
-                typename cds::opt::find_type_traits< type_traits, Options... >::type
+                typename cds::opt::find_type_traits< traits, Options... >::type
                 ,Options...
             >::type   type;
 #   endif
@@ -86,28 +99,11 @@ namespace cds { namespace container {
 
         Template parameters:
         - \p T - type to be stored in the list. The priority is a part of \p T type.
-        - \p Traits - type traits. See mspriority_queue::type_traits for explanation.
-
-        It is possible to declare option-based queue with cds::container::mspriority_queue::make_traits
-        metafunction instead of \p Traits template argument.
-        Template argument list \p Options of \p %cds::container::mspriority_queue::make_traits metafunction are:
-        - opt::buffer - the buffer type for heap array. Possible type are: opt::v::static_buffer, opt::v::dynamic_buffer.
-            Default is \p %opt::v::dynamic_buffer.
-            You may specify any type of values for the buffer since at instantiation time
-            the \p buffer::rebind member metafunction is called to change the type of values stored in the buffer.
-        - opt::compare - priority compare functor. No default functor is provided.
-            If the option is not specified, the opt::less is used.
-        - opt::less - specifies binary predicate used for priority compare. Default is \p std::less<T>.
-        - opt::lock_type - lock type. Default is cds::lock::Spin.
-        - opt::back_off - back-off strategy. Default is cds::backoff::yield
-        - opt::allocator - allocator (like \p std::allocator) for the values of queue's items.
-            Default is \ref CDS_DEFAULT_ALLOCATOR
-        - opt::move_policy - policy for moving item's value. Default is opt::v::assignment_move_policy.
-            If the compiler supports move semantics it would be better to specify the move policy
-            based on the move semantics for type \p T.
-        - opt::stat - internal statistics. Available types: mspriority_queue::stat, mspriority_queue::empty_stat (the default)
+        - \p Traits - the traits. See \p mspriority_queue::traits for explanation.
+             It is possible to declare option-based queue with \p mspriority_queue::make_traits
+             metafunction instead of \p Traits template argument.
     */
-    template <typename T, class Traits>
+    template <typename T, class Traits = mspriority_queue::traits >
     class MSPriorityQueue: protected cds::intrusive::MSPriorityQueue< T, Traits >
     {
         //@cond
@@ -152,7 +148,7 @@ namespace cds { namespace container {
             clear();
         }
 
-        /// Inserts a item into priority queue
+        /// Inserts an item into priority queue
         /**
             If the priority queue is full, the function returns \p false,
             no item has been added.
@@ -171,6 +167,28 @@ namespace cds { namespace container {
             return false;
         }
 
+        /// Inserts an item into the queue using a functor
+        /**
+            \p Func is a functor called to create node.
+            The functor \p f takes one argument - a reference to a new node of type \ref value_type :
+            \code
+            cds::container::MSPriorityQueue< Foo > myQueue;
+            Bar bar;
+            myQueue.push_with( [&bar]( Foo& dest ) { dest = bar; } );
+            \endcode
+        */
+        template <typename Func>
+        bool push_with( Func f )
+        {
+            scoped_ptr pVal( cxx_allocator().New() );
+            f( *pVal );
+            if ( base_class::push( *pVal )) {
+                pVal.release();
+                return true;
+            }
+            return false;
+        }
+
         /// Inserts a item into priority queue
         /**
             If the priority queue is full, the function returns \p false,
@@ -200,36 +218,34 @@ namespace cds { namespace container {
 
             The function is equivalent of such call:
             \code
-                pop_with( dest, move_policy() );
+                pop_with( dest, [&dest]( value_type& src ) { move_policy()(dest, src); } );
             \endcode
         */
         bool pop( value_type& dest )
         {
-            return pop_with( dest, move_policy() );
+            return pop_with( [&dest]( value_type& src ) { move_policy()(dest, src); } );
         }
 
-        /// Extracts item with high priority
+        /// Extracts an item with high priority
         /**
             If the priority queue is empty, the function returns \p false.
             Otherwise, it returns \p true and \p dest contains the copy of extracted item.
             The item is deleted from the heap.
 
-            The function uses \p MoveFunc \p f to move extracted value from the heap's top
-            to \p dest. The interface of \p MoveFunc is:
+            \p Func is a functor called to copy popped value.
+            The functor takes one argument - a reference to removed node:
             \code
-            struct move_functor {
-                void operator()( Q& dest, T& src );
-            };
+            cds:container::MSPriorityQueue< Foo > myQueue;
+            Bar bar;
+            myQueue.pop_with( [&bar]( Foo& src ) { bar = std::move( src );});
             \endcode
-            In \p MoveFunc you may use move semantics for \p src argument
-            since \p src will be destroyed.
         */
-        template <typename Q, typename MoveFunc>
-        bool pop_with( Q& dest, MoveFunc f )
+        template <typename Func>
+        bool pop_with( Func f )
         {
             value_type * pVal = base_class::pop();
             if ( pVal ) {
-                f( dest, *pVal );
+                f( *pVal );
                 cxx_allocator().Delete( pVal );
                 return true;
             }
@@ -238,16 +254,16 @@ namespace cds { namespace container {
 
         /// Clears the queue (not atomic)
         /**
-            This function is no atomic, but thread-safe
+            This function is not atomic, but thread-safe
         */
         void clear()
         {
-            base_class::clear_with( []( value_type& src ) { cxx_allocator().Delete( &src ); });
+            base_class::clear_with( []( value_type& src ) { value_deleter()(&src); } );
         }
 
         /// Clears the queue (not atomic)
         /**
-            This function is no atomic, but thread-safe.
+            This function is not atomic, but thread-safe.
 
             For each item removed the functor \p f is called.
             \p Func interface is:
@@ -257,7 +273,6 @@ namespace cds { namespace container {
                     void operator()( value_type& item );
                 };
             \endcode
-            A lambda function or a function pointer can be used as \p f.
         */
         template <typename Func>
         void clear_with( Func f )
index 73ae5a1174493214c7a058d825850e3215a0969a..fe6034617c0f83d7e00407dc059e57a820130edf 100644 (file)
@@ -325,7 +325,7 @@ namespace cds { namespace container {
         }
 
         /// Synonym for \p dequeue_with() function
-        template <typename Q, typename Func>
+        template <typename Func>
         bool pop_with( Func f )
         {
             return dequeue_with( f );
index 457fb66aa7b2e06d70112d7724f2fb67d4ee0183..cb110007ae56dc5a6689dbf26e21818e323cbfab 100644 (file)
@@ -368,7 +368,7 @@ namespace cds { namespace intrusive {
         /// Returns current size of priority queue
         size_t size() const
         {
-            std::unique_lock l( m_Lock );
+            std::unique_lock<lock_type> l( m_Lock );
             size_t nSize = (size_t) m_ItemCounter.value();
             return nSize;
         }
index 3e8089d4ae6896e320abaf1be5853a3735aa1156..fde0b0e453388c082c2b633755f589200ff356c5 100644 (file)
@@ -3,14 +3,15 @@
     - switch to C++11 standard
     - Removed: MichaelDeque, reason: the implementation is heavy-weighted, inefficient,
       and, seems, unstable.
-    - Added: cds::container::TreiberStack::pop_with(Func)
-    - Added: member functions enqueue_with(Func), dequeue_with(Func) to 
+    - Added: new member function pop_with(Func) to cds::container::TreiberStack
+    - Added: new member functions enqueue_with(Func), dequeue_with(Func) to 
              cds::container::MSQueue
              cds::container::MoirQueue
              cds::container::BasketQueue
              cds::container::OptimisticQueue
              cds::container::RWQueue
              cds::container::SegmentedQueue
+    - Added: new member functions push_with(Func) and pop_with(Func) to cds::container::MSPriorityQueue
 
 1.6.0 23.09.2014
     General release
index 2ae45dc5fc7718bf8976686c4a6c653851a59756..f9c52bbd6e83a43891caafe43f9cef49924a193a 100644 (file)
@@ -280,11 +280,11 @@ CDS_TESTHDR_MISC := \
 
 CDS_TESTHDR_SOURCES := \
     $(CDS_TESTHDR_QUEUE) \
+    $(CDS_TESTHDR_PQUEUE) \
     $(CDS_TESTHDR_STACK) \
     $(CDS_TESTHDR_MAP) \
     $(CDS_TESTHDR_DEQUE) \
     $(CDS_TESTHDR_ORDLIST) \
-    $(CDS_TESTHDR_PQUEUE) \
     $(CDS_TESTHDR_SET) \
     $(CDS_TESTHDR_TREE) \
     $(CDS_TESTHDR_MISC)
index 91caa6e8f55dbe0bc2a77af3d2d448e00c348f16..ec8dd0ff18279b97157e0219437532d53246371b 100644 (file)
@@ -112,9 +112,11 @@ namespace deque {
 
         void fcDeque_mutex()
         {
-            struct deque_traits : public cds::container::fcdeque::traits
+            struct deque_traits : public 
+                cds::container::fcdeque::make_traits<
+                    cds::opt::enable_elimination< true >
+                >::type
             {
-                static CDS_CONSTEXPR const bool enable_elimination = true;
                 typedef std::mutex lock_type;
             };
             typedef cds::container::FCDeque<int, std::deque<int>, deque_traits > deque_type;
index aeafd137ea92a1dc3f6f71e569bd00aee11e9bcf..f066a7fa56451947a1e413debff008f44dce4861 100644 (file)
@@ -2,7 +2,6 @@
 
 #include "priority_queue/hdr_intrusive_pqueue.h"
 #include <cds/intrusive/mspriority_queue.h>
-#include <mutex>
 
 namespace priority_queue {
     namespace intrusive_pqueue {
@@ -18,35 +17,36 @@ namespace priority_queue {
 
     void IntrusivePQueueHdrTest::MSPQueue_dyn()
     {
-        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
-            cds::intrusive::mspriority_queue::make_traits<
-                cds::opt::buffer< buffer_type >
-            >::type
-        > pqueue;
+        struct pqueue_traits : public cds::intrusive::mspriority_queue::traits
+        {
+            typedef buffer_type buffer;
+        };
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type, pqueue_traits > pqueue;
 
         test_msq_dyn<pqueue>();
     }
 
     void IntrusivePQueueHdrTest::MSPQueue_dyn_cmp()
     {
-        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
-            cds::intrusive::mspriority_queue::make_traits<
-                cds::opt::buffer< buffer_type >
-                ,cds::opt::compare< IntrusivePQueueHdrTest::compare >
-            >::type
-        > pqueue;
+        struct pqueue_traits : public cds::intrusive::mspriority_queue::traits
+        {
+            typedef buffer_type buffer;
+            typedef IntrusivePQueueHdrTest::compare compare;
+        };
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type, pqueue_traits > pqueue;
 
         test_msq_dyn<pqueue>();
     }
 
     void IntrusivePQueueHdrTest::MSPQueue_dyn_less()
     {
-        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
-            cds::intrusive::mspriority_queue::make_traits<
+        struct pqueue_traits : public
+            cds::intrusive::mspriority_queue::make_traits <
                 cds::opt::buffer< buffer_type >
-                ,cds::opt::less< std::less<IntrusivePQueueHdrTest::key_type> >
-            >::type
-        > pqueue;
+                , cds::opt::less < std::less<IntrusivePQueueHdrTest::key_type> >
+            > ::type
+        {};
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type, pqueue_traits > pqueue;
 
         test_msq_dyn<pqueue>();
     }
index 450fbc1e174aad58ed5000c9f3ccbd6725c0ff28..6c39d3f4571e38e210ecd0472610bca5d4cc08b9 100644 (file)
@@ -2,7 +2,6 @@
 
 #include "priority_queue/hdr_intrusive_pqueue.h"
 #include <cds/intrusive/mspriority_queue.h>
-#include <mutex>
 
 namespace priority_queue {
     namespace intrusive_pqueue {
@@ -66,13 +65,13 @@ namespace priority_queue {
 
     void IntrusivePQueueHdrTest::MSPQueue_st_cmp_mtx()
     {
-        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
-            cds::intrusive::mspriority_queue::make_traits<
-                cds::opt::buffer< buffer_type >
-                ,cds::opt::compare< IntrusivePQueueHdrTest::compare >
-                ,cds::opt::lock_type<std::mutex>
-            >::type
-        > pqueue;
+        struct pqueue_traits : public cds::intrusive::mspriority_queue::traits
+        {
+            typedef buffer_type buffer;
+            typedef IntrusivePQueueHdrTest::compare compare;
+            typedef std::mutex lock_type;
+        };
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type, pqueue_traits > pqueue;
 
         test_msq_stat<pqueue>();
     }
index 7a525cb8ce6a4891d862c0b2bfaec42de2d05d92..3c381b544e71ca4fe9774749e1d5e5edfcb3e517 100644 (file)
@@ -2,7 +2,6 @@
 
 #include "priority_queue/hdr_pqueue.h"
 #include <cds/container/mspriority_queue.h>
-#include <mutex>
 
 namespace priority_queue {
     namespace pqueue {
@@ -53,13 +52,13 @@ namespace priority_queue {
 
     void PQueueHdrTest::MSPQueue_dyn_cmpless()
     {
-        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
-            cds::container::mspriority_queue::make_traits<
-                cds::opt::buffer< buffer_type >
-                ,cds::opt::less< PQueueHdrTest::less >
-                ,cds::opt::compare< PQueueHdrTest::compare >
-            >::type
-        > pqueue;
+        struct pqueue_traits : public cds::container::mspriority_queue::traits
+        {
+            typedef buffer_type buffer;
+            typedef PQueueHdrTest::less less;
+            typedef PQueueHdrTest::compare compare;
+        };
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type, pqueue_traits > pqueue;
 
         test_msq_dyn<pqueue>();
     }
index 726a8950013df00e3453a03677843ebf0991acf1..cdf187f1826d7213f045d50bbf59427fca72a7fc 100644 (file)
@@ -2,7 +2,6 @@
 
 #include "priority_queue/hdr_pqueue.h"
 #include <cds/container/mspriority_queue.h>
-#include <mutex>
 
 namespace priority_queue {
     namespace pqueue {
index 70366fa42e231c5b9201af6fbdff1e83585266be..c9cac170f83f556d7607f8051b75bc0375853159 100644 (file)
@@ -114,14 +114,6 @@ namespace priority_queue {
             }
         };
 
-        struct move_functor
-        {
-            void operator()( int& dest, value_type const& src ) const
-            {
-                dest = src.k;
-            }
-        };
-
     protected:
         template <class PQueue>
         void test_bounded_with( PQueue& pq )
@@ -141,6 +133,9 @@ namespace priority_queue {
             // Push test
             for ( value_type * p = pFirst; p < pLast; ++p ) {
                 switch ( pq.size() & 3 ) {
+                    case 0:
+                        CPPUNIT_ASSERT( pq.push_with( [p]( value_type& dest ) { dest = *p; } ));
+                        break;
                     case 1:
                         CPPUNIT_ASSERT( pq.emplace( p->k, p->v ));
                         break;
@@ -182,7 +177,7 @@ namespace priority_queue {
                     nPrev = kv.k;
                 }
                 else {
-                    CPPUNIT_ASSERT( pq.pop_with( key, move_functor() ));
+                    CPPUNIT_ASSERT( pq.pop_with( [&key]( value_type& src ) { key = src.k;  } ) );
                     CPPUNIT_CHECK_EX( key == nPrev - 1, "Expected=" << nPrev - 1 << ", current=" << key );
                     nPrev = key;
                 }
index 91ef3013e759aeb890c32617da00bac76416b1ac..712d8a8176f75edf97ffa77fe866c9a5a0448870 100644 (file)
@@ -99,12 +99,13 @@ namespace queue {
                     other_item v;
 
                     nCount = 0;
+                    size_t nFuncCount = 0;
                     while ( !q.empty() ) {
                         if ( nCount & 1 ) {
-                            CPPUNIT_ASSERT( q.pop_with( [&v, &nCount]( item& src ) {v.nVal = src.nVal; ++nCount; } ));
+                            CPPUNIT_ASSERT( q.pop_with( [&v, &nFuncCount]( item& src ) {v.nVal = src.nVal; ++nFuncCount; } ));
                         }
                         else {
-                            CPPUNIT_ASSERT( q.dequeue_with( [&v, &nCount]( item& src ) {v.nVal = src.nVal; ++nCount; } ));
+                            CPPUNIT_ASSERT( q.dequeue_with( [&v, &nFuncCount]( item& src ) {v.nVal = src.nVal; ++nFuncCount; } ));
                         }
 
                         // It is possible c_nItemCount % quasi_factor() != 0
@@ -114,7 +115,7 @@ namespace queue {
                         CPPUNIT_CHECK_EX( nMin <= v.nVal && v.nVal <= nMax, nMin << " <= " << v.nVal << " <= " << nMax );
 
                         ++nCount;
-                        CPPUNIT_CHECK( pf.nCount == nCount );
+                        CPPUNIT_CHECK( nFuncCount == nCount );
                         CPPUNIT_CHECK( misc::check_size( q, c_nItemCount - nCount ));
                     }
                     CPPUNIT_CHECK( nCount == c_nItemCount );
index 48ebe9137d678c816e7767a7d1b0b0df9500e6c4..c3ea04448c07bb895abc2c59c3859afb48eb9a98 100644 (file)
@@ -99,10 +99,11 @@ namespace stack {
 
     void TestFCStack::FCStack_deque_elimination()
     {
-        struct stack_traits : public cds::container::fcstack::traits
-        {
-            static CDS_CONSTEXPR const bool enable_elimination = true;
-        };
+        struct stack_traits : public
+            cds::container::fcstack::make_traits <
+            cds::opt::enable_elimination < true >
+            > ::type
+        {};
         typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::deque<unsigned int> >, stack_traits > stack_type;
         test<stack_type>();
     }
index e6d0cf9518341348bedd0a7de944ed71bb30da18..30fad33c073f6a3fae8a18531adf6e7b56b90db1 100644 (file)
@@ -14,7 +14,6 @@
 #include <deque>
 #include <boost/container/stable_vector.hpp>
 #include <boost/container/deque.hpp>
-#include <mutex>
 #include <cds/lock/spinlock.h>
 
 #include "print_ellenbintree_stat.h"
@@ -40,61 +39,67 @@ namespace pqueue {
         };
 
 
-
         // MSPriorityQueue
-        typedef cc::MSPriorityQueue< Value,
-            typename cc::mspriority_queue::make_traits<
-                co::buffer< co::v::static_buffer< char, c_nBoundedCapacity > >
-            >::type
-        > MSPriorityQueue_static_less;
+        struct traits_MSPriorityQueue_static_less : public
+            cc::mspriority_queue::make_traits <
+                co::buffer < co::v::static_buffer< char, c_nBoundedCapacity > >
+            > ::type
+        {};
+        typedef cc::MSPriorityQueue< Value, traits_MSPriorityQueue_static_less > MSPriorityQueue_static_less;
 
-        typedef cc::MSPriorityQueue< Value,
-            typename cc::mspriority_queue::make_traits<
-                co::buffer< co::v::static_buffer< char, c_nBoundedCapacity > >
-                ,co::stat< cc::mspriority_queue::stat<> >
-            >::type
-        > MSPriorityQueue_static_less_stat;
+        struct traits_MSPriorityQueue_static_less_stat : public cc::mspriority_queue::traits
+        {
+            typedef co::v::static_buffer< char, c_nBoundedCapacity > buffer;
+            typedef cc::mspriority_queue::stat<> stat;
+        };
+        typedef cc::MSPriorityQueue< Value, traits_MSPriorityQueue_static_less_stat > MSPriorityQueue_static_less_stat;
 
-        typedef cc::MSPriorityQueue< Value,
-            typename cc::mspriority_queue::make_traits<
+        struct traits_MSPriorityQueue_static_cmp : public
+            cc::mspriority_queue::make_traits <
                 co::buffer< co::v::static_buffer< char, c_nBoundedCapacity > >
-                ,co::compare< cmp >
-            >::type
-        > MSPriorityQueue_static_cmp;
+                , co::compare < cmp >
+            > ::type
+        {};
+        typedef cc::MSPriorityQueue< Value, traits_MSPriorityQueue_static_cmp > MSPriorityQueue_static_cmp;
 
-        typedef cc::MSPriorityQueue< Value,
-            typename cc::mspriority_queue::make_traits<
+        struct traits_MSPriorityQueue_static_mutex : public
+            cc::mspriority_queue::make_traits<
                 co::buffer< co::v::static_buffer< char, c_nBoundedCapacity > >
-                ,co::lock_type<std::mutex>
+                , co::lock_type<std::mutex>
             >::type
-        > MSPriorityQueue_static_mutex;
+        {};
+        typedef cc::MSPriorityQueue< Value, traits_MSPriorityQueue_static_mutex > MSPriorityQueue_static_mutex;
 
-        typedef cc::MSPriorityQueue< Value,
-            typename cc::mspriority_queue::make_traits<
+        struct traits_MSPriorityQueue_dyn_less : public
+            cc::mspriority_queue::make_traits<
                 co::buffer< co::v::dynamic_buffer< char > >
             >::type
-        > MSPriorityQueue_dyn_less;
+        {};
+        typedef cc::MSPriorityQueue< Value, traits_MSPriorityQueue_dyn_less > MSPriorityQueue_dyn_less;
 
-        typedef cc::MSPriorityQueue< Value,
-            typename cc::mspriority_queue::make_traits<
+        struct traits_MSPriorityQueue_dyn_less_stat : public
+            cc::mspriority_queue::make_traits <
                 co::buffer< co::v::dynamic_buffer< char > >
-                ,co::stat< cc::mspriority_queue::stat<> >
-            >::type
-        > MSPriorityQueue_dyn_less_stat;
+                , co::stat < cc::mspriority_queue::stat<> >
+            > ::type
+        {};
+        typedef cc::MSPriorityQueue< Value, traits_MSPriorityQueue_dyn_less_stat > MSPriorityQueue_dyn_less_stat;
 
-        typedef cc::MSPriorityQueue< Value,
-            typename cc::mspriority_queue::make_traits<
+        struct traits_MSPriorityQueue_dyn_cmp : public
+            cc::mspriority_queue::make_traits <
                 co::buffer< co::v::dynamic_buffer< char > >
-                ,co::compare< cmp >
-            >::type
-        > MSPriorityQueue_dyn_cmp;
+                , co::compare < cmp >
+            > ::type
+        {};
+        typedef cc::MSPriorityQueue< Value, traits_MSPriorityQueue_dyn_cmp > MSPriorityQueue_dyn_cmp;
 
-        typedef cc::MSPriorityQueue< Value,
-            typename cc::mspriority_queue::make_traits<
+        struct traits_MSPriorityQueue_dyn_mutex : public
+            cc::mspriority_queue::make_traits <
                 co::buffer< co::v::dynamic_buffer< char > >
-                ,co::lock_type<std::mutex>
-            >::type
-        > MSPriorityQueue_dyn_mutex;
+                , co::lock_type < std::mutex >
+            > ::type
+        {};
+        typedef cc::MSPriorityQueue< Value, traits_MSPriorityQueue_dyn_mutex > MSPriorityQueue_dyn_mutex;
 
 
         // Priority queue based on EllenBinTreeSet
index 0e05132a67b8c9e09612945e321c5fa3c02691a7..074a153d2e21ce9b58888606a9dcd5aa15eae514 100644 (file)
@@ -20,7 +20,7 @@ namespace stack {
 
     namespace details {
 
-        template <typename T, typename Traits=cds::container::fcdeque::type_traits>
+        template <typename T, typename Traits=cds::container::fcdeque::traits>
         class FCDequeL: public cds::container::FCDeque<T, std::deque<T>, Traits >
         {
             typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
@@ -46,7 +46,7 @@ namespace stack {
             }
         };
 
-        template <typename T, typename Traits=cds::container::fcdeque::type_traits>
+        template <typename T, typename Traits=cds::container::fcdeque::traits>
         class FCDequeR: public cds::container::FCDeque<T, std::deque<T>, Traits >
         {
             typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;