]> git.lyx.org Git - features.git/commitdiff
Make TextMetrics noncopyable
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Tue, 12 Mar 2019 11:40:32 +0000 (12:40 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 18 Jun 2020 13:48:16 +0000 (15:48 +0200)
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
src/TextMetrics.h

index 50df1aade24dd36edb09bbe71c10d6d288b418df..900207c23871e6e684e3896ef6ac68e7471e627b 100644 (file)
@@ -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;
 }
index 26156fa100b48ae8fa439bacbe08f4d0c831dcf5..006836fb0a186b0f88795de6a1095a942aaaaf20 100644 (file)
@@ -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) {}