diff --git a/lib/generate_contributions.py b/lib/generate_contributions.py index e549ab29c5..0b49a024a9 100755 --- a/lib/generate_contributions.py +++ b/lib/generate_contributions.py @@ -607,6 +607,14 @@ contributors = [ "20 Sep 2007", u"Advanced search feature"), + contributor(u"Thibaut Cuvelier", + "dourouc05 () gmail ! com", + "GPL", + "Re: Patches to improve compatibility with modern C++ standard", + "msg211215", + "4 May 2020", + u"Windows compatibility patches"), + contributor(u"Matthias Kalle Dalheimer", "kalle () kdab ! net", "GPL", diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp index f45d370ece..678312ab7a 100644 --- a/src/BiblioInfo.cpp +++ b/src/BiblioInfo.cpp @@ -1149,13 +1149,9 @@ docstring BibTeXInfo::getValueForKey(string const & oldkey, Buffer const & buf, namespace { // A functor for use with sort, leading to case insensitive sorting -class compareNoCase: public binary_function -{ -public: - bool operator()(docstring const & s1, docstring const & s2) const { - return compare_no_case(s1, s2) < 0; - } -}; +bool compareNoCase(const docstring & a, const docstring & b) { + return compare_no_case(a, b) < 0; +} } // namespace @@ -1206,7 +1202,7 @@ vector const BiblioInfo::getKeys() const BiblioInfo::const_iterator it = begin(); for (; it != end(); ++it) bibkeys.push_back(it->first); - sort(bibkeys.begin(), bibkeys.end(), compareNoCase()); + sort(bibkeys.begin(), bibkeys.end(), &compareNoCase); return bibkeys; } diff --git a/src/BranchList.cpp b/src/BranchList.cpp index ec6a413c6c..855a82c367 100644 --- a/src/BranchList.cpp +++ b/src/BranchList.cpp @@ -150,9 +150,7 @@ bool BranchList::add(docstring const & s) else name = s.substr(i, j - i); // Is this name already in the list? - bool const already = - find_if(list.begin(), list.end(), - BranchNamesEqual(name)) != list.end(); + bool const already = find(name) != nullptr; if (!already) { added = true; Branch br; @@ -182,8 +180,7 @@ bool BranchList::rename(docstring const & oldname, { if (newname.empty()) return false; - if (find_if(list.begin(), list.end(), - BranchNamesEqual(newname)) != list.end()) { + if (find(newname)) { // new name already taken if (merge) return remove(oldname); diff --git a/src/Format.cpp b/src/Format.cpp index da93457165..3da2120278 100644 --- a/src/Format.cpp +++ b/src/Format.cpp @@ -181,6 +181,19 @@ Format const * Formats::getFormat(string const & name) const } +Format * Formats::getFormat(string const & name) +{ + FormatList::iterator it = + find_if(formatlist_.begin(), formatlist_.end(), + [name](Format const & f) { return f.name() == name; }); + + if (it != formatlist_.end()) + return &(*it); + + return nullptr; +} + + namespace { /** Guess the file format name (as in Format::name()) from contents. @@ -611,15 +624,13 @@ void Formats::add(string const & name, string const & extensions, string const & viewer, string const & editor, string const & mime, int flags) { - FormatList::iterator it = - find_if(formatlist_.begin(), formatlist_.end(), - FormatNamesEqual(name)); - if (it == formatlist_.end()) - formatlist_.push_back(Format(name, extensions, prettyname, - shortcut, viewer, editor, mime, flags)); + Format * format = getFormat(name); + if (format) + *format = Format(name, extensions, prettyname, shortcut, viewer, + editor, mime, flags); else - *it = Format(name, extensions, prettyname, shortcut, viewer, - editor, mime, flags); + formatlist_.push_back(Format(name, extensions, prettyname, + shortcut, viewer, editor, mime, flags)); } @@ -642,22 +653,22 @@ void Formats::sort() void Formats::setViewer(string const & name, string const & command) { add(name); - FormatList::iterator it = - find_if(formatlist_.begin(), formatlist_.end(), - FormatNamesEqual(name)); - if (it != formatlist_.end()) - it->setViewer(command); + Format * format = getFormat(name); + if (format) + format->setViewer(command); + else + LYXERR0("Unable to set viewer for non-existent format: " << name); } void Formats::setEditor(string const & name, string const & command) { add(name); - FormatList::iterator it = - find_if(formatlist_.begin(), formatlist_.end(), - FormatNamesEqual(name)); - if (it != formatlist_.end()) - it->setEditor(command); + Format * format = getFormat(name); + if (format) + format->setEditor(command); + else + LYXERR0("Unable to set editor for non-existent format: " << name); } diff --git a/src/Format.h b/src/Format.h index 4fcd3c9553..495d9b1c8b 100644 --- a/src/Format.h +++ b/src/Format.h @@ -152,6 +152,8 @@ public: Format & get(FormatList::size_type i) { return formatlist_[i]; } /// \returns format named \p name if it exists, otherwise 0 Format const * getFormat(std::string const & name) const; + /// \returns format named \p name if it exists, otherwise 0 + Format * getFormat(std::string const & name); /*! * Get the format of \p filename from file contents or, if this * fails, from file extension. diff --git a/src/Lexer.cpp b/src/Lexer.cpp index 098faa9737..47d57c3eba 100644 --- a/src/Lexer.cpp +++ b/src/Lexer.cpp @@ -132,25 +132,21 @@ private: }; - namespace { -class CompareTags - : public binary_function { -public: - // used by lower_bound, sort and sorted - bool operator()(LexerKeyword const & a, LexerKeyword const & b) const - { - // we use the ascii version, because in turkish, 'i' - // is not the lowercase version of 'I', and thus - // turkish locale breaks parsing of tags. - return compare_ascii_no_case(a.tag, b.tag) < 0; - } -}; +// used by lower_bound, sort and sorted +bool compareTags(LexerKeyword const & a, LexerKeyword const & b) +{ + // we use the ascii version, because in turkish, 'i' + // is not the lowercase version of 'I', and thus + // turkish locale breaks parsing of tags. + return compare_ascii_no_case(a.tag, b.tag) < 0; +} } // namespace + Lexer::Pimpl::Pimpl(LexerKeyword * tab, int num) : is(&fb_), table(tab), no_items(num), status(0), lineno(0), commentChar('#') @@ -196,14 +192,14 @@ void Lexer::Pimpl::verifyTable() { // Check if the table is sorted and if not, sort it. if (table - && !lyx::sorted(table, table + no_items, CompareTags())) { + && !lyx::sorted(table, table + no_items, &compareTags)) { lyxerr << "The table passed to Lexer is not sorted!\n" << "Tell the developers to fix it!" << endl; // We sort it anyway to avoid problems. lyxerr << "\nUnsorted:" << endl; printTable(lyxerr); - sort(table, table + no_items, CompareTags()); + sort(table, table + no_items, &compareTags); lyxerr << "\nSorted:" << endl; printTable(lyxerr); } @@ -440,7 +436,7 @@ int Lexer::Pimpl::searchKeyword(char const * const tag) const LexerKeyword search_tag = { tag, 0 }; LexerKeyword * res = lower_bound(table, table + no_items, - search_tag, CompareTags()); + search_tag, &compareTags); // use the compare_ascii_no_case instead of compare_no_case, // because in turkish, 'i' is not the lowercase version of 'I', // and thus turkish locale breaks parsing of tags. diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 56a59520ae..9c9a3eab42 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -72,20 +72,6 @@ int const LYXFILE_LAYOUT_FORMAT = LAYOUT_FORMAT; namespace { -class LayoutNamesEqual : public unary_function { -public: - LayoutNamesEqual(docstring const & name) - : name_(name) - {} - bool operator()(Layout const & c) const - { - return c.name() == name_; - } -private: - docstring name_; -}; - - bool layout2layout(FileName const & filename, FileName const & tempfile, int const format = LAYOUT_FORMAT) { @@ -1438,10 +1424,7 @@ string const & TextClass::prerequisites(string const & sep) const bool TextClass::hasLayout(docstring const & n) const { docstring const name = n.empty() ? defaultLayoutName() : n; - - return find_if(layoutlist_.begin(), layoutlist_.end(), - LayoutNamesEqual(name)) - != layoutlist_.end(); + return getLayout(name) != nullptr; } @@ -1458,10 +1441,8 @@ Layout const & TextClass::operator[](docstring const & name) const { LATTEST(!name.empty()); - const_iterator it = - find_if(begin(), end(), LayoutNamesEqual(name)); - - if (it == end()) { + Layout const * c = getLayout(name); + if (!c) { LYXERR0("We failed to find the layout '" << name << "' in the layout list. You MUST investigate!"); for (const_iterator cit = begin(); cit != end(); ++cit) @@ -1472,7 +1453,7 @@ Layout const & TextClass::operator[](docstring const & name) const LASSERT(false, return dummy); } - return *it; + return *c; } @@ -1481,9 +1462,8 @@ Layout & TextClass::operator[](docstring const & name) LATTEST(!name.empty()); // Safe to continue, given what we do below. - iterator it = find_if(begin(), end(), LayoutNamesEqual(name)); - - if (it == end()) { + Layout * c = getLayout(name); + if (!c) { LYXERR0("We failed to find the layout '" << to_utf8(name) << "' in the layout list. You MUST investigate!"); for (const_iterator cit = begin(); cit != end(); ++cit) @@ -1493,10 +1473,10 @@ Layout & TextClass::operator[](docstring const & name) LATTEST(false); // we are here only in release mode layoutlist_.push_back(createBasicLayout(name, true)); - it = find_if(begin(), end(), LayoutNamesEqual(name)); + c = getLayout(name); } - return *it; + return *c; } @@ -1507,9 +1487,9 @@ bool TextClass::deleteLayout(docstring const & name) LayoutList::iterator it = remove_if(layoutlist_.begin(), layoutlist_.end(), - LayoutNamesEqual(name)); + [name](const Layout &c) { return c.name() == name; }); - LayoutList::iterator end = layoutlist_.end(); + LayoutList::iterator const end = layoutlist_.end(); bool const ret = (it != end); layoutlist_.erase(it, end); return ret; @@ -1550,6 +1530,30 @@ bool TextClass::load(string const & path) const } +Layout const * TextClass::getLayout(docstring const & name) const +{ + LayoutList::const_iterator cit = + find_if(begin(), end(), + [name](const Layout &c) { return c.name() == name; }); + if (cit == layoutlist_.end()) + return nullptr; + + return &(*cit); +} + + +Layout * TextClass::getLayout(docstring const & name) +{ + LayoutList::iterator it = + find_if(layoutlist_.begin(), layoutlist_.end(), + [name](const Layout &c) { return c.name() == name; }); + if (it == layoutlist_.end()) + return nullptr; + + return &(*it); +} + + bool DocumentClass::addLayoutIfNeeded(docstring const & n) const { if (hasLayout(n)) diff --git a/src/TextClass.h b/src/TextClass.h index 570e67f8d4..0b95f52a9f 100644 --- a/src/TextClass.h +++ b/src/TextClass.h @@ -211,7 +211,11 @@ public: bool hasOutputFormat() const { return has_output_format_; } /// Return the non-localised names for the toc types. std::map const & - outlinerNames() const { return outliner_names_; } + outlinerNames() const { return outliner_names_; } + /// \returns Layout named \p name if it exists, otherwise 0 + Layout const * getLayout(docstring const & name) const; + /// \returns Layout named \p name if it exists, otherwise 0 + Layout * getLayout(docstring const & name); protected: /// Protect construction diff --git a/src/frontends/qt4/GuiDocument.cpp b/src/frontends/qt4/GuiDocument.cpp index 68b6c6b7b9..386a2f6a18 100644 --- a/src/frontends/qt4/GuiDocument.cpp +++ b/src/frontends/qt4/GuiDocument.cpp @@ -169,7 +169,6 @@ bool forced_fontspec_activation; namespace { // used when sorting the textclass list. class less_textclass_avail_desc - : public binary_function { public: bool operator()(string const & lhs, string const & rhs) const diff --git a/src/frontends/tests/biblio.cpp b/src/frontends/tests/biblio.cpp index 067cc9b448..4cd7d45b85 100644 --- a/src/frontends/tests/biblio.cpp +++ b/src/frontends/tests/biblio.cpp @@ -40,7 +40,7 @@ typedef map InfoMap; // data entry matches the required regex_ // This class is unfortunately copied from ../frontend_helpers.cpp, so we should // try to make sure to keep the two in sync. -class RegexMatch : public unary_function +class RegexMatch { public: // re is used to construct an instance of lyx::regex. diff --git a/src/insets/InsetCommandParams.cpp b/src/insets/InsetCommandParams.cpp index 09a76a1b6e..4393534a52 100644 --- a/src/insets/InsetCommandParams.cpp +++ b/src/insets/InsetCommandParams.cpp @@ -593,7 +593,7 @@ docstring InsetCommandParams::getFirstNonOptParam() const { ParamInfo::const_iterator it = find_if(info_.begin(), info_.end(), - not1(mem_fun_ref(&ParamInfo::ParamData::isOptional))); + [](ParamInfo::ParamData const & d) { return !d.isOptional(); }); LASSERT(it != info_.end(), return docstring()); return (*this)[it->name()]; } diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp index 12ac16ab9c..34364f543d 100644 --- a/src/lyxfind.cpp +++ b/src/lyxfind.cpp @@ -72,7 +72,7 @@ bool parse_bool(docstring & howto) } -class MatchString : public binary_function +class MatchString { public: MatchString(docstring const & str, bool cs, bool mw)