commit 63bfaa14beef2521759571ca077834a412d12bbc
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Tue Mar 12 12:40:32 2019 +0100

    Make TextMetrics noncopyable
    
    This is done by declaring unimplemented private copy constructor and
    assignment operator.
    
    This breaks compilation in BufferView::textMetrics, which does a copy when
    inserting a TextMetrics object in the cache. Some C++11 wizardry I will not
    pretend to completely understand saves the day.
    
    See the following page for details:
      https://en.cppreference.com/w/cpp/container/map/emplace
    
    This avoids real world bugs like #11512.
---
 src/BufferView.cpp |    5 +++--
 src/TextMetrics.h  |    3 +++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 50df1aa..900207c 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -2542,8 +2542,9 @@ TextMetrics & BufferView::textMetrics(Text const * t)
        LBUFERR(t);
        TextMetricsCache::iterator tmc_it  = d->text_metrics_.find(t);
        if (tmc_it == d->text_metrics_.end()) {
-               tmc_it = d->text_metrics_.insert(
-                       make_pair(t, TextMetrics(this, const_cast<Text 
*>(t)))).first;
+               tmc_it = d->text_metrics_.emplace(std::piecewise_construct,
+                               std::forward_as_tuple(t),
+                               std::forward_as_tuple(this, const_cast<Text 
*>(t))).first;
        }
        return tmc_it->second;
 }
diff --git a/src/TextMetrics.h b/src/TextMetrics.h
index 26156fa..006836f 100644
--- a/src/TextMetrics.h
+++ b/src/TextMetrics.h
@@ -33,6 +33,9 @@ class Text;
 /// A map from a Text to the map of paragraphs metrics
 class TextMetrics
 {
+       /// noncopyable
+       TextMetrics(TextMetrics const &);
+       void operator=(TextMetrics const &);
 public:
        /// Default constructor (only here for STL containers).
        TextMetrics() : bv_(0), text_(0), max_width_(0) {}

Reply via email to