diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-10-02 12:19:19 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-10-04 19:15:22 -0400 |
commit | b3674c9291a09c4e278a0875b691fc7aaf3f38cd (patch) | |
tree | 3f78b48f1e00366f1228f83b136bed8eedff1aaf | |
parent | 4d076d4ceeb05061b6b0699c19af9ba5ed0fcd00 (diff) |
Let's not expose the internal pointer. Define different ID type.
To prevent the string ID's from being used to instantiate string objects,
which can mess up shared string object's life cycles.
Change-Id: Ibcd9a4fa9f591d5c27a9e1b50bc9f83ae230e86a
-rw-r--r-- | include/svl/stringpool.hxx | 6 | ||||
-rw-r--r-- | svl/qa/unit/svl.cxx | 39 | ||||
-rw-r--r-- | svl/source/misc/stringpool.cxx | 10 |
3 files changed, 30 insertions, 25 deletions
diff --git a/include/svl/stringpool.hxx b/include/svl/stringpool.hxx index 26785e3d31aa..4436efeb2d81 100644 --- a/include/svl/stringpool.hxx +++ b/include/svl/stringpool.hxx @@ -37,6 +37,8 @@ class SVL_DLLPUBLIC StringPool const CharClass* mpCharClass; public: + typedef sal_uIntPtr StrIdType; + StringPool(); StringPool( const CharClass* pCharClass ); @@ -58,9 +60,9 @@ public: * * @return unique ID of the string object. */ - const rtl_uString* getIdentifier( const OUString& rStr ) const; + StrIdType getIdentifier( const OUString& rStr ) const; - const rtl_uString* getIdentifierIgnoreCase( const OUString& rStr ) const; + StrIdType getIdentifierIgnoreCase( const OUString& rStr ) const; private: InsertResultType findOrInsert( StrHashType& rPool, const OUString& rStr ) const; diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx index f41ab737783d..003a1523b163 100644 --- a/svl/qa/unit/svl.cxx +++ b/svl/qa/unit/svl.cxx @@ -305,27 +305,30 @@ void Test::testStringPool() CPPUNIT_ASSERT_MESSAGE("They must differ.", p1 != p2); OUString aAndy("Andy"); - p2 = aPool.getIdentifier(aAndy); - CPPUNIT_ASSERT_EQUAL(p1, p2); + svl::StringPool::StrIdType si1 = aPool.getIdentifier("Andy"); + svl::StringPool::StrIdType si2 = aPool.getIdentifier(aAndy); + CPPUNIT_ASSERT_EQUAL(si1, si2); // Test case insensitive string ID's. OUString aAndyLower("andy"), aAndyUpper("ANDY"); - p1 = aPool.getIdentifier("Andy"); - CPPUNIT_ASSERT_MESSAGE("This shouldn't be NULL.", p1); - p2 = aPool.intern(aAndyLower); - CPPUNIT_ASSERT_MESSAGE("They must differ.", p1 != p2); - p2 = aPool.intern(aAndyUpper); - CPPUNIT_ASSERT_MESSAGE("They must differ.", p1 != p2); - - p1 = aPool.getIdentifierIgnoreCase("Andy"); - CPPUNIT_ASSERT_MESSAGE("This shouldn't be NULL.", p1); - p2 = aPool.getIdentifierIgnoreCase("andy"); - CPPUNIT_ASSERT_MESSAGE("This shouldn't be NULL.", p2); - CPPUNIT_ASSERT_EQUAL(p1, p2); - - p2 = aPool.getIdentifierIgnoreCase("ANDY"); - CPPUNIT_ASSERT_MESSAGE("This shouldn't be NULL.", p2); - CPPUNIT_ASSERT_EQUAL(p1, p2); + si1 = aPool.getIdentifier("Andy"); + CPPUNIT_ASSERT_MESSAGE("This shouldn't be NULL.", si1); + aPool.intern(aAndyLower); + si2 = aPool.getIdentifier(aAndyLower); + CPPUNIT_ASSERT_MESSAGE("They must differ.", si1 != si2); + aPool.intern(aAndyUpper); + si2 = aPool.getIdentifier(aAndyUpper); + CPPUNIT_ASSERT_MESSAGE("They must differ.", si1 != si2); + + si1 = aPool.getIdentifierIgnoreCase("Andy"); + CPPUNIT_ASSERT_MESSAGE("This shouldn't be NULL.", si1); + si2 = aPool.getIdentifierIgnoreCase("andy"); + CPPUNIT_ASSERT_MESSAGE("This shouldn't be NULL.", si2); + CPPUNIT_ASSERT_EQUAL(si1, si2); + + si2 = aPool.getIdentifierIgnoreCase("ANDY"); + CPPUNIT_ASSERT_MESSAGE("This shouldn't be NULL.", si2); + CPPUNIT_ASSERT_EQUAL(si1, si2); } void Test::checkPreviewString(SvNumberFormatter& aFormatter, diff --git a/svl/source/misc/stringpool.cxx b/svl/source/misc/stringpool.cxx index 1181538e4ecf..c0030fefa2cd 100644 --- a/svl/source/misc/stringpool.cxx +++ b/svl/source/misc/stringpool.cxx @@ -46,20 +46,20 @@ rtl_uString* StringPool::intern( const OUString& rStr ) return pOrig; } -const rtl_uString* StringPool::getIdentifier( const OUString& rStr ) const +StringPool::StrIdType StringPool::getIdentifier( const OUString& rStr ) const { StrHashType::iterator it = maStrPool.find(rStr); - return (it == maStrPool.end()) ? NULL : it->pData; + return (it == maStrPool.end()) ? 0 : reinterpret_cast<StrIdType>(it->pData); } -const rtl_uString* StringPool::getIdentifierIgnoreCase( const OUString& rStr ) const +StringPool::StrIdType StringPool::getIdentifierIgnoreCase( const OUString& rStr ) const { if (!mpCharClass) - return NULL; + return 0; OUString aUpper = mpCharClass->uppercase(rStr); StrHashType::iterator it = maStrPoolUpper.find(aUpper); - return (it == maStrPool.end()) ? NULL : it->pData; + return (it == maStrPool.end()) ? 0 : reinterpret_cast<StrIdType>(it->pData); } StringPool::InsertResultType StringPool::findOrInsert( StrHashType& rPool, const OUString& rStr ) const |