@@ -843,28 +843,22 @@ void CheckStl::if_findError(const Token *tok, bool str)
843843/* *
844844 * Is container.size() slow?
845845 */
846- static bool isContainerSizeSlow (const Token *tok)
846+ static bool isCpp03ContainerSizeSlow (const Token *tok)
847847{
848- // THIS ARRAY MUST BE ORDERED ALPHABETICALLY
849- static const char * stl_size_slow[] = {
850- " array" , " bitset" ,
851- " forward_list" , " hash_map" , " hash_multimap" , " hash_set" ,
852- " list" , " map" , " multimap" , " multiset" ,
853- " priority_queue" , " queue" , " set" , " stack" , " unordered_map" ,
854- " unordered_multimap" , " unordered_multiset" , " unordered_set"
855- };
856-
857848 if (!tok)
858849 return false ;
859850 const Variable* var = tok->variable ();
860- return var && var->isStlType (stl_size_slow );
851+ return var && var->isStlType (" list " );
861852}
862853
863854void CheckStl::size ()
864855{
865856 if (!_settings->isEnabled (" performance" ))
866857 return ;
867858
859+ if (_settings->standards .cpp == Standards::CPP11 )
860+ return ;
861+
868862 const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase ();
869863 const std::size_t functions = symbolDatabase->functionScopes .size ();
870864 for (std::size_t i = 0 ; i < functions; ++i) {
@@ -883,21 +877,21 @@ void CheckStl::size()
883877 // check for comparison to zero
884878 if ((tok->previous () && !tok->previous ()->isArithmeticalOp () && Token::Match (end, " ==|<=|!=|> 0" )) ||
885879 (end->next () && !end->next ()->isArithmeticalOp () && Token::Match (tok->tokAt (-2 ), " 0 ==|>=|!=|<" ))) {
886- if (isContainerSizeSlow (tok1))
880+ if (isCpp03ContainerSizeSlow (tok1))
887881 sizeError (tok1);
888882 }
889883
890884 // check for comparison to one
891885 if ((tok->previous () && !tok->previous ()->isArithmeticalOp () && Token::Match (end, " >=|< 1" ) && !end->tokAt (2 )->isArithmeticalOp ()) ||
892886 (end->next () && !end->next ()->isArithmeticalOp () && Token::Match (tok->tokAt (-2 ), " 1 <=|>" ) && !tok->tokAt (-3 )->isArithmeticalOp ())) {
893- if (isContainerSizeSlow (tok1))
887+ if (isCpp03ContainerSizeSlow (tok1))
894888 sizeError (tok1);
895889 }
896890
897891 // check for using as boolean expression
898892 else if ((Token::Match (tok->tokAt (-2 ), " if|while (" ) && end->str () == " )" ) ||
899893 (tok->previous ()->type () == Token::eLogicalOp && Token::Match (end, " &&|)|,|;|%oror%" ))) {
900- if (isContainerSizeSlow (tok1))
894+ if (isCpp03ContainerSizeSlow (tok1))
901895 sizeError (tok1);
902896 }
903897 }
@@ -1046,14 +1040,10 @@ void CheckStl::string_c_str()
10461040{
10471041 const bool printInconclusive = _settings->inconclusive ;
10481042 const bool printPerformance = _settings->isEnabled (" performance" );
1049- // THIS ARRAY MUST BE ORDERED ALPHABETICALLY
1050- static const char * const stl_string[] = {
1051- " string" , " u16string" , " u32string" , " wstring"
1052- };
1053- // THIS ARRAY MUST BE ORDERED ALPHABETICALLY
1054- static const char * const stl_string_stream[] = {
1055- " istringstream" , " ostringstream" , " stringstream" , " wstringstream"
1056- };
1043+ static const std::set<std::string> stl_string = make_container< std::set<std::string> >() <<
1044+ " string" << " u16string" << " u32string" << " wstring" ;
1045+ static const std::set<std::string> stl_string_stream = make_container< std::set<std::string> >() <<
1046+ " istringstream" << " ostringstream" << " stringstream" << " wstringstream" ;
10571047
10581048 const SymbolDatabase* symbolDatabase = _tokenizer->getSymbolDatabase ();
10591049
@@ -1357,17 +1347,13 @@ void CheckStl::uselessCalls()
13571347 if (!printPerformance && !printWarning)
13581348 return ;
13591349
1360- // THIS ARRAY MUST BE ORDERED ALPHABETICALLY
1361- static const char * const stl_string[] = {
1362- " string" , " u16string" , " u32string" , " wstring"
1363- };
1364- // THIS ARRAY MUST BE ORDERED ALPHABETICALLY
1365- static const char * const stl_containers_with_empty_and_clear[] = {
1366- " deque" , " forward_list" , " list" ,
1367- " map" , " multimap" , " multiset" , " set" , " string" ,
1368- " unordered_map" , " unordered_multimap" , " unordered_multiset" ,
1369- " unordered_set" , " vector" , " wstring"
1370- };
1350+ static const std::set<std::string> stl_string = make_container< std::set<std::string> >() <<
1351+ " string" << " u16string" << " u32string" << " wstring" ;
1352+ static const std::set<std::string> stl_containers_with_empty_and_clear = make_container< std::set<std::string> >() <<
1353+ " deque" << " forward_list" << " list" <<
1354+ " map" << " multimap" << " multiset" << " set" << " string" <<
1355+ " unordered_map" << " unordered_multimap" << " unordered_multiset" <<
1356+ " unordered_set" << " vector" << " wstring" ;
13711357
13721358 const SymbolDatabase* symbolDatabase = _tokenizer->getSymbolDatabase ();
13731359 const std::size_t functions = symbolDatabase->functionScopes .size ();
@@ -1556,8 +1542,10 @@ void CheckStl::readingEmptyStlContainer()
15561542 std::set<unsigned int > empty_map; // empty std::map-like instances of STL containers
15571543 std::set<unsigned int > empty_nonmap; // empty non-std::map-like instances of STL containers
15581544
1559- static const char *MAP_STL_CONTAINERS [] = { " map" , " multimap" , " unordered_map" , " unordered_multimap" };
1560- static const char *NONMAP_STL_CONTAINERS [] = { " deque" , " forward_list" , " list" , " multiset" , " queue" , " set" , " stack" , " string" , " unordered_multiset" , " unordered_set" , " vector" };
1545+ static const std::set<std::string> MAP_STL_CONTAINERS = make_container< std::set<std::string> >() <<
1546+ " map" << " multimap" << " unordered_map" << " unordered_multimap" ;
1547+ static const std::set<std::string> NONMAP_STL_CONTAINERS = make_container< std::set<std::string> >() <<
1548+ " deque" << " forward_list" << " list" << " multiset" << " queue" << " set" << " stack" << " string" << " unordered_multiset" << " unordered_set" << " vector" ;
15611549
15621550 const std::list<Scope>& scopeList = _tokenizer->getSymbolDatabase ()->scopeList ;
15631551
0 commit comments