Why not, I like the idea of having everything in the same header. Then I would
rename make_change() to no_change() and even maybe introduce something like
make_change_if(cond, var, value), but I am not sure about this last idea (or
another name like maybe_change or cond_change, or...).
JMarc
Since LyX uses primarily camelCase names, I renamed it to changeNone()
and make_change(ref, val) to changeRef(ref, val). Is it good enough?
Implementing make_change_if(cond, ref, val) will have no much value
since current make_change(ref, val) is used directly in conditionals
only in 2 places, all other uses are via functions (changeShape etc).
And we cannot use them as arguments since they will be evaluated before
calling make_change_if. Or we have to use macros.
Yuriy
From ce62e80469de09df4b076d5bdff0d86d8e38e563 Mon Sep 17 00:00:00 2001
From: Yuriy Skalko <yuriy.ska...@gmail.com>
Date: Thu, 12 Nov 2020 01:16:33 +0200
Subject: [PATCH] Simplify Changers
---
src/FontInfo.cpp | 9 ++--
src/MetricsInfo.cpp | 20 ++++-----
src/TextMetrics.cpp | 6 +--
src/insets/InsetCollapsible.cpp | 8 ++--
src/insets/InsetText.cpp | 6 +--
src/mathed/InsetMathChar.cpp | 4 +-
src/mathed/InsetMathDiagram.cpp | 4 +-
src/mathed/InsetMathFontOld.cpp | 4 +-
src/mathed/InsetMathFrac.cpp | 4 +-
src/mathed/InsetMathHull.cpp | 8 ++--
src/mathed/InsetMathMacro.cpp | 8 ++--
src/mathed/MathStream.cpp | 3 +-
src/mathed/MathSupport.cpp | 5 ++-
src/support/Changer.h | 62 ++++++++++++++++++++++++++--
src/support/Makefile.am | 1 -
src/support/RefChanger.h | 73 ---------------------------------
16 files changed, 101 insertions(+), 124 deletions(-)
delete mode 100644 src/support/RefChanger.h
diff --git a/src/FontInfo.cpp b/src/FontInfo.cpp
index 967771373a..95601f6579 100644
--- a/src/FontInfo.cpp
+++ b/src/FontInfo.cpp
@@ -25,7 +25,6 @@
#include "support/docstring.h"
#include "support/gettext.h"
#include "support/lstrings.h"
-#include "support/RefChanger.h"
#include <algorithm>
#include <ostream>
@@ -327,19 +326,19 @@ FontInfo & FontInfo::realize(FontInfo const & tmplt)
Changer FontInfo::changeColor(ColorCode const color)
{
- return make_change(color_, color);
+ return changeRef(color_, color);
}
Changer FontInfo::changeShape(FontShape const shape)
{
- return make_change(shape_, shape);
+ return changeRef(shape_, shape);
}
Changer FontInfo::changeStyle(MathStyle const new_style)
{
- return make_change(style_, new_style);
+ return changeRef(style_, new_style);
}
@@ -347,7 +346,7 @@ Changer FontInfo::change(FontInfo font, bool realize)
{
if (realize)
font.realize(*this);
- return make_change(*this, font);
+ return changeRef(*this, font);
}
diff --git a/src/MetricsInfo.cpp b/src/MetricsInfo.cpp
index 5aeb9a2980..44b10451d6 100644
--- a/src/MetricsInfo.cpp
+++ b/src/MetricsInfo.cpp
@@ -21,8 +21,6 @@
#include "frontends/FontMetrics.h"
#include "frontends/Painter.h"
-#include "support/RefChanger.h"
-
using namespace std;
@@ -83,16 +81,16 @@ Changer MetricsBase::changeEnsureMath(Inset::mode_type mode)
{
switch (mode) {
case Inset::UNDECIDED_MODE:
- return Changer();
+ return changeNone();
case Inset::TEXT_MODE:
- return isMathFont(fontname) ? changeFontSet("textnormal") :
Changer();
+ return isMathFont(fontname) ? changeFontSet("textnormal") :
changeNone();
case Inset::MATH_MODE:
// FIXME:
// \textit{\ensuremath{\text{a}}}
// should appear in italics
- return isTextFont(fontname) ? changeFontSet("mathnormal"):
Changer();
+ return isTextFont(fontname) ? changeFontSet("mathnormal"):
changeNone();
}
- return Changer();
+ return changeNone();
}
@@ -196,10 +194,10 @@ Changer MetricsBase::changeScript()
return font.changeStyle(SCRIPTSCRIPT_STYLE);
case INHERIT_STYLE:
case IGNORE_STYLE:
- return Changer();
+ return changeNone();
}
//remove Warning
- return Changer();
+ return changeNone();
}
@@ -215,10 +213,10 @@ Changer MetricsBase::changeFrac()
return font.changeStyle(SCRIPTSCRIPT_STYLE);
case INHERIT_STYLE:
case IGNORE_STYLE:
- return Changer();
+ return changeNone();
}
//remove Warning
- return Changer();
+ return changeNone();
}
@@ -227,7 +225,7 @@ Changer MetricsBase::changeArray(bool small)
if (small)
return font.changeStyle(SCRIPT_STYLE);
return (font.style() == DISPLAY_STYLE) ? font.changeStyle(TEXT_STYLE)
- : Changer();
+ : changeNone();
}
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index 5cd7a603a0..23da184755 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -43,7 +43,7 @@
#include "support/debug.h"
#include "support/lassert.h"
-#include "support/RefChanger.h"
+#include "support/Changer.h"
#include <stdlib.h>
#include <cmath>
@@ -1812,8 +1812,8 @@ void TextMetrics::drawParagraph(PainterInfo & pi,
pit_type const pit, int const
return;
size_t const nrows = pm.rows().size();
// Remember left and right margin for drawing math numbers
- Changer changeleft = make_change(pi.leftx, x + leftMargin(pit));
- Changer changeright = make_change(pi.rightx, x + width() -
rightMargin(pit));
+ Changer changeleft = changeRef(pi.leftx, x + leftMargin(pit));
+ Changer changeright = changeRef(pi.rightx, x + width() -
rightMargin(pit));
// Use fast lane in nodraw stage.
if (pi.pain.isNull()) {
diff --git a/src/insets/InsetCollapsible.cpp b/src/insets/InsetCollapsible.cpp
index c118545002..f596a2d716 100644
--- a/src/insets/InsetCollapsible.cpp
+++ b/src/insets/InsetCollapsible.cpp
@@ -39,7 +39,7 @@
#include "support/gettext.h"
#include "support/lassert.h"
#include "support/lstrings.h"
-#include "support/RefChanger.h"
+#include "support/Changer.h"
#include "support/TempFile.h"
using namespace std;
@@ -314,8 +314,8 @@ void InsetCollapsible::draw(PainterInfo & pi, int x, int y)
const
// Do not draw the cue for INSERTED -- it is already in the
button and
// that's enough.
Changer cdummy = (pi.change.type == Change::INSERTED)
- ? make_change(pi.change, Change())
- : Changer();
+ ? changeRef(pi.change, Change())
+ : changeNone();
InsetText::draw(pi, textx, texty);
break;
}
@@ -333,7 +333,7 @@ void InsetCollapsible::draw(PainterInfo & pi, int x, int y)
const
// We will take care of the frame and the change tracking cue
// ourselves, below.
{
- Changer cdummy = make_change(pi.change, Change());
+ Changer cdummy = changeRef(pi.change, Change());
const_cast<InsetCollapsible
*>(this)->setDrawFrame(false);
InsetText::draw(pi, textx, texty);
const_cast<InsetCollapsible
*>(this)->setDrawFrame(true);
diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp
index 3f97d4f728..4b38a7e4bc 100644
--- a/src/insets/InsetText.cpp
+++ b/src/insets/InsetText.cpp
@@ -61,7 +61,7 @@
#include "support/gettext.h"
#include "support/lassert.h"
#include "support/lstrings.h"
-#include "support/RefChanger.h"
+#include "support/Changer.h"
#include <algorithm>
#include <stack>
@@ -229,10 +229,10 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
pi.backgroundColor(this));
{
- Changer dummy = make_change(pi.background_color,
+ Changer dummy = changeRef(pi.background_color,
pi.backgroundColor(this, false));
// The change tracking cue must not be inherited
- Changer dummy2 = make_change(pi.change, Change());
+ Changer dummy2 = changeRef(pi.change, Change());
tm.draw(pi, x + leftOffset(pi.base.bv), y);
}
diff --git a/src/mathed/InsetMathChar.cpp b/src/mathed/InsetMathChar.cpp
index aa1ddf8c5b..4f8feed5e7 100644
--- a/src/mathed/InsetMathChar.cpp
+++ b/src/mathed/InsetMathChar.cpp
@@ -121,7 +121,7 @@ void InsetMathChar::metrics(MetricsInfo & mi, Dimension &
dim) const
} else if (!isASCII(char_) &&
Encodings::unicodeCharInfo(char_).isUnicodeSymbol()) {
Changer dummy1 = mi.base.changeFontSet("mathnormal");
Changer dummy2 = Encodings::isMathAlpha(char_)
- ? Changer()
+ ? changeNone()
: mi.base.font.changeShape(UP_SHAPE);
dim = theFontMetrics(mi.base.font).dimension(char_);
kerning_ = -mathed_char_kerning(mi.base.font, char_);
@@ -166,7 +166,7 @@ void InsetMathChar::draw(PainterInfo & pi, int x, int y)
const
} else if (!isASCII(char_) &&
Encodings::unicodeCharInfo(char_).isUnicodeSymbol()) {
Changer dummy1 = pi.base.changeFontSet("mathnormal");
Changer dummy2 = Encodings::isMathAlpha(char_)
- ? Changer()
+ ? changeNone()
: pi.base.font.changeShape(UP_SHAPE);
pi.draw(x, y, char_);
return;
diff --git a/src/mathed/InsetMathDiagram.cpp b/src/mathed/InsetMathDiagram.cpp
index 4a7ea3c3b8..168b5a35a3 100644
--- a/src/mathed/InsetMathDiagram.cpp
+++ b/src/mathed/InsetMathDiagram.cpp
@@ -51,7 +51,7 @@ void InsetMathDiagram::metrics(MetricsInfo & mi, Dimension &
dim) const
Changer dummy2 = mi.base.changeEnsureMath();
FontInfo & f = mi.base.font;
Changer dummy = (f.style() == DISPLAY_STYLE) ? f.changeStyle(TEXT_STYLE)
- : Changer();
+ : changeNone();
InsetMathGrid::metrics(mi, dim);
}
@@ -61,7 +61,7 @@ void InsetMathDiagram::draw(PainterInfo & pi, int x, int y)
const
Changer dummy2 = pi.base.changeEnsureMath();
FontInfo & f = pi.base.font;
Changer dummy = (f.style() == DISPLAY_STYLE) ? f.changeStyle(TEXT_STYLE)
- : Changer();
+ : changeNone();
InsetMathGrid::draw(pi, x, y);
}
diff --git a/src/mathed/InsetMathFontOld.cpp b/src/mathed/InsetMathFontOld.cpp
index cde388840c..0cd5cc4c72 100644
--- a/src/mathed/InsetMathFontOld.cpp
+++ b/src/mathed/InsetMathFontOld.cpp
@@ -60,7 +60,7 @@ void InsetMathFontOld::metrics(MetricsInfo & mi, Dimension &
dim) const
bool really_change_font = fontname != "textcal";
Changer dummy = really_change_font ? mi.base.changeFontSet(fontname)
- : Changer();
+ : changeNone();
cell(0).metrics(mi, dim);
}
@@ -77,7 +77,7 @@ void InsetMathFontOld::draw(PainterInfo & pi, int x, int y)
const
bool really_change_font = fontname != "textcal";
Changer dummy = really_change_font ? pi.base.changeFontSet(fontname)
- : Changer();
+ : changeNone();
cell(0).draw(pi, x, y);
}
diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp
index 03125e99ca..bec11046af 100644
--- a/src/mathed/InsetMathFrac.cpp
+++ b/src/mathed/InsetMathFrac.cpp
@@ -215,7 +215,7 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension &
dim) const
dim.des = dim2.des;
}
Changer dummy = (kind_ == UNITFRAC) ?
mi.base.font.changeShape(UP_SHAPE)
- : Changer();
+ : changeNone();
Changer dummy2 = mi.base.changeScript();
if (latexkeys const * slash = slash_symbol()) {
Dimension dimslash;
@@ -297,7 +297,7 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y)
const
xx += cell(2).dimension(*pi.base.bv).wid + 4;
}
Changer dummy = (kind_ == UNITFRAC) ?
pi.base.font.changeShape(UP_SHAPE)
- : Changer();
+ : changeNone();
// nice fraction
Changer dummy2 = pi.base.changeScript();
cell(0).draw(pi, xx + 1, y - dy);
diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp
index a026977021..802f0a9e2c 100644
--- a/src/mathed/InsetMathHull.cpp
+++ b/src/mathed/InsetMathHull.cpp
@@ -65,7 +65,7 @@
#include "support/filetools.h"
#include "support/lassert.h"
#include "support/lstrings.h"
-#include "support/RefChanger.h"
+#include "support/Changer.h"
#include <sstream>
@@ -616,8 +616,8 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y)
const
if (previewState(bv)) {
// Do not draw change tracking cue if taken care of by
RowPainter
// already.
- Changer dummy = !canPaintChange(*bv) ? make_change(pi.change,
Change())
- : Changer();
+ Changer dummy = !canPaintChange(*bv) ? changeRef(pi.change,
Change())
+ : changeNone();
if (previewTooSmall(dim)) {
// we have an extra frame
preview_->draw(pi, x + ERROR_FRAME_WIDTH, y);
@@ -635,7 +635,7 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y)
const
? Color_selectiontext : standardColor();
bool const really_change_color = pi.base.font.color() == Color_none;
Changer dummy0 = really_change_color ? pi.base.font.changeColor(color)
- : Changer();
+ : changeNone();
if (numberedType()) {
BufferParams::MathNumber const math_number =
buffer().params().getMathNumber();
for (row_type row = 0; row < nrows(); ++row) {
diff --git a/src/mathed/InsetMathMacro.cpp b/src/mathed/InsetMathMacro.cpp
index 57294c0753..b718c322c7 100644
--- a/src/mathed/InsetMathMacro.cpp
+++ b/src/mathed/InsetMathMacro.cpp
@@ -39,7 +39,7 @@
#include "support/gettext.h"
#include "support/lassert.h"
#include "support/lstrings.h"
-#include "support/RefChanger.h"
+#include "support/Changer.h"
#include "support/textutils.h"
#include <ostream>
@@ -91,7 +91,7 @@ public:
// macro arguments are in macros
LATTEST(mathMacro_->nesting() > 0);
/// The macro nesting can change display of insets. Change it
locally.
- Changer chg = make_change(mi.base.macro_nesting,
+ Changer chg = changeRef(mi.base.macro_nesting,
mathMacro_->nesting() == 1 ? 0 :
mathMacro_->nesting());
MathRow::Element e_beg(mi, MathRow::BEGIN);
@@ -344,7 +344,7 @@ bool InsetMathMacro::addToMathRow(MathRow & mrow,
MetricsInfo & mi) const
return InsetMath::addToMathRow(mrow, mi);
/// The macro nesting can change display of insets. Change it locally.
- Changer chg = make_change(mi.base.macro_nesting, d->nesting_);
+ Changer chg = changeRef(mi.base.macro_nesting, d->nesting_);
MathRow::Element e_beg(mi, MathRow::BEGIN);
e_beg.inset = this;
@@ -569,7 +569,7 @@ InsetMath::marker_type InsetMathMacro::marker(BufferView
const * bv) const
void InsetMathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
{
/// The macro nesting can change display of insets. Change it locally.
- Changer chg = make_change(mi.base.macro_nesting, d->nesting_);
+ Changer chg = changeRef(mi.base.macro_nesting, d->nesting_);
// set edit mode for which we will have calculated metrics. But only
d->editing_[mi.base.bv] = editMode(mi.base.bv);
diff --git a/src/mathed/MathStream.cpp b/src/mathed/MathStream.cpp
index 3d759bc261..a8fb876585 100644
--- a/src/mathed/MathStream.cpp
+++ b/src/mathed/MathStream.cpp
@@ -19,7 +19,6 @@
#include "TexRow.h"
#include "support/docstring.h"
-#include "support/RefChanger.h"
#include "support/textutils.h"
#include <algorithm>
@@ -182,7 +181,7 @@ void WriteStream::asciiOnly(bool ascii)
Changer WriteStream::changeRowEntry(TexRow::RowEntry entry)
{
- return make_change(row_entry_, entry);
+ return changeRef(row_entry_, entry);
}
diff --git a/src/mathed/MathSupport.cpp b/src/mathed/MathSupport.cpp
index 4f276856e5..e5e008429e 100644
--- a/src/mathed/MathSupport.cpp
+++ b/src/mathed/MathSupport.cpp
@@ -27,6 +27,7 @@
#include "frontends/FontMetrics.h"
#include "frontends/Painter.h"
+#include "support/Changer.h"
#include "support/debug.h"
#include "support/docstream.h"
#include "support/lassert.h"
@@ -696,7 +697,7 @@ int mathedSymbolDim(MetricsBase & mb, Dimension & dim,
latexkeys const * sym)
mb.fontname != "mathfrak" &&
mb.fontname != "mathcal" &&
mb.fontname != "mathscr");
- Changer dummy = change_font ? mb.changeFontSet(font) : Changer();
+ Changer dummy = change_font ? mb.changeFontSet(font) : changeNone();
mathed_string_dim(mb.font, mathedSymbol(mb, sym), dim);
return mathed_char_kerning(mb.font, mathedSymbol(mb, sym).back());
}
@@ -720,7 +721,7 @@ void mathedSymbolDraw(PainterInfo & pi, int x, int y,
latexkeys const * sym)
pi.base.fontname != "mathfrak" &&
pi.base.fontname != "mathcal" &&
pi.base.fontname != "mathscr");
- Changer dummy = change_font ? pi.base.changeFontSet(font) : Changer();
+ Changer dummy = change_font ? pi.base.changeFontSet(font) :
changeNone();
pi.draw(x, y, mathedSymbol(pi.base, sym));
}
diff --git a/src/support/Changer.h b/src/support/Changer.h
index 212bcf1d85..a54975a503 100644
--- a/src/support/Changer.h
+++ b/src/support/Changer.h
@@ -17,16 +17,70 @@
namespace lyx {
-// Forward declaration for support/RefChanger.h
struct Revertible {
- virtual ~Revertible() {}
- virtual void revert() {}
- virtual void keep() {}
+ virtual ~Revertible() = default;
};
using Changer = unique_ptr<Revertible>;
+/// A RefChanger records the current value of \param ref, allowing to
+/// temporarily assign new values to it. The original value is restored
+/// automatically when the object is destroyed, unless it is disabled.
+///
+/// RefChanger is movable, and doing so prolongs the duration of the temporary
+/// assignment. This allows classes to supply their own changer methods.
+///
+/// Naturally, be careful not to extend the life of a RefChanger beyond that of
+/// the reference it modifies. The RefChanger can be disabled by calling
+/// ->keep() or ->revert(). Once disabled, the reference is never accessed
+/// again.
+template<typename X>
+class RevertibleRef : public Revertible {
+public:
+ RevertibleRef(X & ref) : ref(ref), old(ref), enabled(true) {}
+ //
+ ~RevertibleRef() override { revert(); }
+ //
+ void revert() { if (enabled) { enabled = false; ref = old; } }
+ //
+ void keep() { enabled = false; }
+ //
+ X & ref;
+ X const old;
+private:
+ bool enabled;
+};
+
+
+template <typename X>
+using RefChanger = unique_ptr<RevertibleRef<X>>;
+
+
+/// Saves the value of \param ref in a movable object
+template <typename X>
+inline RefChanger<X> make_save(X & ref)
+{
+ return make_unique<RevertibleRef<X>>(ref);
+}
+
+inline Changer changeNone()
+{
+ return Changer();
+}
+
+/// Temporarily assign value val to reference ref.
+/// To apply the change conditionally, one can write:
+/// Changer dummy = (cond) ? changeRef(ref, val) : changeNone();
+template <typename X>
+inline Changer changeRef(X & ref, X const val)
+{
+ auto rc = make_save(ref);
+ ref = val;
+ return rc;
+}
+
} // namespace lyx
+
#endif //LYX_CHANGER_H
diff --git a/src/support/Makefile.am b/src/support/Makefile.am
index 785b97f395..addeab86b8 100644
--- a/src/support/Makefile.am
+++ b/src/support/Makefile.am
@@ -98,7 +98,6 @@ liblyxsupport_a_SOURCES = \
qstring_helpers.cpp \
qstring_helpers.h \
regex.h \
- RefChanger.h \
signals.h \
socktools.cpp \
socktools.h \
diff --git a/src/support/RefChanger.h b/src/support/RefChanger.h
deleted file mode 100644
index ae35cc3891..0000000000
--- a/src/support/RefChanger.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// -*- C++ -*-
-/**
- * \file RefChanger.h
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Guillaume Munch
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#ifndef LYX_REFCHANGER_H
-#define LYX_REFCHANGER_H
-
-#include "support/Changer.h"
-
-
-namespace lyx {
-
-/// A RefChanger records the current value of \param ref, allowing to
-/// temporarily assign new values to it. The original value is restored
-/// automatically when the object is destroyed, unless it is disabled.
-///
-/// RefChanger is movable, and doing so prolongs the duration of the temporary
-/// assignment. This allows classes to supply their own changer methods.
-///
-/// Naturally, be careful not to extend the life of a RefChanger beyond that of
-/// the reference it modifies. The RefChanger can be disabled by calling
-/// ->keep() or ->revert(). Once disabled, the reference is never accessed
-/// again.
-template<typename X>
-class RevertibleRef : public Revertible {
-public:
- RevertibleRef(X & ref) : ref(ref), old(ref), enabled(true) {}
- //
- ~RevertibleRef() { revert(); }
- //
- void revert() override { if (enabled) { enabled = false; ref = old; } }
- //
- void keep() override { enabled = false; }
- //
- X & ref;
- X const old;
-private:
- bool enabled;
-};
-
-
-template <typename X> using RefChanger = unique_ptr<RevertibleRef<X>>;
-
-
-/// Saves the value of \param ref in a movable object
-template <typename X> RefChanger<X> make_save(X & ref)
-{
- return make_unique<RevertibleRef<X>>(ref);
-}
-
-/// Temporarily assign value val to reference ref.
-/// To apply the change conditionnally, one can write:
-/// Changer dummy = (cond) ? make_change(a, b) : Changer();
-template <typename X>
-RefChanger<X> make_change(X & ref, X const val)
-{
- auto rc = make_save(ref);
- ref = val;
- return rc;
-}
-
-
-} // namespace lyx
-
-
-#endif //LYX_REFCHANGER_H
--
2.28.0.windows.1
--
lyx-devel mailing list
lyx-devel@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-devel