[Libreoffice-commits] .: Branch 'libreoffice-4-0' - 2 commits - writerfilter/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Fri Dec 7 12:13:32 PST 2012


 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.meeks at 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.meeks at 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


More information about the Libreoffice-commits mailing list