GCC 5 compatibility: std::list::size() O(1) complexity
[libcds.git] / cds / container / striped_map / std_list.h
index eba4c9f503b041a8260df7ec74ca4ac0ba4c5eac..4e7bdc180aaaeaeebe6ceb9af4bdc991d9c9fc9f 100644 (file)
@@ -9,6 +9,11 @@
 #include <utility>      // std::pair
 #include <cds/container/striped_set/adapter.h>
 
+#undef CDS_STD_LIST_SIZE_CXX11_CONFORM
+#if !( defined(__GLIBCXX__ ) && (!defined(_GLIBCXX_USE_CXX11_ABI) || _GLIBCXX_USE_CXX11_ABI == 0 ))
+#   define CDS_STD_LIST_SIZE_CXX11_CONFORM
+#endif
+
 //@cond
 namespace cds { namespace container {
     namespace striped_set {
@@ -123,7 +128,7 @@ namespace cds { namespace intrusive { namespace striped_set {
         private:
             //@cond
             container_type  m_List;
-#       if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#       if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
             // GCC C++ lib bug:
             // In GCC (at least up to 4.7.x), the complexity of std::list::size() is O(N)
             // (see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49561)
@@ -134,7 +139,7 @@ namespace cds { namespace intrusive { namespace striped_set {
 
         public:
             adapted_container()
-#       if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#       if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
                 : m_nSize(0)
 #       endif
             {}
@@ -148,7 +153,7 @@ namespace cds { namespace intrusive { namespace striped_set {
                     it = m_List.insert( it, value_type( key, mapped_type()) );
                     f( *it );
 
-#           if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#           if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
                     ++m_nSize;
 #           endif
                     return true;
@@ -166,7 +171,7 @@ namespace cds { namespace intrusive { namespace striped_set {
                     //value_type newItem( key );
                     it = m_List.emplace( it, value_type( std::forward<K>(key), std::move( mapped_type( std::forward<Args>(args)...) )) );
 
-#           if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#           if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
                     ++m_nSize;
 #           endif
                     return true;
@@ -183,7 +188,7 @@ namespace cds { namespace intrusive { namespace striped_set {
                     value_type newItem( key, mapped_type() );
                     it = m_List.insert( it, newItem );
                     func( true, *it );
-#           if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#           if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
                     ++m_nSize;
 #           endif
                     return std::make_pair( true, true );
@@ -205,7 +210,7 @@ namespace cds { namespace intrusive { namespace striped_set {
                 // key exists
                 f( *it );
                 m_List.erase( it );
-#           if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#           if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
                 --m_nSize;
 #           endif
 
@@ -222,7 +227,7 @@ namespace cds { namespace intrusive { namespace striped_set {
                 // key exists
                 f( *it );
                 m_List.erase( it );
-#           if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#           if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
                 --m_nSize;
 #           endif
 
@@ -269,14 +274,14 @@ namespace cds { namespace intrusive { namespace striped_set {
                 assert( it == m_List.end() || key_comparator()( itWhat->first, it->first ) != 0 );
 
                 copy_item()( m_List, it, itWhat );
-#           if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#           if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
                 ++m_nSize;
 #           endif
             }
 
             size_t size() const
             {
-#           if defined(__GLIBCXX__ ) && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 50000 )
+#           if !defined(CDS_STD_LIST_SIZE_CXX11_CONFORM)
                 return m_nSize;
 #           else
                 return m_List.size();