writerfilter/source/rtftok/rtfcharsets.cxx | 1 writerfilter/source/rtftok/rtfcharsets.hxx | 1 writerfilter/source/rtftok/rtfcontrolwords.cxx | 1 writerfilter/source/rtftok/rtfcontrolwords.hxx | 1 writerfilter/source/rtftok/rtfdocumentfactory.cxx | 1 writerfilter/source/rtftok/rtfdocumentimpl.cxx | 7 - writerfilter/source/rtftok/rtfdocumentimpl.hxx | 1 writerfilter/source/rtftok/rtffly.hxx | 1 writerfilter/source/rtftok/rtfreferenceproperties.cxx | 1 writerfilter/source/rtftok/rtfreferenceproperties.hxx | 1 writerfilter/source/rtftok/rtfreferencetable.cxx | 1 writerfilter/source/rtftok/rtfreferencetable.hxx | 1 writerfilter/source/rtftok/rtfsdrimport.cxx | 1 writerfilter/source/rtftok/rtfsdrimport.hxx | 1 writerfilter/source/rtftok/rtfskipdestination.cxx | 1 writerfilter/source/rtftok/rtfskipdestination.hxx | 1 writerfilter/source/rtftok/rtfsprm.cxx | 57 +++++++++++---- writerfilter/source/rtftok/rtfsprm.hxx | 67 ++++++++++++------ writerfilter/source/rtftok/rtftokenizer.cxx | 1 writerfilter/source/rtftok/rtftokenizer.hxx | 1 writerfilter/source/rtftok/rtfvalue.cxx | 1 writerfilter/source/rtftok/rtfvalue.hxx | 1 22 files changed, 110 insertions(+), 40 deletions(-)
New commits: commit 81145625e30596495f22823921432957e0c73aea Author: Michael Meeks <michael.me...@suse.com> Date: Fri Dec 7 20:10:30 2012 +0000 remove bogus assert and add emacs modelines. Change-Id: If4b6478ab67211e00c52fb9b17189f6f054b3482 diff --git a/writerfilter/source/rtftok/rtfcharsets.cxx b/writerfilter/source/rtftok/rtfcharsets.cxx index 360db9e..149c1db 100644 --- a/writerfilter/source/rtftok/rtfcharsets.cxx +++ b/writerfilter/source/rtftok/rtfcharsets.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfcharsets.hxx b/writerfilter/source/rtftok/rtfcharsets.hxx index e4f824d..f47c797 100644 --- a/writerfilter/source/rtftok/rtfcharsets.hxx +++ b/writerfilter/source/rtftok/rtfcharsets.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfcontrolwords.cxx b/writerfilter/source/rtftok/rtfcontrolwords.cxx index 0952805..9ecf9be 100644 --- a/writerfilter/source/rtftok/rtfcontrolwords.cxx +++ b/writerfilter/source/rtftok/rtfcontrolwords.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfcontrolwords.hxx b/writerfilter/source/rtftok/rtfcontrolwords.hxx index 1088982..4c33c9e 100644 --- a/writerfilter/source/rtftok/rtfcontrolwords.hxx +++ b/writerfilter/source/rtftok/rtfcontrolwords.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfdocumentfactory.cxx b/writerfilter/source/rtftok/rtfdocumentfactory.cxx index 8e8868b..f9e53cc 100644 --- a/writerfilter/source/rtftok/rtfdocumentfactory.cxx +++ b/writerfilter/source/rtftok/rtfdocumentfactory.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index fad32e6..1df8de1 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtffly.hxx b/writerfilter/source/rtftok/rtffly.hxx index 8922524..9e2141c 100644 --- a/writerfilter/source/rtftok/rtffly.hxx +++ b/writerfilter/source/rtftok/rtffly.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfreferenceproperties.cxx b/writerfilter/source/rtftok/rtfreferenceproperties.cxx index 50f76e3..63ee665 100644 --- a/writerfilter/source/rtftok/rtfreferenceproperties.cxx +++ b/writerfilter/source/rtftok/rtfreferenceproperties.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfreferenceproperties.hxx b/writerfilter/source/rtftok/rtfreferenceproperties.hxx index 369590b..85c3c67 100644 --- a/writerfilter/source/rtftok/rtfreferenceproperties.hxx +++ b/writerfilter/source/rtftok/rtfreferenceproperties.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfreferencetable.cxx b/writerfilter/source/rtftok/rtfreferencetable.cxx index 9966c68..84eb013 100644 --- a/writerfilter/source/rtftok/rtfreferencetable.cxx +++ b/writerfilter/source/rtftok/rtfreferencetable.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfreferencetable.hxx b/writerfilter/source/rtftok/rtfreferencetable.hxx index 9038c00..cab3a4a 100644 --- a/writerfilter/source/rtftok/rtfreferencetable.hxx +++ b/writerfilter/source/rtftok/rtfreferencetable.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx index 3e74080..641fa97 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.cxx +++ b/writerfilter/source/rtftok/rtfsdrimport.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfsdrimport.hxx b/writerfilter/source/rtftok/rtfsdrimport.hxx index 0924124..9e5645f 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.hxx +++ b/writerfilter/source/rtftok/rtfsdrimport.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfskipdestination.cxx b/writerfilter/source/rtftok/rtfskipdestination.cxx index bbc466a..a1161b7 100644 --- a/writerfilter/source/rtftok/rtfskipdestination.cxx +++ b/writerfilter/source/rtftok/rtfskipdestination.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfskipdestination.hxx b/writerfilter/source/rtftok/rtfskipdestination.hxx index c4b1d22..964abfa 100644 --- a/writerfilter/source/rtftok/rtfskipdestination.hxx +++ b/writerfilter/source/rtftok/rtfskipdestination.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfsprm.cxx b/writerfilter/source/rtftok/rtfsprm.cxx index e11dbe6..2cbf6d6 100644 --- a/writerfilter/source/rtftok/rtfsprm.cxx +++ b/writerfilter/source/rtftok/rtfsprm.cxx @@ -164,7 +164,6 @@ void RTFSprms::ensureCopyBeforeWrite() for (std::vector< std::pair<Id, RTFValue::Pointer_t> >::const_iterator i = m_pSprms->begin(); i != m_pSprms->end(); ++i) pClone->push_back(std::make_pair(i->first, RTFValue::Pointer_t(i->second->Clone()))); m_pSprms = pClone; - assert(m_pSprms->m_nRefCount == 1); } } diff --git a/writerfilter/source/rtftok/rtftokenizer.cxx b/writerfilter/source/rtftok/rtftokenizer.cxx index 6620e74..3515c8b 100644 --- a/writerfilter/source/rtftok/rtftokenizer.cxx +++ b/writerfilter/source/rtftok/rtftokenizer.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtftokenizer.hxx b/writerfilter/source/rtftok/rtftokenizer.hxx index c717faa..cca18be 100644 --- a/writerfilter/source/rtftok/rtftokenizer.hxx +++ b/writerfilter/source/rtftok/rtftokenizer.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfvalue.cxx b/writerfilter/source/rtftok/rtfvalue.cxx index eaacc2a..a0aaf08 100644 --- a/writerfilter/source/rtftok/rtfvalue.cxx +++ b/writerfilter/source/rtftok/rtfvalue.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * diff --git a/writerfilter/source/rtftok/rtfvalue.hxx b/writerfilter/source/rtftok/rtfvalue.hxx index 3714d26..6199a8a 100644 --- a/writerfilter/source/rtftok/rtfvalue.hxx +++ b/writerfilter/source/rtftok/rtfvalue.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * commit 816279ecf7d768110a51accda11ce0037e04068c Author: Michael Meeks <michael.me...@suse.com> Date: Fri Dec 7 13:16:23 2012 +0000 fdo#44736 - convert RTFSprms to a copy-on-write structure. Also try to avoid copy/delete thrash of RTFParserState. diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index aa90d3b..78bd105 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -3407,16 +3407,15 @@ int RTFDocumentImpl::pushState() checkUnicode(); m_nGroupStartPos = Strm().Tell(); - RTFParserState aState(this); + if (m_aStates.empty()) - aState = m_aDefaultState; + m_aStates.push(m_aDefaultState); else { if (m_aStates.top().nDestinationState == DESTINATION_MR) lcl_DestinationToMath(m_aStates.top().aDestinationText, m_aMathBuffer); - aState = m_aStates.top(); + m_aStates.push(m_aStates.top()); } - m_aStates.push(aState); m_aStates.top().aDestinationText.setLength(0); m_pTokenizer->pushGroup(); diff --git a/writerfilter/source/rtftok/rtfsprm.cxx b/writerfilter/source/rtftok/rtfsprm.cxx index 2958cde..e11dbe6 100644 --- a/writerfilter/source/rtftok/rtfsprm.cxx +++ b/writerfilter/source/rtftok/rtfsprm.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * @@ -99,7 +100,7 @@ std::string RTFSprm::toString() const RTFValue::Pointer_t RTFSprms::find(Id nKeyword) { - for (RTFSprms::Iterator_t i = m_aSprms.begin(); i != m_aSprms.end(); ++i) + for (RTFSprms::Iterator_t i = m_pSprms->begin(); i != m_pSprms->end(); ++i) if (i->first == nKeyword) return i->second; RTFValue::Pointer_t pValue; @@ -108,33 +109,39 @@ RTFValue::Pointer_t RTFSprms::find(Id nKeyword) void RTFSprms::set(Id nKeyword, RTFValue::Pointer_t pValue, bool bOverwrite) { + ensureCopyBeforeWrite(); if (bOverwrite) { - for (RTFSprms::Iterator_t i = m_aSprms.begin(); i != m_aSprms.end(); ++i) + for (RTFSprms::Iterator_t i = m_pSprms->begin(); i != m_pSprms->end(); ++i) if (i->first == nKeyword) { i->second = pValue; return; } } - m_aSprms.push_back(std::make_pair(nKeyword, pValue)); + m_pSprms->push_back(std::make_pair(nKeyword, pValue)); } bool RTFSprms::erase(Id nKeyword) { - for (RTFSprms::Iterator_t i = m_aSprms.begin(); i != m_aSprms.end(); ++i) + ensureCopyBeforeWrite(); + for (RTFSprms::Iterator_t i = m_pSprms->begin(); i != m_pSprms->end(); ++i) + { if (i->first == nKeyword) { - m_aSprms.erase(i); + m_pSprms->erase(i); return true; } + } return false; } void RTFSprms::deduplicate(RTFSprms& rReference) { - RTFSprms::Iterator_t i = m_aSprms.begin(); - while (i != m_aSprms.end()) + ensureCopyBeforeWrite(); + + RTFSprms::Iterator_t i = m_pSprms->begin(); + while (i != m_pSprms->end()) { bool bIgnore = false; if (i->first != NS_rtf::LN_ISTD) @@ -144,33 +151,56 @@ void RTFSprms::deduplicate(RTFSprms& rReference) bIgnore = true; } if (bIgnore) - i = m_aSprms.erase(i); + i = m_pSprms->erase(i); else ++i; } } +void RTFSprms::ensureCopyBeforeWrite() +{ + if (m_pSprms->m_nRefCount > 1) { + boost::intrusive_ptr<RTFSprmsImpl> pClone(new RTFSprmsImpl()); + for (std::vector< std::pair<Id, RTFValue::Pointer_t> >::const_iterator i = m_pSprms->begin(); i != m_pSprms->end(); ++i) + pClone->push_back(std::make_pair(i->first, RTFValue::Pointer_t(i->second->Clone()))); + m_pSprms = pClone; + assert(m_pSprms->m_nRefCount == 1); + } +} + RTFSprms::RTFSprms() - : m_aSprms() + : m_pSprms(new RTFSprmsImpl()) +{ +} + +RTFSprms::~RTFSprms() { } RTFSprms::RTFSprms(const RTFSprms& rSprms) { - for (std::vector< std::pair<Id, RTFValue::Pointer_t> >::const_iterator i = rSprms.m_aSprms.begin(); i != rSprms.m_aSprms.end(); ++i) - m_aSprms.push_back(std::make_pair(i->first, RTFValue::Pointer_t(i->second->Clone()))); + *this = rSprms; } RTFSprms& RTFSprms::operator=(const RTFSprms& rOther) { - RTFSprms aTmp(rOther); - swap(aTmp); + m_pSprms = rOther.m_pSprms; return *this; } void RTFSprms::swap(RTFSprms& rOther) { - m_aSprms.swap(rOther.m_aSprms); + boost::intrusive_ptr<RTFSprmsImpl> pTmp = rOther.m_pSprms; + rOther.m_pSprms = m_pSprms; + m_pSprms = pTmp; +} + +void RTFSprms::clear() +{ + if (m_pSprms->m_nRefCount == 1) + return m_pSprms->clear(); + else + m_pSprms.reset(new RTFSprmsImpl()); } } // namespace rtftok diff --git a/writerfilter/source/rtftok/rtfsprm.hxx b/writerfilter/source/rtftok/rtfsprm.hxx index 80d41a3..5f7a793 100644 --- a/writerfilter/source/rtftok/rtfsprm.hxx +++ b/writerfilter/source/rtftok/rtfsprm.hxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * Version: MPL 1.1 / GPLv3+ / LGPLv3+ * @@ -28,36 +29,58 @@ #ifndef _RTFSPRM_HXX_ #define _RTFSPRM_HXX_ +#include <boost/intrusive_ptr.hpp> #include <rtfcontrolwords.hxx> #include <rtfvalue.hxx> namespace writerfilter { namespace rtftok { + + typedef std::vector< std::pair<Id, RTFValue::Pointer_t> > RTFSprmsImplBase; + class RTFSprmsImpl : public RTFSprmsImplBase + { + public: + sal_Int32 m_nRefCount; + RTFSprmsImpl() : RTFSprmsImplBase(), m_nRefCount(0) {} + }; + + inline void intrusive_ptr_add_ref(RTFSprmsImpl* p) + { + ++(p->m_nRefCount); + } + inline void intrusive_ptr_release(RTFSprmsImpl* p) + { + if (!--(p->m_nRefCount)) + delete p; + } + /// A list of RTFSprm with a copy constructor that performs a deep copy. class RTFSprms { - public: - typedef ::boost::shared_ptr<RTFSprms> Pointer_t; - typedef std::pair<Id, RTFValue::Pointer_t> Entry_t; - typedef std::vector<Entry_t>::iterator Iterator_t; - RTFSprms(); - RTFSprms(const RTFSprms& rSprms); - RTFSprms& operator=(const RTFSprms& rOther); - RTFValue::Pointer_t find(Id nKeyword); - /// Does the same as ->push_back(), except that it can overwrite existing entries. - void set(Id nKeyword, RTFValue::Pointer_t pValue, bool bOverwrite = true); - bool erase(Id nKeyword); - /// Removes elements, which are already in the reference set. - void deduplicate(RTFSprms& rReference); - void swap(RTFSprms& rOther); - size_t size() const { return m_aSprms.size(); } - bool empty() const { return m_aSprms.empty(); } - Entry_t& back() { return m_aSprms.back(); } - Iterator_t begin() { return m_aSprms.begin(); } - Iterator_t end() { return m_aSprms.end(); } - void clear() { return m_aSprms.clear(); } - private: - std::vector< std::pair<Id, RTFValue::Pointer_t> > m_aSprms; + public: + typedef ::boost::shared_ptr<RTFSprms> Pointer_t; + typedef std::pair<Id, RTFValue::Pointer_t> Entry_t; + typedef std::vector<Entry_t>::iterator Iterator_t; + RTFSprms(); + RTFSprms(const RTFSprms& rSprms); + ~RTFSprms(); + RTFSprms& operator=(const RTFSprms& rOther); + RTFValue::Pointer_t find(Id nKeyword); + /// Does the same as ->push_back(), except that it can overwrite existing entries. + void set(Id nKeyword, RTFValue::Pointer_t pValue, bool bOverwrite = true); + bool erase(Id nKeyword); + /// Removes elements, which are already in the reference set. + void deduplicate(RTFSprms& rReference); + void swap(RTFSprms& rOther); + size_t size() const { return m_pSprms->size(); } + bool empty() const { return m_pSprms->empty(); } + Entry_t& back() { return m_pSprms->back(); } + Iterator_t begin() { return m_pSprms->begin(); } + Iterator_t end() { return m_pSprms->end(); } + void clear(); + private: + void ensureCopyBeforeWrite(); + boost::intrusive_ptr<RTFSprmsImpl> m_pSprms; }; /// RTF keyword with a parameter _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits