summaryrefslogtreecommitdiff
path: root/sc/inc/cellformtmpl.hxx
diff options
context:
space:
mode:
authorCaolán McNamara <caolan.mcnamara@collabora.com>2024-10-26 20:14:17 +0100
committerCaolán McNamara <caolan.mcnamara@collabora.com>2024-10-27 15:17:39 +0100
commit0ba21e561705ef174c8c0f4e10985f2b24c76b3d (patch)
treeb5c49d269eb8ad7b7973f258c7fcd5fd274cea9d /sc/inc/cellformtmpl.hxx
parent3b62173fdd1492a365211b1f8e0f267aedcd75a1 (diff)
add a visitor contraption to avoid Reference counting costs
brings my save times from 8.7s to to 5.85s Change-Id: I7f3ebbed78ee4d59f4ed9d04f1e35d2ea69a0c01 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175689 Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'sc/inc/cellformtmpl.hxx')
-rw-r--r--sc/inc/cellformtmpl.hxx69
1 files changed, 69 insertions, 0 deletions
diff --git a/sc/inc/cellformtmpl.hxx b/sc/inc/cellformtmpl.hxx
new file mode 100644
index 000000000000..a36ba17a8bbb
--- /dev/null
+++ b/sc/inc/cellformtmpl.hxx
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include "cellform.hxx"
+
+#include <svl/numformat.hxx>
+#include <svl/sharedstring.hxx>
+#include <svl/sharedstringpool.hxx>
+
+#include "formulacell.hxx"
+#include "document.hxx"
+#include "cellvalue.hxx"
+#include <formula/errorcodes.hxx>
+#include "editutil.hxx"
+
+template <typename TFunctor>
+auto ScCellFormat::visitInputSharedString(const ScRefCellValue& rCell, sal_uInt32 nFormat,
+ ScInterpreterContext* pContext, const ScDocument& rDoc,
+ svl::SharedStringPool& rStrPool, bool bFiltering,
+ bool bForceSystemLocale, const TFunctor& rOper)
+{
+ ScInterpreterContext& rContext = pContext ? *pContext : rDoc.GetNonThreadedContext();
+
+ switch (rCell.getType())
+ {
+ case CELLTYPE_STRING:
+ case CELLTYPE_EDIT:
+ return rOper(rCell.getSharedString(&rDoc, rStrPool));
+ case CELLTYPE_VALUE:
+ return rOper(rStrPool.intern(rContext.NFGetInputLineString(
+ rCell.getDouble(), nFormat, bFiltering, bForceSystemLocale)));
+ break;
+ case CELLTYPE_FORMULA:
+ {
+ ScFormulaCell* pFC = rCell.getFormula();
+ const FormulaError nErrCode = pFC->GetErrCode();
+ if (nErrCode != FormulaError::NONE)
+ return rOper(svl::SharedString::getEmptyString());
+ else if (pFC->IsEmptyDisplayedAsString())
+ return rOper(svl::SharedString::getEmptyString());
+ else if (pFC->IsValue())
+ return rOper(rStrPool.intern(rContext.NFGetInputLineString(
+ pFC->GetValue(), nFormat, bFiltering, bForceSystemLocale)));
+ else
+ return rOper(pFC->GetString());
+ }
+ case CELLTYPE_NONE:
+ default:
+ return rOper(svl::SharedString::getEmptyString());
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */