X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fcontainer%2Fdetails%2Fmake_iterable_kvlist.h;h=0c76e950cc463db190a1cf76109f4630a464acab;hb=dd527e913731ce28ff1a6cea10bdabfd507ef856;hp=811b917c4f16c4ab3d9349ed5d4bed4f571ac1b8;hpb=994743d48f3b6bc593944c1998f6109339aa135c;p=libcds.git diff --git a/cds/container/details/make_iterable_kvlist.h b/cds/container/details/make_iterable_kvlist.h index 811b917c..0c76e950 100644 --- a/cds/container/details/make_iterable_kvlist.h +++ b/cds/container/details/make_iterable_kvlist.h @@ -1,11 +1,11 @@ /* This file is a part of libcds - Concurrent Data Structures library - (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016 + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017 Source code repo: http://github.com/khizmax/libcds/ Download: http://sourceforge.net/projects/libcds/files/ - + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -32,6 +32,7 @@ #define CDSLIB_CONTAINER_DETAILS_MAKE_ITERABLE_KVLIST_H #include +#include namespace cds { namespace container { @@ -45,48 +46,54 @@ namespace cds { namespace container { typedef GC gc; typedef K key_type; - typedef T value_type; - typedef std::pair pair_type; - - typedef intrusive::iterable_list::node< pair_type > node_type; + typedef T mapped_type; + typedef std::pair value_type; - typedef typename original_type_traits::allocator::template rebind::other data_allocator_type; - typedef cds::details::Allocator< pair_type, allocator_type > cxx_data_allocator; + typedef typename original_type_traits::allocator::template rebind::other data_allocator_type; + typedef cds::details::Allocator< value_type, data_allocator_type > cxx_data_allocator; typedef typename original_type_traits::memory_model memory_model; - struct node_disposer + struct data_disposer { - void operator ()( node_type * pNode ) + void operator ()( value_type * pData ) { - cxx_data_allocator().Delete( pNode->data.load( memory_model::memory_order_relaxed ) ); + cxx_data_allocator().Delete( pData ); } }; struct key_field_accessor { - key_type const& operator()( node_type const& node ) + key_type const& operator()( value_type const& data ) { - pair_type const* p = node.data.load( memory_model::memory_order_relaxed ); - assert( p != nullptr ) - return p->first; + return data.first; } }; - typedef typename opt::details::make_comparator< key_type, original_type_traits >::type key_comparator; - template - struct less_wrapper { - typedef cds::details::compare_wrapper< node_type, cds::opt::details::make_comparator_from_less, key_field_accessor > type; + struct less_wrapper + { + template + bool operator()( value_type const& lhs, Q const& rhs ) const + { + return Less()( lhs.first, rhs ); + } + + template + bool operator()( Q const& lhs, value_type const& rhs ) const + { + return Less()( lhs, rhs.first ); + } }; - struct intrusive_traits: public original_type_traits + typedef typename opt::details::make_comparator< key_type, original_type_traits >::type key_comparator; + + struct base_traits: public original_type_traits { - typedef node_disposer disposer; - typedef cds::details::compare_wrapper< node_type, key_comparator, key_field_accessor > compare; - static const opt::link_check_type link_checker = intrusive::iterable_list::traits::link_checker; + typedef data_disposer disposer; + typedef cds::details::compare_wrapper< value_type, key_comparator, key_field_accessor > compare; }; - typedef intrusive::IterableList type; + typedef container::IterableList type; }; } // namespace details //@endcond