mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 05:16:21 +00:00
Fix a number of issues that were stopping compilation with MSVC 19.
Patch from Thibaut Cuvelier, modified slightly by me (mostly for style).
This commit is contained in:
parent
91265c1f46
commit
c506f304bc
@ -636,6 +636,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",
|
||||
|
@ -1176,13 +1176,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<docstring, docstring, bool>
|
||||
{
|
||||
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
|
||||
|
||||
@ -1229,7 +1225,7 @@ vector<docstring> const BiblioInfo::getKeys() const
|
||||
vector<docstring> bibkeys;
|
||||
for (auto const & bi : *this)
|
||||
bibkeys.push_back(bi.first);
|
||||
sort(bibkeys.begin(), bibkeys.end(), compareNoCase());
|
||||
sort(bibkeys.begin(), bibkeys.end(), &compareNoCase);
|
||||
return bibkeys;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -178,6 +178,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.
|
||||
@ -596,15 +609,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));
|
||||
}
|
||||
|
||||
|
||||
@ -627,22 +638,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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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.
|
||||
|
@ -132,25 +132,21 @@ private:
|
||||
};
|
||||
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class CompareTags
|
||||
: public binary_function<LexerKeyword, LexerKeyword, bool> {
|
||||
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.
|
||||
|
@ -72,20 +72,6 @@ int const LYXFILE_LAYOUT_FORMAT = LAYOUT_FORMAT;
|
||||
|
||||
namespace {
|
||||
|
||||
class LayoutNamesEqual : public unary_function<Layout, bool> {
|
||||
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)
|
||||
{
|
||||
@ -1615,10 +1601,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;
|
||||
}
|
||||
|
||||
|
||||
@ -1635,10 +1618,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 (auto const & lay : *this)
|
||||
@ -1649,7 +1630,7 @@ Layout const & TextClass::operator[](docstring const & name) const
|
||||
LASSERT(false, return dummy);
|
||||
}
|
||||
|
||||
return *it;
|
||||
return *c;
|
||||
}
|
||||
|
||||
|
||||
@ -1658,9 +1639,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 (auto const & lay : *this)
|
||||
@ -1670,10 +1650,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;
|
||||
}
|
||||
|
||||
|
||||
@ -1684,9 +1664,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;
|
||||
@ -1727,6 +1707,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))
|
||||
|
@ -211,7 +211,11 @@ public:
|
||||
bool hasOutputFormat() const { return has_output_format_; }
|
||||
/// Return the non-localised names for the toc types.
|
||||
std::map<std::string, docstring> 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
|
||||
|
@ -177,7 +177,6 @@ namespace lyx {
|
||||
namespace {
|
||||
// used when sorting the textclass list.
|
||||
class less_textclass_avail_desc
|
||||
: public binary_function<string, string, int>
|
||||
{
|
||||
public:
|
||||
bool operator()(string const & lhs, string const & rhs) const
|
||||
|
@ -40,7 +40,7 @@ typedef map<string, string> 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<string, bool>
|
||||
class RegexMatch
|
||||
{
|
||||
public:
|
||||
// re is used to construct an instance of lyx::regex.
|
||||
|
@ -600,7 +600,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()];
|
||||
}
|
||||
|
@ -178,7 +178,7 @@ bool parse_bool(docstring & howto)
|
||||
}
|
||||
|
||||
|
||||
class MatchString : public binary_function<Paragraph, pos_type, int>
|
||||
class MatchString
|
||||
{
|
||||
public:
|
||||
MatchString(docstring const & s, bool cs, bool mw)
|
||||
|
Loading…
Reference in New Issue
Block a user