X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fopt%2Fhash.h;h=2b460b56d540f8b70086f31b34e4c39fbcf6c912;hb=ad4a851ec0a60a0d843d5bdeab8799655df27bf4;hp=643f52d3838ac6c99db0c8c5ac94b20b085ae90b;hpb=7d15399a4d18ae2061ddb01656d85dbc940ff915;p=libcds.git diff --git a/cds/opt/hash.h b/cds/opt/hash.h index 643f52d3..2b460b56 100644 --- a/cds/opt/hash.h +++ b/cds/opt/hash.h @@ -3,9 +3,9 @@ #ifndef __CDS_OPT_HASH_H #define __CDS_OPT_HASH_H +#include #include #include -#include namespace cds { namespace opt { @@ -63,7 +63,6 @@ namespace cds { namespace opt { //@endcond } // namespace v -#ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT //@cond namespace details { template struct hash_list; @@ -131,400 +130,6 @@ namespace cds { namespace opt { //@endcond }; -#else // no variadic template support - namespace details { - template struct hash_list; - template - struct hash_list< std::tuple > - { - static size_t const size = 2; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - } - }; - - template - struct hash_list< std::tuple > - { - static size_t const size = 3; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - dest[2] = std::get<2>( hash_tuple )( v ); - } - }; - - template - struct hash_list< std::tuple > - { - static size_t const size = 4; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - dest[2] = std::get<2>( hash_tuple )( v ); - dest[3] = std::get<3>( hash_tuple )( v ); - } - }; - - template - struct hash_list< std::tuple > - { - static size_t const size = 5; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - dest[2] = std::get<2>( hash_tuple )( v ); - dest[3] = std::get<3>( hash_tuple )( v ); - dest[4] = std::get<4>( hash_tuple )( v ); - } - }; - - template - struct hash_list< std::tuple > - { - static size_t const size = 6; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - dest[2] = std::get<2>( hash_tuple )( v ); - dest[3] = std::get<3>( hash_tuple )( v ); - dest[4] = std::get<4>( hash_tuple )( v ); - dest[5] = std::get<5>( hash_tuple )( v ); - } - }; - - template - struct hash_list< std::tuple > - { - static size_t const size = 7; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - dest[2] = std::get<2>( hash_tuple )( v ); - dest[3] = std::get<3>( hash_tuple )( v ); - dest[4] = std::get<4>( hash_tuple )( v ); - dest[5] = std::get<5>( hash_tuple )( v ); - dest[6] = std::get<6>( hash_tuple )( v ); - } - }; - - template - struct hash_list< std::tuple > - { - static size_t const size = 8; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - dest[2] = std::get<2>( hash_tuple )( v ); - dest[3] = std::get<3>( hash_tuple )( v ); - dest[4] = std::get<4>( hash_tuple )( v ); - dest[5] = std::get<5>( hash_tuple )( v ); - dest[6] = std::get<6>( hash_tuple )( v ); - dest[7] = std::get<7>( hash_tuple )( v ); - } - }; - -#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1700) - // MSVC 11: max count of argument is 8 - - template - struct hash_list< std::tuple > - { - static size_t const size = 9; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - dest[2] = std::get<2>( hash_tuple )( v ); - dest[3] = std::get<3>( hash_tuple )( v ); - dest[4] = std::get<4>( hash_tuple )( v ); - dest[5] = std::get<5>( hash_tuple )( v ); - dest[6] = std::get<6>( hash_tuple )( v ); - dest[7] = std::get<7>( hash_tuple )( v ); - dest[8] = std::get<8>( hash_tuple )( v ); - } - }; - - template - struct hash_list< std::tuple > - { - static size_t const size = 10; - typedef size_t values[size]; - typedef std::tuple hash_tuple_type; - - hash_tuple_type hash_tuple; - - hash_list() - {} - hash_list( hash_tuple_type const& t) - : hash_tuple( t ) - {} -# ifdef CDS_MOVE_SEMANTICS_SUPPORT - hash_list( hash_tuple_type&& t) - : hash_tuple( t ) - {} -# endif - - template - void operator()( size_t * dest, T const& v ) const - { - dest[0] = std::get<0>( hash_tuple )( v ); - dest[1] = std::get<1>( hash_tuple )( v ); - dest[2] = std::get<2>( hash_tuple )( v ); - dest[3] = std::get<3>( hash_tuple )( v ); - dest[4] = std::get<4>( hash_tuple )( v ); - dest[5] = std::get<5>( hash_tuple )( v ); - dest[6] = std::get<6>( hash_tuple )( v ); - dest[7] = std::get<7>( hash_tuple )( v ); - dest[8] = std::get<8>( hash_tuple )( v ); - dest[9] = std::get<9>( hash_tuple )( v ); - } - }; -#endif - } // namespace details - - template< typename F1, typename F2 > - struct hash< std::tuple< F1, F2 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; - template< typename F1, typename F2, typename F3 > - struct hash< std::tuple< F1, F2, F3 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; - template< typename F1, typename F2, typename F3, typename F4 > - struct hash< std::tuple< F1, F2, F3, F4 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; - template< typename F1, typename F2, typename F3, typename F4, typename F5 > - struct hash< std::tuple< F1, F2, F3, F4, F5 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; - template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6 > - struct hash< std::tuple< F1, F2, F3, F4, F5, F6 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; - template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7 > - struct hash< std::tuple< F1, F2, F3, F4, F5, F6, F7 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; - template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8 > - struct hash< std::tuple< F1, F2, F3, F4, F5, F6, F7, F8 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; - -#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1700) - // MSVC 11: max count of argument is 8 - - template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9 > - struct hash< std::tuple< F1, F2, F3, F4, F5, F6, F7, F8, F9 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; - template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9, - typename F10 > - struct hash< std::tuple< F1, F2, F3, F4, F5, F6, F7, F8, F9, F10 > > - { - //@cond - template struct pack: public Base - { - typedef details::hash_list< std::tuple > hash; - }; - //@endcond - }; -#endif // !MSVC11 -#endif // #ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT //@cond namespace details {