[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