[Libreoffice-commits] core.git: sw/source
Chris Laplante
mostthingsweb at gmail.com
Fri Apr 18 02:49:00 PDT 2014
sw/source/core/doc/SwStyleNameMapper.cxx | 155 ++++++++++++-------------------
1 file changed, 60 insertions(+), 95 deletions(-)
New commits:
commit bfefe114e11d155abf0785a3b2c887fcf4077199
Author: Chris Laplante <mostthingsweb at gmail.com>
Date: Wed Apr 9 15:15:14 2014 -0400
Rewrite getHash to reduce code duplication & improve maintainability.
Instead of each case block repeating the same operations, we build
an intermediate vector of entries to process.
Change-Id: Id111d7938a7802f6f016c2a0d1be0cb062a32110
Reviewed-on: https://gerrit.libreoffice.org/8912
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/sw/source/core/doc/SwStyleNameMapper.cxx b/sw/source/core/doc/SwStyleNameMapper.cxx
index d85a6de..6bff575 100644
--- a/sw/source/core/doc/SwStyleNameMapper.cxx
+++ b/sw/source/core/doc/SwStyleNameMapper.cxx
@@ -17,6 +17,9 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
+#include <numeric>
+#include <boost/tuple/tuple.hpp>
+
#include <SwStyleNameMapper.hxx>
#include <tools/resmgr.hxx>
#include <poolfmt.hxx>
@@ -388,6 +391,13 @@ static void lcl_CheckSuffixAndDelete(OUString & rString)
rString = rString.copy(0, rString.getLength() - 7);
}
}
+
+typedef boost::tuple<sal_uInt16, sal_uInt16, const ::std::vector<OUString>& (*)() > NameArrayIndexTuple_t;
+
+static sal_uInt16 lcl_AccumulateIndexCount( sal_uInt16 nSum, NameArrayIndexTuple_t const tuple ){
+ // Return running sum + (index end) - (index start)
+ return nSum + boost::get<1>( tuple ) - boost::get<0>( tuple );
+}
}
#ifdef _NEED_TO_DEBUG_MAPPING
@@ -413,124 +423,79 @@ void SwStyleNameMapper::testNameTable( SwGetPoolIdFromName const nFamily, sal_uI
const NameToIdHash & SwStyleNameMapper::getHashTable ( SwGetPoolIdFromName eFlags, bool bProgName )
{
- NameToIdHash *pHash = 0;
- const ::std::vector<OUString> *pStrings = 0;
+ // pHashPointer is a pointer to a pointer which stores the UI/prog name array
+ NameToIdHash **pHashPointer = 0;
+ // Stores tuples representing (index start, index end, pointer to function which returns ref to name array)
+ ::std::vector<NameArrayIndexTuple_t> vIndexes;
switch ( eFlags )
{
case nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL:
{
- sal_uInt16 nIndex;
- sal_uInt16 nId;
-
- pHash = bProgName ? pParaProgMap : pParaUIMap;
- if ( !pHash )
- {
- pHash = new NameToIdHash ( RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN +
- RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN +
- RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN +
- RES_POOLCOLL_REGISTER_END - RES_POOLCOLL_REGISTER_BEGIN +
- RES_POOLCOLL_DOC_END - RES_POOLCOLL_DOC_BEGIN +
- RES_POOLCOLL_HTML_END - RES_POOLCOLL_HTML_BEGIN );
- pStrings = bProgName ? &GetTextProgNameArray() : &GetTextUINameArray();
- for ( nIndex = 0, nId = RES_POOLCOLL_TEXT_BEGIN ; nId < RES_POOLCOLL_TEXT_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- pStrings = bProgName ? &GetListsProgNameArray() : &GetListsUINameArray();
- for ( nIndex = 0, nId = RES_POOLCOLL_LISTS_BEGIN ; nId < RES_POOLCOLL_LISTS_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- pStrings = bProgName ? &GetExtraProgNameArray() : &GetExtraUINameArray();
- for ( nIndex = 0, nId = RES_POOLCOLL_EXTRA_BEGIN ; nId < RES_POOLCOLL_EXTRA_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- pStrings = bProgName ? &GetRegisterProgNameArray() : &GetRegisterUINameArray();
- for ( nIndex = 0, nId = RES_POOLCOLL_REGISTER_BEGIN ; nId < RES_POOLCOLL_REGISTER_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- pStrings = bProgName ? &GetDocProgNameArray() : &GetDocUINameArray();
- for ( nIndex = 0, nId = RES_POOLCOLL_DOC_BEGIN ; nId < RES_POOLCOLL_DOC_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- pStrings = bProgName ? &GetHTMLProgNameArray() : &GetHTMLUINameArray();
- for ( nIndex = 0, nId = RES_POOLCOLL_HTML_BEGIN ; nId < RES_POOLCOLL_HTML_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
-
- if ( bProgName )
- pParaProgMap = pHash;
- else
- pParaUIMap = pHash;
- }
+ pHashPointer = bProgName ? &pParaProgMap : &pParaUIMap;
+ vIndexes.push_back( boost::make_tuple(RES_POOLCOLL_TEXT_BEGIN, RES_POOLCOLL_TEXT_END, bProgName ? &GetTextProgNameArray : &GetTextUINameArray) );
+ vIndexes.push_back( boost::make_tuple(RES_POOLCOLL_LISTS_BEGIN, RES_POOLCOLL_LISTS_END, bProgName ? &GetListsProgNameArray : &GetListsUINameArray) );
+ vIndexes.push_back( boost::make_tuple(RES_POOLCOLL_EXTRA_BEGIN, RES_POOLCOLL_EXTRA_END, bProgName ? &GetExtraProgNameArray : &GetExtraUINameArray) );
+ vIndexes.push_back( boost::make_tuple(RES_POOLCOLL_REGISTER_BEGIN, RES_POOLCOLL_REGISTER_END, bProgName ? &GetRegisterProgNameArray : &GetRegisterUINameArray) );
+ vIndexes.push_back( boost::make_tuple(RES_POOLCOLL_DOC_BEGIN, RES_POOLCOLL_DOC_END, bProgName ? &GetDocProgNameArray : &GetDocUINameArray) );
+ vIndexes.push_back( boost::make_tuple(RES_POOLCOLL_HTML_BEGIN, RES_POOLCOLL_HTML_END, bProgName ? &GetHTMLProgNameArray : &GetHTMLUINameArray) );
}
break;
case nsSwGetPoolIdFromName::GET_POOLID_CHRFMT:
{
- pHash = bProgName ? pCharProgMap : pCharUIMap;
- if ( !pHash )
- {
- sal_uInt16 nIndex;
- sal_uInt16 nId;
-
- pHash = new NameToIdHash ( RES_POOLCHR_NORMAL_END - RES_POOLCHR_NORMAL_BEGIN +
- RES_POOLCHR_HTML_END - RES_POOLCHR_HTML_BEGIN );
- pStrings = bProgName ? &GetChrFmtProgNameArray() : &GetChrFmtUINameArray();
- for ( nIndex = 0, nId = RES_POOLCHR_NORMAL_BEGIN ; nId < RES_POOLCHR_NORMAL_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- pStrings = bProgName ? &GetHTMLChrFmtProgNameArray() : &GetHTMLChrFmtUINameArray();
- for ( nIndex = 0, nId = RES_POOLCHR_HTML_BEGIN ; nId < RES_POOLCHR_HTML_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- if (bProgName )
- pCharProgMap = pHash;
- else
- pCharUIMap = pHash;
- }
+ pHashPointer = bProgName ? &pCharProgMap : &pCharUIMap;
+ vIndexes.push_back( boost::make_tuple(RES_POOLCHR_NORMAL_BEGIN, RES_POOLCHR_NORMAL_END, bProgName ? &GetChrFmtProgNameArray : &GetChrFmtUINameArray) );
+ vIndexes.push_back( boost::make_tuple(RES_POOLCHR_HTML_BEGIN, RES_POOLCHR_HTML_END, bProgName ? &GetHTMLChrFmtProgNameArray : &GetHTMLChrFmtUINameArray) );
}
break;
case nsSwGetPoolIdFromName::GET_POOLID_FRMFMT:
{
- pHash = bProgName ? pFrameProgMap : pFrameUIMap;
- if ( !pHash )
- {
- pHash = new NameToIdHash ( RES_POOLFRM_END - RES_POOLFRM_BEGIN );
- pStrings = bProgName ? &GetFrmFmtProgNameArray() : &GetFrmFmtUINameArray();
- for ( sal_uInt16 nIndex=0,nId = RES_POOLFRM_BEGIN ; nId < RES_POOLFRM_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- if ( bProgName )
- pFrameProgMap = pHash;
- else
- pFrameUIMap = pHash;
- }
+ pHashPointer = bProgName ? &pFrameProgMap : &pFrameUIMap;
+ vIndexes.push_back( boost::make_tuple(RES_POOLFRM_BEGIN, RES_POOLFRM_END, bProgName ? &GetFrmFmtProgNameArray : &GetFrmFmtUINameArray) );
}
break;
case nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC:
{
- pHash = bProgName ? pPageProgMap : pPageUIMap;
- if ( !pHash )
- {
- pHash = new NameToIdHash ( RES_POOLPAGE_END - RES_POOLPAGE_BEGIN );
- pStrings = bProgName ? &GetPageDescProgNameArray() : &GetPageDescUINameArray();
- for ( sal_uInt16 nIndex=0,nId = RES_POOLPAGE_BEGIN ; nId < RES_POOLPAGE_END ; nId++,nIndex++ )
- (*pHash)[((*pStrings)[nIndex])] = nId;
- if ( bProgName )
- pPageProgMap = pHash;
- else
- pPageUIMap = pHash;
- }
+ pHashPointer = bProgName ? &pPageProgMap : &pPageUIMap;
+ vIndexes.push_back( boost::make_tuple(RES_POOLPAGE_BEGIN, RES_POOLPAGE_END, bProgName ? &GetPageDescProgNameArray : &GetPageDescUINameArray) );
}
break;
case nsSwGetPoolIdFromName::GET_POOLID_NUMRULE:
{
- pHash = bProgName ? pNumRuleProgMap : pNumRuleUIMap;
- if ( !pHash )
+ pHashPointer = bProgName ? &pNumRuleProgMap : &pNumRuleUIMap;
+ vIndexes.push_back( boost::make_tuple(RES_POOLNUMRULE_BEGIN, RES_POOLNUMRULE_END, bProgName ? &GetNumRuleProgNameArray : &GetNumRuleUINameArray) );
+ }
+ break;
+ default:
+ {
+ // TODO: Is there a better way of failing here?
+ *pHashPointer = new NameToIdHash( 0 );
+ return **pHashPointer;
+ }
+ break;
+ }
+
+ // Proceed if we have a pointer to a hash, and the hash hasn't already been populated
+ if ( pHashPointer && !*pHashPointer )
+ {
+ // Compute the size of the hash we need to build
+ sal_uInt16 nSize = std::accumulate( vIndexes.begin(), vIndexes.end(), 0, lcl_AccumulateIndexCount );
+
+ NameToIdHash *pHash = new NameToIdHash( nSize );
+ for ( ::std::vector<NameArrayIndexTuple_t>::iterator entry = vIndexes.begin(); entry != vIndexes.end(); ++entry )
+ {
+ // Get a pointer to the function which will populate pStrings
+ const ::std::vector<OUString>& (*pStringsFetchFunc)() = boost::get<2>( *entry );
+ if ( pStringsFetchFunc )
{
- pHash = new NameToIdHash ( RES_POOLNUMRULE_END - RES_POOLNUMRULE_BEGIN );
- pStrings = bProgName ? &GetNumRuleProgNameArray() : &GetNumRuleUINameArray();
- for ( sal_uInt16 nIndex=0,nId = RES_POOLNUMRULE_BEGIN ; nId < RES_POOLNUMRULE_END ; nId++,nIndex++ )
- {
- (*pHash)[((*pStrings)[nIndex])] = nId;
- }
- if ( bProgName )
- pNumRuleProgMap = pHash;
- else
- pNumRuleUIMap = pHash;
+ const ::std::vector<OUString>& pStrings = pStringsFetchFunc();
+ sal_uInt16 nIndex, nId;
+ for ( nIndex = 0, nId = boost::get<0>( *entry ) ; nId < boost::get<1>( *entry ) ; nId++, nIndex++ )
+ (*pHash)[pStrings[nIndex]] = nId;
}
}
- break;
+
+ *pHashPointer = pHash;
}
#ifdef _NEED_TO_DEBUG_MAPPING
@@ -552,7 +517,7 @@ const NameToIdHash & SwStyleNameMapper::getHashTable ( SwGetPoolIdFromName eFlag
testNameTable( nsSwGetPoolIdFromName::GET_POOLID_NUMRULE, RES_POOLNUMRULE_BEGIN, RES_POOLNUMRULE_END );
}
#endif
- return *pHash;
+ return **pHashPointer;
}
// This gets the UI name from the programmatic name
More information about the Libreoffice-commits
mailing list