commit cbad214cdda5f85a177148e38c138b9560ba0c17
Author: Yuriy Skalko <[email protected]>
Date: Sat Nov 21 15:40:31 2020 +0200
Refactor checksum calculation
---
src/ConverterCache.cpp | 13 ++-------
src/frontends/qt/GuiApplication.cpp | 11 ++------
src/frontends/qt/GuiClipboard.cpp | 15 ++++-------
src/support/FileName.cpp | 22 ++++------------
src/support/Makefile.am | 2 +
src/support/checksum.cpp | 46 +++++++++++++++++++++++++++++++++++
src/support/checksum.h | 30 ++++++++++++++++++++++
7 files changed, 95 insertions(+), 44 deletions(-)
diff --git a/src/ConverterCache.cpp b/src/ConverterCache.cpp
index bee0253..0f4d03e 100644
--- a/src/ConverterCache.cpp
+++ b/src/ConverterCache.cpp
@@ -25,8 +25,8 @@
#include "support/lyxtime.h"
#include "support/Package.h"
+#include "support/checksum.h"
#include "support/lassert.h"
-#include <boost/crc.hpp>
#include <algorithm>
#include <fstream>
@@ -41,14 +41,6 @@ namespace lyx {
namespace {
-unsigned long do_crc(string const & s)
-{
- boost::crc_32_type crc;
- crc = for_each(s.begin(), s.end(), crc);
- return crc.checksum();
-}
-
-
// FIXME THREAD
// This should be OK because it is only assigned during init()
static FileName cache_dir;
@@ -62,7 +54,8 @@ public:
: timestamp(t), checksum(c)
{
ostringstream os;
- os << setw(10) << setfill('0') <<
do_crc(orig_from.absFileName())
+ os << setw(10) << setfill('0')
+ << support::checksum(orig_from.absFileName())
<< '-' << to_format;
cache_name = FileName(addName(cache_dir.absFileName(),
os.str()));
LYXERR(Debug::FILES, "Add file cache item " << orig_from
diff --git a/src/frontends/qt/GuiApplication.cpp
b/src/frontends/qt/GuiApplication.cpp
index b3cfd5e..8ab89b8 100644
--- a/src/frontends/qt/GuiApplication.cpp
+++ b/src/frontends/qt/GuiApplication.cpp
@@ -59,6 +59,7 @@
#include "insets/InsetText.h"
+#include "support/checksum.h"
#include "support/convert.h"
#include "support/debug.h"
#include "support/ExceptionMessage.h"
@@ -146,8 +147,6 @@
#include <QMacPasteboardMime>
#endif // Q_OS_MAC
-#include <boost/crc.hpp>
-
#include <exception>
#include <sstream>
#include <vector>
@@ -1708,9 +1707,7 @@ void GuiApplication::dispatch(FuncRequest const & cmd,
DispatchResult & dr)
&& !is_open)) {
// We want the ui session to be saved per document and
not per
// window number. The filename crc is a good enough
identifier.
- boost::crc_32_type crc;
- crc = for_each(fname.begin(), fname.end(), crc);
- createView(crc.checksum());
+ createView(support::checksum(fname));
current_view_->openDocument(fname);
if (!current_view_->documentBufferView())
current_view_->close();
@@ -2670,10 +2667,8 @@ void GuiApplication::restoreGuiSession()
FileName const & file_name = last.file_name;
if (!current_view_ || (!lyxrc.open_buffers_in_tabs
&& current_view_->documentBufferView() != 0)) {
- boost::crc_32_type crc;
string const & fname = file_name.absFileName();
- crc = for_each(fname.begin(), fname.end(), crc);
- createView(crc.checksum());
+ createView(support::checksum(fname));
}
current_view_->loadDocument(file_name, false);
diff --git a/src/frontends/qt/GuiClipboard.cpp
b/src/frontends/qt/GuiClipboard.cpp
index 59e5900..f78ab1c 100644
--- a/src/frontends/qt/GuiClipboard.cpp
+++ b/src/frontends/qt/GuiClipboard.cpp
@@ -35,6 +35,8 @@
#include "frontends/alert.h"
+#include "support/checksum.h"
+
#include <QApplication>
#include <QBuffer>
#include <QClipboard>
@@ -47,8 +49,6 @@
#include <QTextDocument>
#include <QTimer>
-#include <boost/crc.hpp>
-
#include <memory>
#include <map>
#include <iostream>
@@ -431,11 +431,8 @@ void GuiClipboard::put(string const & lyx, docstring const
& html, docstring con
data->setData(lyxMimeType(), qlyx);
// If the OS has not the concept of clipboard ownership,
// we recognize internal data through its checksum.
- if (!hasInternal()) {
- boost::crc_32_type crc32;
- crc32.process_bytes(lyx.c_str(), lyx.size());
- checksum = crc32.checksum();
- }
+ if (!hasInternal())
+ checksum = support::checksum(lyx);
}
// Don't test for text.empty() since we want to be able to clear the
// clipboard.
@@ -528,9 +525,7 @@ bool GuiClipboard::isInternal() const
// ourself by comparing its checksum with the stored one.
QByteArray const ar = cache_.data(lyxMimeType());
string const data(ar.data(), ar.count());
- boost::crc_32_type crc32;
- crc32.process_bytes(data.c_str(), data.size());
- return checksum == crc32.checksum();
+ return checksum == static_cast<std::uint32_t>(support::checksum(data));
}
diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp
index 4e075f2..3d31c7d 100644
--- a/src/support/FileName.cpp
+++ b/src/support/FileName.cpp
@@ -35,7 +35,7 @@
#include <QThread>
#endif
-#include <boost/crc.hpp>
+#include "support/checksum.h"
#include <algorithm>
#include <iterator>
@@ -537,20 +537,14 @@ bool FileName::link(FileName const & name) const
unsigned long checksum_ifstream_fallback(char const * file)
{
- unsigned long result = 0;
//LYXERR(Debug::FILES, "lyx::sum() using istreambuf_iterator (fast)");
ifstream ifs(file, ios_base::in | ios_base::binary);
if (!ifs)
- return result;
-
- istreambuf_iterator<char> beg(ifs);
- istreambuf_iterator<char> end;
- boost::crc_32_type crc;
- crc = for_each(beg, end, crc);
- result = crc.checksum();
- return result;
+ return 0;
+ return support::checksum(ifs);
}
+
unsigned long FileName::checksum() const
{
if (!exists()) {
@@ -583,11 +577,9 @@ unsigned long FileName::checksum() const
qint64 size = fi.size();
uchar * ubeg = qf.map(0, size);
uchar * uend = ubeg + size;
- boost::crc_32_type ucrc;
- ucrc.process_block(ubeg, uend);
+ result = support::checksum(ubeg, uend);
qf.unmap(ubeg);
qf.close();
- result = ucrc.checksum();
#else // QT_VERSION
@@ -619,9 +611,7 @@ unsigned long FileName::checksum() const
char * beg = static_cast<char*>(mm);
char * end = beg + info.st_size;
- boost::crc_32_type crc;
- crc.process_block(beg, end);
- result = crc.checksum();
+ result = support::checksum(beg, end);
munmap(mm, info.st_size);
close(fd);
diff --git a/src/support/Makefile.am b/src/support/Makefile.am
index addeab8..45d30b8 100644
--- a/src/support/Makefile.am
+++ b/src/support/Makefile.am
@@ -38,6 +38,8 @@ liblyxsupport_a_SOURCES = \
bind.h \
Cache.h \
Changer.h \
+ checksum.cpp \
+ checksum.h \
ConsoleApplication.cpp \
ConsoleApplication.h \
ConsoleApplicationPrivate.h \
diff --git a/src/support/checksum.cpp b/src/support/checksum.cpp
new file mode 100644
index 0000000..151b533
--- /dev/null
+++ b/src/support/checksum.cpp
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+/**
+ * \file checksum.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Yuriy Skalko
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include "support/checksum.h"
+#include "boost/crc.hpp"
+#include <iterator>
+
+namespace lyx {
+
+namespace support {
+
+unsigned long checksum(std::string const & s)
+{
+ boost::crc_32_type crc;
+ crc.process_bytes(s.c_str(), s.size());
+ return crc.checksum();
+}
+
+unsigned long checksum(std::ifstream & ifs)
+{
+ std::istreambuf_iterator<char> beg(ifs);
+ std::istreambuf_iterator<char> end;
+
+ boost::crc_32_type crc;
+ crc = for_each(beg, end, crc);
+ return crc.checksum();
+}
+
+unsigned long checksum(char const * beg, char const * end)
+{
+ boost::crc_32_type crc;
+ crc.process_block(beg, end);
+ return crc.checksum();
+}
+
+} // namespace support
+
+} // namespace lyx
diff --git a/src/support/checksum.h b/src/support/checksum.h
new file mode 100644
index 0000000..ab14339
--- /dev/null
+++ b/src/support/checksum.h
@@ -0,0 +1,30 @@
+// -*- C++ -*-
+/**
+ * \file checksum.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Yuriy Skalko
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef LYX_CHECKSUM_H
+#define LYX_CHECKSUM_H
+
+#include <fstream>
+#include <string>
+
+namespace lyx {
+
+namespace support {
+
+unsigned long checksum(std::string const & s);
+unsigned long checksum(std::ifstream & ifs);
+unsigned long checksum(char const * beg, char const * end);
+
+} // namespace support
+
+} // namespace lyx
+
+#endif // LYX_CHECKSUM_H
--
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs