hash-map-tests.c (test_map_of_strings_to_int): Show how to use string contents as...
authorMichael Ploujnikov <michael.ploujnikov@oracle.com>
Mon, 21 Jan 2019 19:04:04 +0000 (19:04 +0000)
committerMichael Ploujnikov <plouj@gcc.gnu.org>
Mon, 21 Jan 2019 19:04:04 +0000 (19:04 +0000)
* hash-map-tests.c (test_map_of_strings_to_int): Show how to use
string contents as hash_map keys.

From-SVN: r268121

gcc/ChangeLog
gcc/hash-map-tests.c

index ff92634df4ddcd37bcef605cb62b9aabed89001d..5ca20aed5da459ecf9be2526fc133017900dc953 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-21  Michael Ploujnikov  <michael.ploujnikov@oracle.com>
+
+       * hash-map-tests.c (test_map_of_strings_to_int): Show how to use
+       string contents as hash_map keys.
+
 2019-01-21  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        PR c/88928
index 7b7a1c89045f54cce18b935616a5db3e6679cb8b..2137464e69378d6666a6703c16991310e4dc4100 100644 (file)
@@ -77,6 +77,26 @@ test_map_of_strings_to_int ()
   m.remove (eric);
   ASSERT_EQ (5, m.elements ());
   ASSERT_EQ (NULL, m.get (eric));
+
+  /* A plain char * key is hashed based on its value (address), rather
+     than the string it points to.  */
+  char *another_ant = static_cast <char *> (xcalloc (4, 1));
+  another_ant[0] = 'a';
+  another_ant[1] = 'n';
+  another_ant[2] = 't';
+  another_ant[3] = 0;
+  ASSERT_NE (ant, another_ant);
+  unsigned prev_size = m.elements ();
+  ASSERT_EQ (false, m.put (another_ant, 7));
+  ASSERT_EQ (prev_size + 1, m.elements ());
+
+  /* Need to use string_hash or nofree_string_hash key types to hash
+     based on the string contents.  */
+  hash_map <nofree_string_hash, int> string_map;
+  ASSERT_EQ (false, string_map.put (ant, 1));
+  ASSERT_EQ (1, string_map.elements ());
+  ASSERT_EQ (true, string_map.put (another_ant, 5));
+  ASSERT_EQ (1, string_map.elements ());
 }
 
 /* Run all of the selftests within this file.  */