lmi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lmi-commits] [lmi] master fd2c4e6: Replace lmi::uncopyable with "=delet


From: Greg Chicares
Subject: [lmi-commits] [lmi] master fd2c4e6: Replace lmi::uncopyable with "=delete" special member functions
Date: Sat, 4 Mar 2017 11:33:21 -0500 (EST)

branch: master
commit fd2c4e65d8172637b37a4dc8fb7edcf01a0b1b58
Author: Gregory W. Chicares <address@hidden>
Commit: Gregory W. Chicares <address@hidden>

    Replace lmi::uncopyable with "=delete" special member functions
---
 Makefile.am                  |   1 -
 about_dialog.hpp             |   8 +--
 account_value.hpp            |   5 +-
 actuarial_table.hpp          |   6 +--
 any_member.hpp               |  11 ++--
 authenticity.hpp             |   4 +-
 basic_values.hpp             |   5 +-
 cache_file_reads.hpp         |   6 ++-
 callback.hpp                 |   7 ++-
 census_document.hpp          |   7 +--
 census_view.hpp              |   7 +--
 commutation_functions.hpp    |   9 ++--
 configurable_settings.hpp    |   8 +--
 database.hpp                 |   5 +-
 database_view.hpp            |   8 +--
 dbdict.hpp                   |  11 ++--
 death_benefits.hpp           |   5 +-
 docmanager_ex.hpp            |   8 +--
 emit_ledger.hpp              |   5 +-
 fenv_guard.hpp               |   5 +-
 file_command.hpp             |   2 -
 fund_data.hpp                |   6 +--
 global_settings.hpp          |   4 +-
 gpt_document.hpp             |   7 +--
 gpt_view.hpp                 |   7 +--
 gpt_xml_document.hpp         |   5 +-
 group_quote_pdf_gen.hpp      |   6 ++-
 group_quote_pdf_gen_wx.cpp   |   4 +-
 icon_monger.hpp              |   8 +--
 ihs_irc7702.hpp              |   5 +-
 illustration_document.hpp    |   7 +--
 illustration_view.hpp        |   7 +--
 input_sequence.hpp           |   5 +-
 input_sequence_parser.hpp    |   5 +-
 ledger_text_formats.cpp      |   9 ++--
 ledgervalues.hpp             |   5 +-
 loads_impl.hpp               |   2 -
 main_wx_test.cpp             |   4 +-
 mec_document.hpp             |   7 +--
 mec_view.hpp                 |   7 +--
 mec_xml_document.hpp         |   5 +-
 msw_workarounds.hpp          |   5 +-
 multidimgrid_any.cpp         |   4 +-
 multidimgrid_any.hpp         |  15 ++++--
 multidimgrid_tools.hpp       |   7 +--
 multiple_cell_document.hpp   |   5 +-
 mvc_controller.hpp           |   8 +--
 name_value_pairs.hpp         |   6 +--
 null_stream.cpp              |   7 +--
 outlay.hpp                   |   5 +-
 policy_view.hpp              |   8 +--
 premium_tax.hpp              |   5 +-
 product_data.hpp             |   8 +--
 product_editor.hpp           |  21 +++++---
 progress_meter.hpp           |   5 +-
 rate_table.cpp               |  10 +++-
 rate_table.hpp               |  10 ++--
 rate_table_test.cpp          |   5 +-
 rounding_rules.cpp           |   2 +-
 rounding_rules.hpp           |   8 +--
 rounding_view.hpp            |   8 +--
 single_cell_document.hpp     |   5 +-
 skeleton.hpp                 |   8 +--
 test_coding_rules.cpp        |   5 +-
 text_view.hpp                |   8 +--
 tier_view.hpp                |   8 +--
 timer.hpp                    |   5 +-
 transferor.hpp               |   8 +--
 uncopyable_lmi.hpp           | 124 -------------------------------------------
 view_ex.hpp                  |   8 +--
 wx_test_benchmark_census.cpp |  17 +++---
 wx_test_case.hpp             |   7 +--
 wx_test_document.hpp         |   5 +-
 wx_test_output.hpp           |  16 +++---
 wx_test_validate_output.cpp  |   1 -
 xml_lmi.hpp                  |   9 ++--
 76 files changed, 287 insertions(+), 347 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index a586dd2..d818266 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1264,7 +1264,6 @@ noinst_HEADERS = \
     tn_range_type_trammels.hpp \
     tn_range_types.hpp \
     transferor.hpp \
-    uncopyable_lmi.hpp \
     value_cast.hpp \
     version.hpp \
     view_ex.hpp \
diff --git a/about_dialog.hpp b/about_dialog.hpp
index c16e5e6..74ee433 100644
--- a/about_dialog.hpp
+++ b/about_dialog.hpp
@@ -24,8 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/dialog.h>
 
 /// Implementation notes: class AboutDialog.
@@ -51,8 +49,7 @@
 /// for consistency, so does the first.
 
 class AboutDialog
-    :public  wxDialog
-    ,private lmi::uncopyable<AboutDialog>
+    :public wxDialog
 {
   public:
     AboutDialog(wxWindow* parent);
@@ -62,6 +59,9 @@ class AboutDialog
     int ShowModal() override;
 
   private:
+    AboutDialog(AboutDialog const&) = delete;
+    AboutDialog& operator=(AboutDialog const&) = delete;
+
     void UponReadLicense(wxCommandEvent&);
 
     DECLARE_EVENT_TABLE()
diff --git a/account_value.hpp b/account_value.hpp
index a9bd5ad..ba85836 100644
--- a/account_value.hpp
+++ b/account_value.hpp
@@ -27,7 +27,6 @@
 #include "basic_values.hpp"
 #include "oecumenic_enumerations.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <fstream>
 #include <iosfwd>
@@ -48,7 +47,6 @@ class LedgerVariant;
 
 class LMI_SO AccountValue
     :protected BasicValues
-    ,private   lmi::uncopyable<AccountValue>
 {
     friend class SolveHelper;
     friend class run_census_in_parallel;
@@ -93,6 +91,9 @@ class LMI_SO AccountValue
     std::shared_ptr<Ledger const> ledger_from_av() const;
 
   private:
+    AccountValue(AccountValue const&) = delete;
+    AccountValue& operator=(AccountValue const&) = delete;
+
     LedgerInvariant const& InvariantValues() const;
     LedgerVariant   const& VariantValues  () const;
 
diff --git a/actuarial_table.hpp b/actuarial_table.hpp
index fd288b6..d5c62ad 100644
--- a/actuarial_table.hpp
+++ b/actuarial_table.hpp
@@ -24,8 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <iosfwd>
 #include <string>
 #include <vector>
@@ -128,7 +126,6 @@ enum e_actuarial_table_method
 /// compatibility.
 
 class actuarial_table final
-    :private lmi::uncopyable <actuarial_table>
 {
   public:
     actuarial_table(std::string const& filename, int table_number);
@@ -152,6 +149,9 @@ class actuarial_table final
     int                max_select_age () const {return max_select_age_ ;}
 
   private:
+    actuarial_table(actuarial_table const&) = delete;
+    actuarial_table& operator=(actuarial_table const&) = delete;
+
     void find_table();
     void parse_table();
     void read_values(std::istream& is, int nominal_length);
diff --git a/any_member.hpp b/any_member.hpp
index c02d047..7035764 100644
--- a/any_member.hpp
+++ b/any_member.hpp
@@ -64,7 +64,6 @@
 
 #include "assert_lmi.hpp"
 #include "rtti_lmi.hpp"
-#include "uncopyable_lmi.hpp"
 #include "value_cast.hpp"
 
 #include <algorithm>                    // std::lower_bound(), std::swap()
@@ -109,8 +108,7 @@ inline placeholder::~placeholder() = default;
 
 template<typename ClassType, typename ValueType>
 class holder
-    :public  placeholder
-    ,private lmi::uncopyable<holder<ClassType,ValueType>>
+    :public placeholder
 {
     // Friendship is extended to class any_member only to support its
     // cast operations.
@@ -132,6 +130,9 @@ class holder
 #endif // defined LMI_MSC
 
   private:
+    holder(holder const&) = delete;
+    holder& operator=(holder const&) = delete;
+
     ClassType* object_;
     ValueType held_;
 };
@@ -523,7 +524,6 @@ MemberType const* member_cast(any_member<ClassType> const& 
member)
 
 template<typename ClassType>
 class MemberSymbolTable
-    :private lmi::uncopyable<MemberSymbolTable<ClassType>>
 {
     typedef std::map<std::string, any_member<ClassType>> member_map_type;
     typedef typename member_map_type::value_type member_pair_type;
@@ -545,6 +545,9 @@ class MemberSymbolTable
     void ascribe(std::string const&, ValueType SameOrBaseClassType::*);
 
   private:
+    MemberSymbolTable(MemberSymbolTable const&) = delete;
+    MemberSymbolTable& operator=(MemberSymbolTable const&) = delete;
+
     void complain_that_no_such_member_is_ascribed(std::string const&) const;
 
     member_map_type map_;
diff --git a/authenticity.hpp b/authenticity.hpp
index 5c1231f..447b8f6 100644
--- a/authenticity.hpp
+++ b/authenticity.hpp
@@ -26,7 +26,6 @@
 
 #include "calendar_date.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <boost/filesystem/path.hpp>
 
@@ -48,7 +47,6 @@ enum {md5len = 128 / CHAR_BIT};
 /// peremptorily-invalid default value of JDN zero.
 
 class Authenticity final
-    :private lmi::uncopyable <Authenticity>
 {
     friend class PasskeyTest;
 
@@ -62,6 +60,8 @@ class Authenticity final
   private:
     Authenticity();
     ~Authenticity();
+    Authenticity(Authenticity const&) = delete;
+    Authenticity& operator=(Authenticity const&) = delete;
 
     static void ResetCache();
 
diff --git a/basic_values.hpp b/basic_values.hpp
index eb37fe9..c43b6a0 100644
--- a/basic_values.hpp
+++ b/basic_values.hpp
@@ -30,7 +30,6 @@
 #include "oecumenic_enumerations.hpp"
 #include "round_to.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "yare_input.hpp"
 
 #include <memory>                       // std::shared_ptr
@@ -79,7 +78,6 @@ enum EBlend
     };
 
 class LMI_SO BasicValues
-    :private lmi::uncopyable<BasicValues>
 {
   public:
     BasicValues(Input const& input);
@@ -382,6 +380,9 @@ class LMI_SO BasicValues
     std::vector<double>     TieredMECharges;
 
   private:
+    BasicValues(BasicValues const&) = delete;
+    BasicValues& operator=(BasicValues const&) = delete;
+
     double GetModalPrem
         (int                   a_year
         ,mcenum_mode           a_mode
diff --git a/cache_file_reads.hpp b/cache_file_reads.hpp
index 1f2b556..eeb7e43 100644
--- a/cache_file_reads.hpp
+++ b/cache_file_reads.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "assert_lmi.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <boost/filesystem/operations.hpp>
 
@@ -58,7 +57,6 @@ namespace detail
 
 template<typename T>
 class file_cache
-    :private lmi::uncopyable<file_cache<T>>
 {
   public:
     using retrieved_type = std::shared_ptr<T>;
@@ -97,6 +95,10 @@ class file_cache
         }
 
   private:
+    file_cache() = default;
+    file_cache(file_cache const&) = delete;
+    file_cache& operator=(file_cache const&) = delete;
+
     struct record
     {
         retrieved_type data;
diff --git a/callback.hpp b/callback.hpp
index 03ceb86..6d7d328 100644
--- a/callback.hpp
+++ b/callback.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <stdexcept>
 #include <type_traits>
@@ -96,17 +95,21 @@
 
 template<typename FunctionPointer>
 class LMI_SO callback final
-    :private lmi::uncopyable <callback<FunctionPointer>>
 {
     static_assert(std::is_pointer<FunctionPointer>::value, "");
     typedef typename std::remove_pointer<FunctionPointer>::type f_type;
     static_assert(std::is_function<f_type>::value, "");
 
   public:
+    callback() = default;
+
     FunctionPointer operator()() const;
     void initialize(FunctionPointer concrete_pointer);
 
   private:
+    callback(callback const&) = delete;
+    callback& operator=(callback const&) = delete;
+
     static FunctionPointer function_pointer_;
 };
 
diff --git a/census_document.hpp b/census_document.hpp
index fae41db..d438619 100644
--- a/census_document.hpp
+++ b/census_document.hpp
@@ -26,15 +26,13 @@
 
 #include "input.hpp"
 #include "multiple_cell_document.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/docview.h>
 
 class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl;
 
 class CensusDocument
-    :public  wxDocument
-    ,private lmi::uncopyable<CensusDocument>
+    :public wxDocument
 {
     friend class CensusView;
 
@@ -43,6 +41,9 @@ class CensusDocument
     ~CensusDocument() override;
 
   private:
+    CensusDocument(CensusDocument const&) = delete;
+    CensusDocument& operator=(CensusDocument const&) = delete;
+
     wxDataViewCtrl& PredominantViewWindow() const;
 
     // wxDocument overrides.
diff --git a/census_view.hpp b/census_view.hpp
index 0e22a93..ef632f8 100644
--- a/census_view.hpp
+++ b/census_view.hpp
@@ -30,7 +30,6 @@
 #include "ledger.hpp"
 #include "mc_enum_type_enums.hpp"       // enum mcenum_emission
 #include "oecumenic_enumerations.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/object.h>                  // wxObjectDataPtr
 
@@ -45,8 +44,7 @@ class WXDLLIMPEXP_FWD_ADV wxDataViewEvent;
 class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl;
 
 class CensusView final
-    :public  ViewEx
-    ,private lmi::uncopyable <CensusView>
+    :public ViewEx
 {
     friend class CensusDocument;
     friend class CensusViewDataViewModel;
@@ -55,6 +53,9 @@ class CensusView final
     CensusView();
 
   private:
+    CensusView(CensusView const&) = delete;
+    CensusView& operator=(CensusView const&) = delete;
+
     void update_visible_columns();
 
     CensusDocument& document() const;
diff --git a/commutation_functions.hpp b/commutation_functions.hpp
index 9f9c82a..2590291 100644
--- a/commutation_functions.hpp
+++ b/commutation_functions.hpp
@@ -26,14 +26,12 @@
 
 #include "mc_enum_type_enums.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <vector>
 
 /// Ordinary-life commutation functions.
 
 class LMI_SO OLCommFns final
-    :private lmi::uncopyable <OLCommFns>
 {
   public:
     OLCommFns
@@ -51,6 +49,9 @@ class LMI_SO OLCommFns final
     std::vector<double> const&  M() const {return  m;}
 
   private:
+    OLCommFns(OLCommFns const&) = delete;
+    OLCommFns& operator=(OLCommFns const&) = delete;
+
     int Length;
 
     std::vector<double> const& q;
@@ -79,7 +80,6 @@ class LMI_SO OLCommFns final
 /// for "modal", but would too easily be taken as connoting "monthly".
 
 class LMI_SO ULCommFns final
-    :private lmi::uncopyable <ULCommFns>
 {
   public:
     ULCommFns
@@ -101,6 +101,9 @@ class LMI_SO ULCommFns final
     std::vector<double> const&  kM() const {return  km;}
 
   private:
+    ULCommFns(ULCommFns const&) = delete;
+    ULCommFns& operator=(ULCommFns const&) = delete;
+
     std::vector<double> qc;
     std::vector<double> ic;
     std::vector<double> ig;
diff --git a/configurable_settings.hpp b/configurable_settings.hpp
index 96f1f43..9821c1d 100644
--- a/configurable_settings.hpp
+++ b/configurable_settings.hpp
@@ -26,7 +26,6 @@
 
 #include "any_member.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "xml_serializable.hpp"
 
 #include <string>
@@ -43,9 +42,8 @@
 /// Data members are documented in their accessors' implementations.
 
 class LMI_SO configurable_settings final
-    :private lmi::uncopyable   <configurable_settings>
-    ,public  xml_serializable  <configurable_settings>
-    ,public  MemberSymbolTable <configurable_settings>
+    :public xml_serializable  <configurable_settings>
+    ,public MemberSymbolTable <configurable_settings>
 {
   public:
     static configurable_settings& instance();
@@ -71,6 +69,8 @@ class LMI_SO configurable_settings final
   private:
     configurable_settings();
     ~configurable_settings() override;
+    configurable_settings(configurable_settings const&) = delete;
+    configurable_settings& operator=(configurable_settings const&) = delete;
 
     void ascribe_members();
     void load();
diff --git a/database.hpp b/database.hpp
index 907c677..c90d25e 100644
--- a/database.hpp
+++ b/database.hpp
@@ -28,7 +28,6 @@
 #include "dbnames.hpp"                  // e_database_key
 #include "mc_enum_type_enums.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <memory>                       // std::shared_ptr
 #include <string>
@@ -41,7 +40,6 @@ class yare_input;
 /// Database of product parameters.
 
 class LMI_SO product_database final
-    :private lmi::uncopyable <product_database>
 {
     friend class input_test;       // For test_product_database().
     friend class premium_tax_test; // For test_rates().
@@ -73,6 +71,9 @@ class LMI_SO product_database final
     bool varies_by_state(e_database_key) const;
 
   private:
+    product_database(product_database const&) = delete;
+    product_database& operator=(product_database const&) = delete;
+
     void initialize(std::string const& product_name);
 
     DBDictionary const& db() const;
diff --git a/database_view.hpp b/database_view.hpp
index 6d414f7..6517e32 100644
--- a/database_view.hpp
+++ b/database_view.hpp
@@ -26,8 +26,6 @@
 
 #include "product_editor.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <memory>                       // std::shared_ptr
 
 class DatabaseDocument;
@@ -35,14 +33,16 @@ class DatabaseTableAdapter;
 class WXDLLIMPEXP_FWD_CORE wxTreeEvent;
 
 class DatabaseView final
-    :public  TreeGridViewBase
-    ,private lmi::uncopyable <DatabaseView>
+    :public TreeGridViewBase
 {
   public:
     DatabaseView();
     ~DatabaseView() override;
 
   private:
+    DatabaseView(DatabaseView const&) = delete;
+    DatabaseView& operator=(DatabaseView const&) = delete;
+
     // ViewEx required implementation.
     char const* icon_xrc_resource   () const override;
     char const* menubar_xrc_resource() const override;
diff --git a/dbdict.hpp b/dbdict.hpp
index 8db66e2..165776c 100644
--- a/dbdict.hpp
+++ b/dbdict.hpp
@@ -28,7 +28,6 @@
 #include "cache_file_reads.hpp"
 #include "dbvalue.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "xml_serializable.hpp"
 
 #include <string>
@@ -36,10 +35,9 @@
 /// Cached product database.
 
 class LMI_SO DBDictionary final
-    :private lmi::uncopyable   <DBDictionary>
-    ,public  xml_serializable  <DBDictionary>
-    ,public  MemberSymbolTable <DBDictionary>
-    ,public  cache_file_reads  <DBDictionary>
+    :public xml_serializable  <DBDictionary>
+    ,public MemberSymbolTable <DBDictionary>
+    ,public cache_file_reads  <DBDictionary>
 {
     friend class DatabaseDocument;
     friend class input_test;        // For test_product_database().
@@ -60,6 +58,9 @@ class LMI_SO DBDictionary final
     void InitAntediluvian();
 
   private:
+    DBDictionary(DBDictionary const&) = delete;
+    DBDictionary& operator=(DBDictionary const&) = delete;
+
     void Init(std::string const& filename);
 
     void ascribe_members();
diff --git a/death_benefits.hpp b/death_benefits.hpp
index 0136c7e..3d721c9 100644
--- a/death_benefits.hpp
+++ b/death_benefits.hpp
@@ -25,14 +25,12 @@
 #include "config.hpp"
 
 #include "mc_enum_type_enums.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <vector>
 
 class yare_input;
 
 class death_benefits final
-    :private lmi::uncopyable <death_benefits>
 {
   public:
     death_benefits(int, yare_input const&);
@@ -46,6 +44,9 @@ class death_benefits final
     std::vector<double>       const& supplamt() const;
 
   private:
+    death_benefits(death_benefits const&) = delete;
+    death_benefits& operator=(death_benefits const&) = delete;
+
     int length_;
     std::vector<mcenum_dbopt> dbopt_   ;
     std::vector<double>       specamt_ ;
diff --git a/docmanager_ex.hpp b/docmanager_ex.hpp
index 2efac5a..2387f58 100644
--- a/docmanager_ex.hpp
+++ b/docmanager_ex.hpp
@@ -24,8 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/docview.h>
 
 #include <memory>                       // std::unique_ptr
@@ -35,8 +33,7 @@ class WXDLLIMPEXP_FWD_CORE wxPageSetupDialogData;
 class WXDLLIMPEXP_FWD_CORE wxPrintData;
 
 class DocManagerEx
-    :public  wxDocManager
-    ,private lmi::uncopyable<DocManagerEx>
+    :public wxDocManager
 {
   public:
     explicit DocManagerEx
@@ -53,6 +50,9 @@ class DocManagerEx
     void DissociateFileHistoryFromFileMenu(wxMenuBar*);
 
   private:
+    DocManagerEx(DocManagerEx const&) = delete;
+    DocManagerEx& operator=(DocManagerEx const&) = delete;
+
     void UponPageSetup(wxCommandEvent&);
     // WX !! OnPreview() and OnPrint() aren't virtual; shouldn't they be?
     void UponPreview(wxCommandEvent&);
diff --git a/emit_ledger.hpp b/emit_ledger.hpp
index 81ef027..0b798fd 100644
--- a/emit_ledger.hpp
+++ b/emit_ledger.hpp
@@ -26,7 +26,6 @@
 
 #include "mc_enum_type_enums.hpp"       // enum mcenum_emission
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <boost/filesystem/path.hpp>
 
@@ -41,7 +40,6 @@ class Ledger;
 /// returns time spent, which is almost always wanted.
 
 class LMI_SO ledger_emitter final
-    :private lmi::uncopyable <ledger_emitter>
 {
   public:
     ledger_emitter(fs::path const& case_filepath, mcenum_emission emission);
@@ -52,6 +50,9 @@ class LMI_SO ledger_emitter final
     double finish   ();
 
   private:
+    ledger_emitter(ledger_emitter const&) = delete;
+    ledger_emitter& operator=(ledger_emitter const&) = delete;
+
     fs::path const& case_filepath_;
     mcenum_emission emission_;
 
diff --git a/fenv_guard.hpp b/fenv_guard.hpp
index ea03435..81d42bf 100644
--- a/fenv_guard.hpp
+++ b/fenv_guard.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 /// Guard class for critical floating-point calculations.
 ///
@@ -39,7 +38,6 @@
 /// floating-point calculations that presume the invariant.
 
 class LMI_SO fenv_guard final
-    :private lmi::uncopyable <fenv_guard>
 {
   public:
     fenv_guard();
@@ -48,6 +46,9 @@ class LMI_SO fenv_guard final
     static int instance_count();
 
   private:
+    fenv_guard(fenv_guard const&) = delete;
+    fenv_guard& operator=(fenv_guard const&) = delete;
+
     static int instance_count_;
 };
 
diff --git a/file_command.hpp b/file_command.hpp
index 293e0a7..10b5da5 100644
--- a/file_command.hpp
+++ b/file_command.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <string>
 
@@ -47,7 +46,6 @@ bool LMI_SO file_command_initialize(file_command_fp_type);
 /// wx, if that ever becomes necessary.
 
 struct LMI_SO file_command
-    :private lmi::uncopyable<file_command>
 {
     void operator()(std::string const&, std::string const&) const;
 };
diff --git a/fund_data.hpp b/fund_data.hpp
index 4a30dca..6e9fb5d 100644
--- a/fund_data.hpp
+++ b/fund_data.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <string>
 #include <vector>
@@ -61,7 +60,6 @@ class LMI_SO FundInfo final
 };
 
 class LMI_SO FundData final
-    :private lmi::uncopyable <FundData>
 {
   public:
     FundData(std::string const& a_Filename);
@@ -74,7 +72,9 @@ class LMI_SO FundData final
     int GetNumberOfFunds() const;
 
   private:
-    FundData(); // Private, but implemented.
+    FundData(); // Used by write_funds_files().
+    FundData(FundData const&) = delete;
+    FundData& operator=(FundData const&) = delete;
 
     void Read (std::string const& a_Filename);
     void Write(std::string const& a_Filename) const;
diff --git a/global_settings.hpp b/global_settings.hpp
index 0afb65f..ecc8771 100644
--- a/global_settings.hpp
+++ b/global_settings.hpp
@@ -26,7 +26,6 @@
 
 #include "calendar_date.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <boost/filesystem/path.hpp>
 
@@ -66,7 +65,6 @@
 /// functions to validate their arguments.
 
 class LMI_SO global_settings final
-    :private lmi::uncopyable <global_settings>
 {
   public:
     static global_settings& instance();
@@ -90,6 +88,8 @@ class LMI_SO global_settings final
   private:
     global_settings();
     ~global_settings();
+    global_settings(global_settings const&) = delete;
+    global_settings& operator=(global_settings const&) = delete;
 
     bool mellon_;
     bool ash_nazg_;
diff --git a/gpt_document.hpp b/gpt_document.hpp
index 39fa0d4..9b5e28a 100644
--- a/gpt_document.hpp
+++ b/gpt_document.hpp
@@ -26,7 +26,6 @@
 
 #include "gpt_input.hpp"
 #include "gpt_xml_document.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/docview.h>
 
@@ -34,8 +33,7 @@ class gpt_view;
 class WXDLLIMPEXP_FWD_CORE wxHtmlWindow;
 
 class gpt_document
-    :public  wxDocument
-    ,private lmi::uncopyable<gpt_document>
+    :public wxDocument
 {
     friend class gpt_view;
 
@@ -46,6 +44,9 @@ class gpt_document
     gpt_view& PredominantView() const;
 
   private:
+    gpt_document(gpt_document const&) = delete;
+    gpt_document& operator=(gpt_document const&) = delete;
+
     wxHtmlWindow& PredominantViewWindow() const;
 
     // wxDocument overrides.
diff --git a/gpt_view.hpp b/gpt_view.hpp
index f5cfd8e..3582177 100644
--- a/gpt_view.hpp
+++ b/gpt_view.hpp
@@ -28,7 +28,6 @@
 #include "view_ex.hpp"
 
 #include "oecumenic_enumerations.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/event.h>
 
@@ -60,8 +59,7 @@ class gpt_mvc_view
 };
 
 class gpt_view final
-    :public  ViewEx
-    ,private lmi::uncopyable <gpt_view>
+    :public ViewEx
 {
     friend class gpt_document;
 
@@ -70,6 +68,9 @@ class gpt_view final
     ~gpt_view() override;
 
   private:
+    gpt_view(gpt_view const&) = delete;
+    gpt_view& operator=(gpt_view const&) = delete;
+
     gpt_document& document() const;
 
     oenum_mvc_dv_rc edit_parameters();
diff --git a/gpt_xml_document.hpp b/gpt_xml_document.hpp
index d9bdcee..0dcc8fa 100644
--- a/gpt_xml_document.hpp
+++ b/gpt_xml_document.hpp
@@ -26,14 +26,12 @@
 
 #include "gpt_input.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "xml_lmi_fwd.hpp"
 
 #include <iosfwd>
 #include <string>
 
 class LMI_SO gpt_xml_document final
-    :private lmi::uncopyable <gpt_xml_document>
 {
     friend class gpt_document;
     friend class gpt_view;
@@ -50,6 +48,9 @@ class LMI_SO gpt_xml_document final
     void write(std::ostream&) const;
 
   private:
+    gpt_xml_document(gpt_xml_document const&) = delete;
+    gpt_xml_document& operator=(gpt_xml_document const&) = delete;
+
     void parse(xml_lmi::dom_parser const&);
     std::string const& xml_root_name() const;
 
diff --git a/group_quote_pdf_gen.hpp b/group_quote_pdf_gen.hpp
index a2ffe8c..05fa309 100644
--- a/group_quote_pdf_gen.hpp
+++ b/group_quote_pdf_gen.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <memory>                       // std::shared_ptr
 #include <string>
@@ -41,7 +40,6 @@ class Ledger;
 /// uses wxPdfDocument and other wx facilities and is only part of libskeleton.
 
 class LMI_SO group_quote_pdf_generator
-    :private lmi::uncopyable<group_quote_pdf_generator>
 {
   public:
     typedef std::shared_ptr<group_quote_pdf_generator> (*creator_type)();
@@ -56,6 +54,10 @@ class LMI_SO group_quote_pdf_generator
 
   protected:
     group_quote_pdf_generator();
+
+  private:
+    group_quote_pdf_generator(group_quote_pdf_generator const&) = delete;
+    group_quote_pdf_generator& operator=(group_quote_pdf_generator const&) = 
delete;
 };
 
 #endif // group_quote_pdf_gen_hpp
diff --git a/group_quote_pdf_gen_wx.cpp b/group_quote_pdf_gen_wx.cpp
index 7885fc5..30af584 100644
--- a/group_quote_pdf_gen_wx.cpp
+++ b/group_quote_pdf_gen_wx.cpp
@@ -206,7 +206,6 @@ void append_name_value_to_html_table
 /// less likely.
 
 class open_and_ensure_closing_tag
-    :private lmi::uncopyable<open_and_ensure_closing_tag>
 {
   public:
     open_and_ensure_closing_tag(wxString& html, char const* tag)
@@ -222,6 +221,9 @@ class open_and_ensure_closing_tag
     }
 
   private:
+    open_and_ensure_closing_tag(open_and_ensure_closing_tag const&) = delete;
+    open_and_ensure_closing_tag& operator=(open_and_ensure_closing_tag const&) 
= delete;
+
     wxString& html_;
     wxString const tag_;
 };
diff --git a/icon_monger.hpp b/icon_monger.hpp
index 8ff2afd..9f773d3 100644
--- a/icon_monger.hpp
+++ b/icon_monger.hpp
@@ -24,8 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/artprov.h>
 
 #include <map>
@@ -35,14 +33,16 @@
 /// Icon provider for wx interface.
 
 class icon_monger
-    :public  wxArtProvider
-    ,private lmi::uncopyable<icon_monger>
+    :public wxArtProvider
 {
   public:
     icon_monger();
     ~icon_monger() override;
 
   private:
+    icon_monger(icon_monger const&) = delete;
+    icon_monger& operator=(icon_monger const&) = delete;
+
     // wxArtProvider required implementation.
     wxBitmap CreateBitmap
         (wxArtID const&
diff --git a/ihs_irc7702.hpp b/ihs_irc7702.hpp
index 6c6fd3e..270de99 100644
--- a/ihs_irc7702.hpp
+++ b/ihs_irc7702.hpp
@@ -26,7 +26,6 @@
 
 #include "mc_enum_type_enums.hpp"
 #include "round_to.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <memory>                       // std::unique_ptr
 #include <vector>
@@ -51,7 +50,6 @@ class ULCommFns;
 // values are especially needed for the iterative specamt calculation.
 
 class Irc7702 final
-    :private lmi::uncopyable <Irc7702>
 {
     friend class FindSpecAmt;
     friend class gpt_specamt;
@@ -141,6 +139,9 @@ class Irc7702 final
     double premiums_paid() const;
 
   private:
+    Irc7702(Irc7702 const&) = delete;
+    Irc7702& operator=(Irc7702 const&) = delete;
+
     // Interest and DB Option basis
     enum EIOBasis
         {Opt1Int4Pct
diff --git a/illustration_document.hpp b/illustration_document.hpp
index e491dfd..e799961 100644
--- a/illustration_document.hpp
+++ b/illustration_document.hpp
@@ -26,7 +26,6 @@
 
 #include "input.hpp"
 #include "single_cell_document.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/docview.h>
 
@@ -47,8 +46,7 @@ class IllustrationView;
 class WXDLLIMPEXP_FWD_CORE wxHtmlWindow;
 
 class IllustrationDocument
-    :public  wxDocument
-    ,private lmi::uncopyable<IllustrationDocument>
+    :public wxDocument
 {
     friend class IllustrationView;
 
@@ -59,6 +57,9 @@ class IllustrationDocument
     IllustrationView& PredominantView() const;
 
   private:
+    IllustrationDocument(IllustrationDocument const&) = delete;
+    IllustrationDocument& operator=(IllustrationDocument const&) = delete;
+
     wxHtmlWindow& PredominantViewWindow() const;
 
     // wxDocument overrides.
diff --git a/illustration_view.hpp b/illustration_view.hpp
index 0b787a2..5191ca8 100644
--- a/illustration_view.hpp
+++ b/illustration_view.hpp
@@ -36,7 +36,6 @@
 
 #include "mc_enum_type_enums.hpp"       // enum mcenum_emission
 #include "oecumenic_enumerations.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/event.h>
 
@@ -51,8 +50,7 @@ class WXDLLIMPEXP_FWD_CORE wxHtmlWindow;
 // only for edit and run; in the census view class, it's used widely.
 
 class IllustrationView final
-    :public  ViewEx
-    ,private lmi::uncopyable <IllustrationView>
+    :public ViewEx
 {
     friend class IllustrationDocument;
 
@@ -69,6 +67,9 @@ class IllustrationView final
     void SetLedger(std::shared_ptr<Ledger const>);
 
   private:
+    IllustrationView(IllustrationView const&) = delete;
+    IllustrationView& operator=(IllustrationView const&) = delete;
+
     IllustrationDocument& document() const;
 
     oenum_mvc_dv_rc edit_parameters();
diff --git a/input_sequence.hpp b/input_sequence.hpp
index 94e2e8a..03e53f4 100644
--- a/input_sequence.hpp
+++ b/input_sequence.hpp
@@ -133,13 +133,11 @@
 
 #include "input_sequence_interval.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <string>
 #include <vector>
 
 class LMI_SO InputSequence final
-    :private lmi::uncopyable <InputSequence>
 {
     template<typename T>
     friend std::string canonicalized_input_sequence(std::vector<T> const&);
@@ -168,6 +166,9 @@ class LMI_SO InputSequence final
     std::vector<double>        const& seriatim_numbers()  const;
 
   private:
+    InputSequence(InputSequence const&) = delete;
+    InputSequence& operator=(InputSequence const&) = delete;
+
     explicit InputSequence(std::vector<std::string> const&);
     explicit InputSequence(std::vector<double> const&);
 
diff --git a/input_sequence_parser.hpp b/input_sequence_parser.hpp
index a2603e4..1644008 100644
--- a/input_sequence_parser.hpp
+++ b/input_sequence_parser.hpp
@@ -28,14 +28,12 @@
 
 #include "input_sequence_interval.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <sstream>
 #include <string>
 #include <vector>
 
 class SequenceParser final
-    :private lmi::uncopyable <SequenceParser>
 {
   public:
     SequenceParser
@@ -55,6 +53,9 @@ class SequenceParser final
     std::vector<ValueInterval> const& intervals() const;
 
   private:
+    SequenceParser(SequenceParser const&) = delete;
+    SequenceParser& operator=(SequenceParser const&) = delete;
+
     enum token_type
         {e_eof             = 0
         ,e_major_separator = ';'
diff --git a/ledger_text_formats.cpp b/ledger_text_formats.cpp
index 410dcea..0632c63 100644
--- a/ledger_text_formats.cpp
+++ b/ledger_text_formats.cpp
@@ -37,7 +37,6 @@
 #include "map_lookup.hpp"
 #include "mc_enum_types_aux.hpp"        // is_subject_to_ill_reg()
 #include "miscellany.hpp"
-#include "uncopyable_lmi.hpp"
 #include "value_cast.hpp"
 
 #include <algorithm>
@@ -139,7 +138,6 @@ std::map<std::string,ledger_metadata> const& 
ledger_metadata_map()
 }
 
 class calculation_summary_formatter final
-    :private lmi::uncopyable <calculation_summary_formatter>
 {
   public:
     calculation_summary_formatter(Ledger const&);
@@ -151,6 +149,9 @@ class calculation_summary_formatter final
     std::string top_note(std::string const& line_break) const;
 
   private:
+    calculation_summary_formatter(calculation_summary_formatter const&) = 
delete;
+    calculation_summary_formatter& operator=(calculation_summary_formatter 
const&) = delete;
+
     Ledger          const&   ledger_;
     LedgerInvariant const&   invar_;
     int             const    max_length_;
@@ -833,7 +834,6 @@ void PrintRosterTabDelimited
 }
 
 class FlatTextLedgerPrinter final
-    :private lmi::uncopyable <FlatTextLedgerPrinter>
 {
   public:
     FlatTextLedgerPrinter(Ledger const&, std::ostream&);
@@ -842,6 +842,9 @@ class FlatTextLedgerPrinter final
     void Print() const;
 
   private:
+    FlatTextLedgerPrinter(FlatTextLedgerPrinter const&) = delete;
+    FlatTextLedgerPrinter& operator=(FlatTextLedgerPrinter const&) = delete;
+
     void PrintHeader             () const;
     void PrintFooter             () const;
     void PrintNarrativeSummary   () const;
diff --git a/ledgervalues.hpp b/ledgervalues.hpp
index 12f4740..5fcd99a 100644
--- a/ledgervalues.hpp
+++ b/ledgervalues.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <memory>                       // std::shared_ptr
 #include <string>
@@ -38,7 +37,6 @@ class Ledger;
 /// This class encapsulates a frequently-used series of operations.
 
 class IllusVal final
-    :private lmi::uncopyable <IllusVal>
 {
   public:
     explicit IllusVal(std::string const& filename);
@@ -49,6 +47,9 @@ class IllusVal final
     std::shared_ptr<Ledger const> ledger() const;
 
   private:
+    IllusVal(IllusVal const&) = delete;
+    IllusVal& operator=(IllusVal const&) = delete;
+
     std::string filename_;
     std::shared_ptr<Ledger const> ledger_;
 };
diff --git a/loads_impl.hpp b/loads_impl.hpp
index 6075fc9..cd55d59 100644
--- a/loads_impl.hpp
+++ b/loads_impl.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "round_to.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <vector>
 
@@ -80,7 +79,6 @@ class product_database;
 /// implemented.
 
 struct load_details
-    :private lmi::uncopyable<load_details>
 {
     load_details
         (int                        length
diff --git a/main_wx_test.cpp b/main_wx_test.cpp
index c746f0a..887bed3 100644
--- a/main_wx_test.cpp
+++ b/main_wx_test.cpp
@@ -29,7 +29,6 @@
 #include "main_common.hpp"              // initialize_application()
 #include "path_utility.hpp"             // initialize_filesystem()
 #include "skeleton.hpp"
-#include "uncopyable_lmi.hpp"
 #include "wx_test_case.hpp"
 #include "wx_test_new.hpp"
 
@@ -150,7 +149,6 @@ struct TestsResults
 /// This is a simple Meyers singleton.
 
 class application_test final
-    :private lmi::uncopyable  <application_test>
 {
   public:
     static application_test& instance();
@@ -181,6 +179,8 @@ class application_test final
 
   private:
     application_test();
+    application_test(application_test const&) = delete;
+    application_test& operator=(application_test const&) = delete;
 
     // Sort all tests in alphabetical order of their names.
     void sort_tests();
diff --git a/mec_document.hpp b/mec_document.hpp
index cda9524..a72be87 100644
--- a/mec_document.hpp
+++ b/mec_document.hpp
@@ -26,7 +26,6 @@
 
 #include "mec_input.hpp"
 #include "mec_xml_document.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/docview.h>
 
@@ -34,8 +33,7 @@ class mec_view;
 class WXDLLIMPEXP_FWD_CORE wxHtmlWindow;
 
 class mec_document
-    :public  wxDocument
-    ,private lmi::uncopyable<mec_document>
+    :public wxDocument
 {
     friend class mec_view;
 
@@ -46,6 +44,9 @@ class mec_document
     mec_view& PredominantView() const;
 
   private:
+    mec_document(mec_document const&) = delete;
+    mec_document& operator=(mec_document const&) = delete;
+
     wxHtmlWindow& PredominantViewWindow() const;
 
     // wxDocument overrides.
diff --git a/mec_view.hpp b/mec_view.hpp
index aa67056..d301f45 100644
--- a/mec_view.hpp
+++ b/mec_view.hpp
@@ -28,7 +28,6 @@
 #include "view_ex.hpp"
 
 #include "oecumenic_enumerations.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/event.h>
 
@@ -60,8 +59,7 @@ class mec_mvc_view
 };
 
 class mec_view final
-    :public  ViewEx
-    ,private lmi::uncopyable <mec_view>
+    :public ViewEx
 {
     friend class mec_document;
 
@@ -70,6 +68,9 @@ class mec_view final
     ~mec_view() override;
 
   private:
+    mec_view(mec_view const&) = delete;
+    mec_view& operator=(mec_view const&) = delete;
+
     mec_document& document() const;
 
     oenum_mvc_dv_rc edit_parameters();
diff --git a/mec_xml_document.hpp b/mec_xml_document.hpp
index abfbc1c..0aa61fa 100644
--- a/mec_xml_document.hpp
+++ b/mec_xml_document.hpp
@@ -26,14 +26,12 @@
 
 #include "mec_input.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "xml_lmi_fwd.hpp"
 
 #include <iosfwd>
 #include <string>
 
 class LMI_SO mec_xml_document final
-    :private lmi::uncopyable <mec_xml_document>
 {
     friend class mec_document;
     friend class mec_view;
@@ -50,6 +48,9 @@ class LMI_SO mec_xml_document final
     void write(std::ostream&) const;
 
   private:
+    mec_xml_document(mec_xml_document const&) = delete;
+    mec_xml_document& operator=(mec_xml_document const&) = delete;
+
     void parse(xml_lmi::dom_parser const&);
     std::string const& xml_root_name() const;
 
diff --git a/msw_workarounds.hpp b/msw_workarounds.hpp
index 034495b..5943099 100644
--- a/msw_workarounds.hpp
+++ b/msw_workarounds.hpp
@@ -26,8 +26,6 @@
 
 #ifdef LMI_MSW
 
-#include "uncopyable_lmi.hpp"
-
 #include <deque>
 #include <string>
 
@@ -49,7 +47,6 @@
 /// in order to let this reversal be expressed more cleanly.
 
 class MswDllPreloader final
-    :private lmi::uncopyable <MswDllPreloader>
 {
   public:
     static MswDllPreloader& instance();
@@ -58,6 +55,8 @@ class MswDllPreloader final
   private:
     MswDllPreloader();
     ~MswDllPreloader();
+    MswDllPreloader(MswDllPreloader const&) = delete;
+    MswDllPreloader& operator=(MswDllPreloader const&) = delete;
 
     void PreloadOneDll(std::string const& dll_name);
     void UnloadOneDll (std::string const& dll_name);
diff --git a/multidimgrid_any.cpp b/multidimgrid_any.cpp
index 3a0b206..b9222f8 100644
--- a/multidimgrid_any.cpp
+++ b/multidimgrid_any.cpp
@@ -201,7 +201,6 @@ void MultiDimGridGrid::UponKeyDown(wxKeyEvent& event)
 /// an update and it is the place to do it once for all the calls.
 
 class GridRefreshTableDataGuard
-    :private lmi::uncopyable<GridRefreshTableDataGuard>
 {
   public:
     /// Construct guard for the counter, and use releaser at last exit
@@ -209,6 +208,9 @@ class GridRefreshTableDataGuard
     ~GridRefreshTableDataGuard();
 
   private:
+    GridRefreshTableDataGuard(GridRefreshTableDataGuard const&) = delete;
+    GridRefreshTableDataGuard& operator=(GridRefreshTableDataGuard const&) = 
delete;
+
     MultiDimGrid& grid_;
 };
 
diff --git a/multidimgrid_any.hpp b/multidimgrid_any.hpp
index ce2dfc6..4348cd6 100644
--- a/multidimgrid_any.hpp
+++ b/multidimgrid_any.hpp
@@ -90,7 +90,6 @@
 
 #include "alert.hpp"
 #include "assert_lmi.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <boost/any.hpp>
 
@@ -189,7 +188,6 @@ class WXDLLIMPEXP_FWD_CORE wxGridBagSizer;
 /// was up-to-date.
 
 class MultiDimAxisAny
-    :private lmi::uncopyable<MultiDimAxisAny>
 {
   public:
     MultiDimAxisAny(std::string const& name);
@@ -212,6 +210,9 @@ class MultiDimAxisAny
     virtual bool RefreshAdjustment(wxWindow&, unsigned int axis_id);
 
   private:
+    MultiDimAxisAny(MultiDimAxisAny const&) = delete;
+    MultiDimAxisAny& operator=(MultiDimAxisAny const&) = delete;
+
     /// Name of the axis used throughout the MultiDimGrid methods
     std::string const name_;
 };
@@ -470,7 +471,6 @@ inline void MultiDimTableAny::SetValueAny
 class MultiDimGrid
     :public  wxPanel
     ,private wxGridTableBase
-    ,private lmi::uncopyable<MultiDimGrid>
 {
     friend class GridRefreshTableDataGuard;
 
@@ -522,6 +522,9 @@ class MultiDimGrid
     wxGrid& grid() const;
 
   private:
+    MultiDimGrid(MultiDimGrid const&) = delete;
+    MultiDimGrid& operator=(MultiDimGrid const&) = delete;
+
     /// Implementation of wxGridTableBase interface. The widget serves as a 
data
     /// source for the wxGrid component.
     ///
@@ -755,8 +758,7 @@ inline bool MultiDimGrid::RefreshAxisAdjustment(std::string 
const& name)
 /// PopulateChoiceList(): Fill the control with axis value labels
 
 class MultiDimAxisAnyChoice
-    :public  wxChoice
-    ,private lmi::uncopyable<MultiDimAxisAnyChoice>
+    :public wxChoice
 {
     friend class MultiDimAxisAny;
 
@@ -770,6 +772,9 @@ class MultiDimAxisAnyChoice
     void PopulateChoiceList();
 
   private:
+    MultiDimAxisAnyChoice(MultiDimAxisAnyChoice const&) = delete;
+    MultiDimAxisAnyChoice& operator=(MultiDimAxisAnyChoice const&) = delete;
+
     // the axis that this object controls
     MultiDimAxisAny const& axis_;
 
diff --git a/multidimgrid_tools.hpp b/multidimgrid_tools.hpp
index 374b07e..74b31ef 100644
--- a/multidimgrid_tools.hpp
+++ b/multidimgrid_tools.hpp
@@ -27,7 +27,6 @@
 #include "multidimgrid_safe.hpp"
 
 #include "alert.hpp"
-#include "uncopyable_lmi.hpp"
 #include "value_cast.hpp"
 
 #include <wx/choice.h>
@@ -86,8 +85,7 @@ class AxisMaxBoundAdjusterBase
 
 template<typename Integral>
 class AxisMaxBoundAdjuster
-    :public  AxisMaxBoundAdjusterBase
-    ,private lmi::uncopyable<AxisMaxBoundAdjuster<Integral>>
+    :public AxisMaxBoundAdjusterBase
 {
   public:
     AxisMaxBoundAdjuster
@@ -101,6 +99,9 @@ class AxisMaxBoundAdjuster
     void     SetMaximumAxisValue(Integral max_value);
 
   private:
+    AxisMaxBoundAdjuster(AxisMaxBoundAdjuster const&) = delete;
+    AxisMaxBoundAdjuster& operator=(AxisMaxBoundAdjuster const&) = delete;
+
     void DoUponChange() override;
     void EnsureValidMaximumAxisValue(Integral const&) const;
 
diff --git a/multiple_cell_document.hpp b/multiple_cell_document.hpp
index 3848ccf..fb53c5e 100644
--- a/multiple_cell_document.hpp
+++ b/multiple_cell_document.hpp
@@ -26,7 +26,6 @@
 
 #include "input.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "xml_lmi_fwd.hpp"
 
 #include <iosfwd>
@@ -77,7 +76,6 @@
 /// that could of course be implemented.
 
 class LMI_SO multiple_cell_document final
-    :private lmi::uncopyable <multiple_cell_document>
 {
 // TODO ?? Avoid long-distance friendship...in single-cell class, too.
     friend class CensusDocument;
@@ -97,6 +95,9 @@ class LMI_SO multiple_cell_document final
     void write(std::ostream&) const;
 
   private:
+    multiple_cell_document(multiple_cell_document const&) = delete;
+    multiple_cell_document& operator=(multiple_cell_document const&) = delete;
+
     void parse   (xml_lmi::dom_parser const&);
     void parse_v0(xml_lmi::dom_parser const&);
 
diff --git a/mvc_controller.hpp b/mvc_controller.hpp
index 9998161..ee45859 100644
--- a/mvc_controller.hpp
+++ b/mvc_controller.hpp
@@ -24,8 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/bookctrl.h>                // wxBookCtrlBase, wxBookCtrlBaseEvent
 #include <wx/dialog.h>
 #include <wx/stattext.h>
@@ -405,8 +403,7 @@ namespace model_view_controller{} // doxygen workaround.
 /// Controller.
 
 class MvcController final
-    :public  wxDialog
-    ,private lmi::uncopyable <MvcController>
+    :public wxDialog
 {
     friend class MvcTest;
 
@@ -419,6 +416,9 @@ class MvcController final
     MvcModel const& Model() const;
 
   private:
+    MvcController(MvcController const&) = delete;
+    MvcController& operator=(MvcController const&) = delete;
+
     void Assimilate(std::string const& name_to_ignore);
     void Bind(std::string const& name, std::string& data) const;
     wxBookCtrlBase      & BookControl()      ;
diff --git a/name_value_pairs.hpp b/name_value_pairs.hpp
index 729309a..cfd460e 100644
--- a/name_value_pairs.hpp
+++ b/name_value_pairs.hpp
@@ -24,8 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <map>
 #include <string>
 
@@ -82,7 +80,6 @@
 /// extra checks can easily be added if they become desirable.
 
 class name_value_pairs final
-    :private lmi::uncopyable <name_value_pairs>
 {
     friend int test_main(int, char*[]);
 
@@ -97,6 +94,9 @@ class name_value_pairs final
     std::string        string_numeric_value(std::string const& key) const;
 
   private:
+    name_value_pairs(name_value_pairs const&) = delete;
+    name_value_pairs& operator=(name_value_pairs const&) = delete;
+
     std::map<std::string, std::string> const& map() const;
 
     string_map map_;
diff --git a/null_stream.cpp b/null_stream.cpp
index 8d883cf..c2ad1a6 100644
--- a/null_stream.cpp
+++ b/null_stream.cpp
@@ -22,7 +22,6 @@
 #include "pchfile.hpp"
 
 #include "null_stream.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <ostream>
 #include <streambuf>
@@ -40,8 +39,7 @@
 
 template<typename CharType, typename traits = std::char_traits<CharType>>
 class dev_null_stream_buffer
-    :public  std::streambuf
-    ,private lmi::uncopyable<dev_null_stream_buffer<CharType,traits>>
+    :public std::streambuf
 {
   public:
     dev_null_stream_buffer()
@@ -51,6 +49,9 @@ class dev_null_stream_buffer
     ~dev_null_stream_buffer() override = default;
 
   private:
+    dev_null_stream_buffer(dev_null_stream_buffer const&) = delete;
+    dev_null_stream_buffer& operator=(dev_null_stream_buffer const&) = delete;
+
     int_type overflow(int_type c) override
         {
         setp(buffer_, buffer_ + buffer_size_);
diff --git a/outlay.hpp b/outlay.hpp
index ddc4a33..350b8b1 100644
--- a/outlay.hpp
+++ b/outlay.hpp
@@ -25,14 +25,12 @@
 #include "config.hpp"
 
 #include "mc_enum_type_enums.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <vector>
 
 class yare_input;
 
 class modal_outlay final
-    :private lmi::uncopyable <modal_outlay>
 {
     friend class AccountValue;
 
@@ -51,7 +49,8 @@ class modal_outlay final
     std::vector<double>      const& withdrawals          () const;
 
   private:
-    modal_outlay();
+    modal_outlay(modal_outlay const&) = delete;
+    modal_outlay& operator=(modal_outlay const&) = delete;
 
     // Not yet used, but needed for MEC avoidance.
     void set_external_1035_amount(double z);
diff --git a/policy_view.hpp b/policy_view.hpp
index d52b6ec..6e6ad60 100644
--- a/policy_view.hpp
+++ b/policy_view.hpp
@@ -26,8 +26,6 @@
 
 #include "product_editor.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <map>
 #include <string>
 
@@ -35,8 +33,7 @@ class PolicyDocument;
 class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
 
 class PolicyView final
-    :public  ProductEditorView
-    ,private lmi::uncopyable <PolicyView>
+    :public ProductEditorView
 {
   public:
     PolicyView();
@@ -49,6 +46,9 @@ class PolicyView final
     static char const* resource_file_name();
 
   private:
+    PolicyView(PolicyView const&) = delete;
+    PolicyView& operator=(PolicyView const&) = delete;
+
     PolicyDocument& document() const;
 
     // ViewEx required implementation.
diff --git a/premium_tax.hpp b/premium_tax.hpp
index 636f381..4d5d543 100644
--- a/premium_tax.hpp
+++ b/premium_tax.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "mc_enum_type_enums.hpp"       // mcenum_state
-#include "uncopyable_lmi.hpp"
 
 #include <vector>
 
@@ -85,7 +84,6 @@ class stratified_charges;
 /// start_new_year() should be improved as noted in its documentation.
 
 class premium_tax final
-    :private lmi::uncopyable <premium_tax>
 {
   public:
     premium_tax
@@ -112,6 +110,9 @@ class premium_tax final
     bool   is_tiered              () const;
 
   private:
+    premium_tax(premium_tax const&) = delete;
+    premium_tax& operator=(premium_tax const&) = delete;
+
     void test_consistency() const;
 
     double ascertain_maximum_load_rate(stratified_charges const& strata) const;
diff --git a/product_data.hpp b/product_data.hpp
index e0bd6d1..f9bbe31 100644
--- a/product_data.hpp
+++ b/product_data.hpp
@@ -26,7 +26,6 @@
 
 #include "any_member.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "xml_serializable.hpp"
 
 #include <string>
@@ -78,9 +77,8 @@ template<> struct deserialized<product_data>
 /// Implicitly-declared special member functions do the right thing.
 
 class LMI_SO product_data final
-    :private lmi::uncopyable   <product_data>
-    ,public  xml_serializable  <product_data>
-    ,public  MemberSymbolTable <product_data>
+    :public xml_serializable  <product_data>
+    ,public MemberSymbolTable <product_data>
 {
     typedef deserialized<product_data>::value_type value_type;
 
@@ -98,6 +96,8 @@ class LMI_SO product_data final
 
   private:
     product_data();
+    product_data(product_data const&) = delete;
+    product_data& operator=(product_data const&) = delete;
 
     void ascribe_members();
 
diff --git a/product_editor.hpp b/product_editor.hpp
index 0172c5f..14e0b17 100644
--- a/product_editor.hpp
+++ b/product_editor.hpp
@@ -26,8 +26,6 @@
 
 #include "view_ex.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/docview.h>
 
 #include <string>
@@ -44,8 +42,7 @@ class WXDLLIMPEXP_FWD_CORE wxWindow;
 /// by the view portion of the document/view classes pair.
 
 class ProductEditorDocument
-    :public  wxDocument
-    ,private lmi::uncopyable<ProductEditorDocument>
+    :public wxDocument
 {
   public:
     ProductEditorDocument();
@@ -56,6 +53,9 @@ class ProductEditorDocument
     virtual void WriteDocument(std::string const& filename) = 0;
 
   private:
+    ProductEditorDocument(ProductEditorDocument const&) = delete;
+    ProductEditorDocument& operator=(ProductEditorDocument const&) = delete;
+
     ProductEditorView& PredominantView() const;
 
     // wxDocument overrides.
@@ -68,8 +68,7 @@ class ProductEditorDocument
 /// Common base for all product editor view classes.
 
 class ProductEditorView
-    :public  ViewEx
-    ,private lmi::uncopyable<ProductEditorView>
+    :public ViewEx
 {
     friend class ProductEditorDocument;
 
@@ -80,14 +79,17 @@ class ProductEditorView
   protected:
     virtual bool IsModified() const = 0;
     virtual void DiscardEdits() = 0;
+
+  private:
+    ProductEditorView(ProductEditorView const&) = delete;
+    ProductEditorView& operator=(ProductEditorView const&) = delete;
 };
 
 /// This class is a common base for TierView and DatabaseView classes.
 /// It contains and lays out common widgets.
 
 class TreeGridViewBase
-    :public  ProductEditorView
-    ,private lmi::uncopyable<TreeGridViewBase>
+    :public ProductEditorView
 {
   public:
     TreeGridViewBase();
@@ -107,6 +109,9 @@ class TreeGridViewBase
     virtual void SetupControls() = 0;
 
   private:
+    TreeGridViewBase(TreeGridViewBase const&) = delete;
+    TreeGridViewBase& operator=(TreeGridViewBase const&) = delete;
+
     // ViewEx required implementation.
     wxWindow* CreateChildWindow() override;
 
diff --git a/progress_meter.hpp b/progress_meter.hpp
index 6ec5ffc..4c2fd0c 100644
--- a/progress_meter.hpp
+++ b/progress_meter.hpp
@@ -191,7 +191,6 @@
 #include "config.hpp"
 
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <iosfwd>
 #include <memory>                       // std::shared_ptr
@@ -200,7 +199,6 @@
 std::ostringstream& LMI_SO progress_meter_unit_test_stream();
 
 class LMI_SO progress_meter
-    :private lmi::uncopyable<progress_meter>
 {
   public:
     enum enum_display_mode
@@ -237,6 +235,9 @@ class LMI_SO progress_meter
     virtual void        culminate_ui         ()       = 0;
 
   private:
+    progress_meter(progress_meter const&) = delete;
+    progress_meter& operator=(progress_meter const&) = delete;
+
     int               count_;
     int               max_count_;
     std::string       title_;
diff --git a/rate_table.cpp b/rate_table.cpp
index 8155648..97d0158 100644
--- a/rate_table.cpp
+++ b/rate_table.cpp
@@ -835,9 +835,10 @@ namespace soa_v3_format
 {
 
 class table_impl final
-    :private lmi::uncopyable <table_impl>
 {
   public:
+    table_impl() = default;
+
     // Load the table data from the stream containing the table data in either
     // binary or text representation.
     //
@@ -860,6 +861,9 @@ class table_impl final
     unsigned long compute_hash_value() const;
 
   private:
+    table_impl(table_impl const&) = delete;
+    table_impl& operator=(table_impl const&) = delete;
+
     // Helper methods for IO: all of them throw std::runtime_error on failure
     // and mention the field name in the error message.
     //
@@ -2346,7 +2350,6 @@ bool table::operator==(table const& other) const
 }
 
 class database_impl final
-    :private lmi::uncopyable <database_impl>
 {
   public:
     static fs::path get_index_path(fs::path const& path)
@@ -2372,6 +2375,9 @@ class database_impl final
     void save(std::ostream& index_os, std::ostream& data_os);
 
   private:
+    database_impl(database_impl const&) = delete;
+    database_impl& operator=(database_impl const&) = delete;
+
     // An index record is composed of:
     //
     //  -  4 byte table number
diff --git a/rate_table.hpp b/rate_table.hpp
index e755358..5ec9ddd 100644
--- a/rate_table.hpp
+++ b/rate_table.hpp
@@ -24,8 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <boost/filesystem/path.hpp>
 
 #include <cstddef>                      // std::size_t
@@ -116,7 +114,6 @@ class table
 /// locate a table by its number.
 
 class database final
-    :private lmi::uncopyable <database>
 {
   public:
     // Check if a database at the given path exists.
@@ -145,6 +142,8 @@ class database final
     // for as long as it needs it.
     database(std::istream& index_is, shared_ptr<std::istream> data_is);
 
+    ~database();
+
     // table access by index, only useful for iterating over all of them (using
     // iterators could be an alternative approach, but would be heavier without
     // providing much gain).
@@ -181,9 +180,10 @@ class database final
     void save(fs::path const& path);
     void save(std::ostream& index_os, std::ostream& data_os);
 
-    ~database();
-
   private:
+    database(database const&) = delete;
+    database& operator=(database const&) = delete;
+
     database_impl* const impl_;
 };
 
diff --git a/rate_table_test.cpp b/rate_table_test.cpp
index bdb6b12..a965ff5 100644
--- a/rate_table_test.cpp
+++ b/rate_table_test.cpp
@@ -27,7 +27,6 @@
 #include "miscellany.hpp"
 #include "path_utility.hpp"
 #include "test_tools.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <boost/filesystem/fstream.hpp>
 #include <boost/filesystem/operations.hpp>
@@ -87,7 +86,6 @@ class std_out_redirector
 // Class ensuring that the file with the given name is removed when the test
 // ends, whether it succeeds or fails.
 class test_file_eraser
-    :private lmi::uncopyable<test_file_eraser>
 {
   public:
     explicit test_file_eraser(fs::path const& path)
@@ -112,6 +110,9 @@ class test_file_eraser
         }
 
   private:
+    test_file_eraser(test_file_eraser const&) = delete;
+    test_file_eraser& operator=(test_file_eraser const&) = delete;
+
     fs::path path_;
 };
 } // Unnamed namespace.
diff --git a/rounding_rules.cpp b/rounding_rules.cpp
index cbb35c8..fb0dc5d 100644
--- a/rounding_rules.cpp
+++ b/rounding_rules.cpp
@@ -137,7 +137,7 @@ rounding_style rounding_parameters::raw_style() const
     return style_.value();
 }
 
-/// Private default ctor.
+/// Private default ctor for friend class and write_rounding_files().
 
 rounding_rules::rounding_rules()
     :round_specamt_           (0, r_upward    , "")
diff --git a/rounding_rules.hpp b/rounding_rules.hpp
index 957eaea..a1e74ea 100644
--- a/rounding_rules.hpp
+++ b/rounding_rules.hpp
@@ -28,7 +28,6 @@
 #include "mc_enum.hpp"
 #include "mc_enum_types.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "xml_serializable.hpp"
 
 #include <string>
@@ -89,9 +88,8 @@ class LMI_SO rounding_parameters final
 /// The 7702 and 7702A interest rate must be rounded up, if at all.
 
 class LMI_SO rounding_rules final
-    :private lmi::uncopyable   <rounding_rules>
-    ,public  xml_serializable  <rounding_rules>
-    ,public  MemberSymbolTable <rounding_rules>
+    :public xml_serializable  <rounding_rules>
+    ,public MemberSymbolTable <rounding_rules>
 {
     friend class RoundingDocument;
 
@@ -107,6 +105,8 @@ class LMI_SO rounding_rules final
 
   private:
     rounding_rules();
+    rounding_rules(rounding_rules const&) = delete;
+    rounding_rules& operator=(rounding_rules const&) = delete;
 
     void ascribe_members();
 
diff --git a/rounding_view.hpp b/rounding_view.hpp
index 9f388b1..582c8dd 100644
--- a/rounding_view.hpp
+++ b/rounding_view.hpp
@@ -26,16 +26,13 @@
 
 #include "product_editor.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <map>
 
 class RoundingButtons;
 class RoundingDocument;
 
 class RoundingView final
-    :public  ProductEditorView
-    ,private lmi::uncopyable <RoundingView>
+    :public ProductEditorView
 {
   public:
     RoundingView();
@@ -48,6 +45,9 @@ class RoundingView final
     static char const* resource_file_name();
 
   private:
+    RoundingView(RoundingView const&) = delete;
+    RoundingView& operator=(RoundingView const&) = delete;
+
     RoundingDocument& document() const;
 
     // ViewEx required implementation.
diff --git a/single_cell_document.hpp b/single_cell_document.hpp
index 6333c68..def610b 100644
--- a/single_cell_document.hpp
+++ b/single_cell_document.hpp
@@ -26,14 +26,12 @@
 
 #include "input.hpp"
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 #include "xml_lmi_fwd.hpp"
 
 #include <iosfwd>
 #include <string>
 
 class LMI_SO single_cell_document final
-    :private lmi::uncopyable <single_cell_document>
 {
     friend class IllustrationDocument;
     friend class IllustrationView;
@@ -51,6 +49,9 @@ class LMI_SO single_cell_document final
     void write(std::ostream&) const;
 
   private:
+    single_cell_document(single_cell_document const&) = delete;
+    single_cell_document& operator=(single_cell_document const&) = delete;
+
     void parse(xml_lmi::dom_parser const&);
 
     int                class_version() const;
diff --git a/skeleton.hpp b/skeleton.hpp
index 4654401..382338d 100644
--- a/skeleton.hpp
+++ b/skeleton.hpp
@@ -34,8 +34,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/app.h>
 #include <wx/timer.h>
 
@@ -52,8 +50,7 @@ class WXDLLIMPEXP_FWD_CORE wxMDIChildFrame;
 class WXDLLIMPEXP_FWD_CORE wxMenuBar;
 
 class Skeleton
-    :        public  wxApp
-    ,        private lmi::uncopyable <Skeleton>
+    :public wxApp
 {
   public:
     Skeleton();
@@ -78,6 +75,9 @@ class Skeleton
     bool OnInit                () override;
 
   private:
+    Skeleton(Skeleton const&) = delete;
+    Skeleton& operator=(Skeleton const&) = delete;
+
     wxMenuBar* AdjustMenus(wxMenuBar*);
 
     void InitDocManager ();
diff --git a/test_coding_rules.cpp b/test_coding_rules.cpp
index 143cb64..a4324f0 100644
--- a/test_coding_rules.cpp
+++ b/test_coding_rules.cpp
@@ -25,7 +25,6 @@
 #include "istream_to_string.hpp"
 #include "main_common.hpp"
 #include "miscellany.hpp"               // lmi_array_size(), split_into_lines()
-#include "uncopyable_lmi.hpp"
 
 #include <boost/filesystem/convenience.hpp> // fs::extension()
 #include <boost/filesystem/fstream.hpp>
@@ -82,7 +81,6 @@ enum enum_kingdom
     };
 
 class file final
-    :private lmi::uncopyable <file>
 {
   public:
     explicit file(std::string const& file_path);
@@ -100,6 +98,9 @@ class file final
     std::string const& data     () const {return data_;     }
 
   private:
+    file(file const&) = delete;
+    file& operator=(file const&) = delete;
+
     fs::path    path_;
     std::string full_name_;
     std::string leaf_name_;
diff --git a/text_view.hpp b/text_view.hpp
index 53205a0..a17b285 100644
--- a/text_view.hpp
+++ b/text_view.hpp
@@ -34,8 +34,6 @@
 
 #include "view_ex.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/defs.h>                    // wx shared-library 'attributes'
 
 class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
@@ -49,8 +47,7 @@ class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
 /// model for some other feature someday.
 
 class TextEditView final
-    :public  ViewEx
-    ,private lmi::uncopyable <TextEditView>
+    :public ViewEx
 {
     friend class TextEditDocument;
 
@@ -59,6 +56,9 @@ class TextEditView final
     ~TextEditView() override;
 
   private:
+    TextEditView(TextEditView const&) = delete;
+    TextEditView& operator=(TextEditView const&) = delete;
+
     // ViewEx required implementation.
     wxWindow* CreateChildWindow() override;
     char const* icon_xrc_resource   () const override;
diff --git a/tier_view.hpp b/tier_view.hpp
index 591dd53..d7d28a3 100644
--- a/tier_view.hpp
+++ b/tier_view.hpp
@@ -26,8 +26,6 @@
 
 #include "product_editor.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <memory>                       // std::shared_ptr
 
 class TierDocument;
@@ -35,14 +33,16 @@ class TierTableAdapter;
 class WXDLLIMPEXP_FWD_CORE wxTreeEvent;
 
 class TierView final
-    :public  TreeGridViewBase
-    ,private lmi::uncopyable <TierView>
+    :public TreeGridViewBase
 {
   public:
     TierView();
     ~TierView() override;
 
   private:
+    TierView(TierView const&) = delete;
+    TierView& operator=(TierView const&) = delete;
+
     // ViewEx required implementation.
     char const* icon_xrc_resource   () const override;
     char const* menubar_xrc_resource() const override;
diff --git a/timer.hpp b/timer.hpp
index 76d98fa..69e72b0 100644
--- a/timer.hpp
+++ b/timer.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "so_attributes.hpp"
-#include "uncopyable_lmi.hpp"
 
 #if defined LMI_POSIX
 #   include <sys/time.h>                // gettimeofday()
@@ -60,7 +59,6 @@ void lmi_sleep(unsigned int seconds);
 /// make your own decision about that rationale.
 
 class LMI_SO Timer
-    :private lmi::uncopyable<Timer>
 {
     friend class TimerTest;
     template<typename F> friend class AliquotTimer;
@@ -77,6 +75,9 @@ class LMI_SO Timer
     double             elapsed_seconds() const;
 
   private:
+    Timer(Timer const&) = delete;
+    Timer& operator=(Timer const&) = delete;
+
     elapsed_t   calibrate();
     void        start();
 
diff --git a/transferor.hpp b/transferor.hpp
index 929d9d4..4a9866c 100644
--- a/transferor.hpp
+++ b/transferor.hpp
@@ -32,8 +32,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/validate.h>
 
 #include <string>
@@ -114,8 +112,7 @@ enum transfer_direction
 /// overridden here to return true instead.
 
 class Transferor
-    :public  wxValidator
-    ,private lmi::uncopyable<Transferor>
+    :public wxValidator
 {
   public:
     Transferor(std::string& data, std::string const& name);
@@ -130,6 +127,9 @@ class Transferor
     std::string const& name() const;
 
   private:
+    Transferor(Transferor const&) = delete;
+    Transferor& operator=(Transferor const&) = delete;
+
     bool PerformTransfer(transfer_direction);
 
     std::string& data_;
diff --git a/uncopyable_lmi.hpp b/uncopyable_lmi.hpp
deleted file mode 100644
index 1c13679..0000000
--- a/uncopyable_lmi.hpp
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Gregory W. 
Chicares.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License version 2 as
-// published by the Free Software Foundation.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software Foundation,
-// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-//
-// http://savannah.nongnu.org/projects/lmi
-// email: <address@hidden>
-// snail: Chicares, 186 Belle Woods Drive, Glastonbury CT 06033, USA
-
-#ifndef uncopyable_lmi_hpp
-#define uncopyable_lmi_hpp
-
-#include "config.hpp"
-
-#include <type_traits>
-
-/// Forbid compiler to generate copy and assignment functions.
-///
-/// This implementation is an original work. The idea of a mixin with
-/// private copy and assignment members is very old and of uncertain
-/// provenance. The idea of making that mixin a template seems to have
-/// been suggested first by Cacciola:
-///   http://lists.boost.org/Archives/boost/2001/09/16912.php
-///   http://lists.boost.org/Archives/boost/2001/09/17385.php
-///
-/// This class is often seen in a non-template guise, but consider:
-///
-///   class B0 : private Uncopyable {};
-///   class B1 : private Uncopyable {};
-///   class D  : public B0, public B1 {};
-///
-/// The derived class has two distinct copies of Uncopyable, to which
-/// the empty base class optimization cannot be applied:
-///   
http://groups.google.com/group/comp.lang.c++.moderated/msg/6cc884d20b336d08
-/// Rewriting that example to use virtual inheritance:
-///
-///   class B0 : virtual private Uncopyable {};
-///   class B1 : virtual private Uncopyable {};
-///   class D  : public B0, public B1 {};
-///
-/// is likely to introduce its own efficiency issues:
-///   http://lists.boost.org/Archives/boost/2001/09/17391.php
-///
-/// Even where such inefficiencies don't matter, the template version
-/// is preferable for its clarity. Consider:
-///
-//    class Uncopyable /* non-template implementation */;
-///   class B0 : private Uncopyable {};
-///   class B1 : private Uncopyable {};
-///   class D  : private Uncopyable, public B0, public B1 {};
-///
-/// Deriving class D explicitly from Uncopyable serves two purposes:
-/// it prevents the compiler from implicitly defining a copy ctor or
-/// a copy assignment operator; and it also documents that the lack of
-/// explicit declarations for those special member functions is not an
-/// oversight. As self-enforcing documentation, it belongs in class D.
-/// However, this example is likely to elicit an ambiguity warning--a
-/// Bad Thing when one strives to write code that compiles without any
-/// warnings.
-///
-/// Such warnings may be avoided by virtual inheritance, as in the
-/// second example above--though that's inefficient, as already noted.
-/// It's also not ideal for documenting the derived class, because
-/// 'virtual' belongs in the base classes:
-///   http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9
-/// Adding a new class later, e.g.:
-///   class E : private Uncopyable, public D {};
-/// would require changing D's inheritance to virtual, yet D and E are
-/// likely to be declared in different source files.
-///
-/// The present class does requires a template parameter (which is
-/// reasonably constrained to name the class rendered uncopyable):
-///
-///   class B0 : private uncopyable<B0> {};
-///   class B1 : private uncopyable<B1> {};
-///   class D  : private uncopyable<D>, public B0, public B1 {};
-///
-/// but its clarity and efficiency make it the least objectionable
-/// option.
-
-namespace lmi
-{
-template<typename T>
-class uncopyable
-{
-  protected:
-    uncopyable() = default;
-    ~uncopyable()
-        {
-        static_assert(std::is_base_of<uncopyable<T>,T>::value, "");
-        }
-
-  private:
-    uncopyable(uncopyable const&);
-    uncopyable& operator=(uncopyable const&);
-};
-} // namespace lmi
-
-// If lmi provided unit tests that deliberately fail to compile, then
-// this could be used:
-//
-// #include "uncopyable_lmi.hpp"
-//
-// class X : private lmi::uncopyable<X> {};
-//
-// int main()
-// {
-//     X x;
-//     X y(x); // Error: cannot copy.
-//     x = y;  // Error: cannot assign.
-// }
-
-#endif // uncopyable_lmi_hpp
-
diff --git a/view_ex.hpp b/view_ex.hpp
index 98ec644..4588c5e 100644
--- a/view_ex.hpp
+++ b/view_ex.hpp
@@ -71,8 +71,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <wx/docview.h>
 
 #include <string>
@@ -84,8 +82,7 @@ class WXDLLIMPEXP_FWD_CORE wxIcon;
 class WXDLLIMPEXP_FWD_CORE wxMenuBar;
 
 class ViewEx
-    :public  wxView
-    ,private lmi::uncopyable<ViewEx>
+    :public wxView
 {
   public:
     ViewEx();
@@ -103,6 +100,9 @@ class ViewEx
     bool DoOnCreate(wxDocument* doc, long int flags);
 
   private:
+    ViewEx(ViewEx const&) = delete;
+    ViewEx& operator=(ViewEx const&) = delete;
+
     // Pure virtuals.
     virtual wxWindow* CreateChildWindow() = 0;
     virtual char const* icon_xrc_resource   () const = 0;
diff --git a/wx_test_benchmark_census.cpp b/wx_test_benchmark_census.cpp
index 2b4190b..556d28a 100644
--- a/wx_test_benchmark_census.cpp
+++ b/wx_test_benchmark_census.cpp
@@ -22,7 +22,6 @@
 #include "pchfile_wx.hpp"
 
 #include "assert_lmi.hpp"
-#include "uncopyable_lmi.hpp"
 #include "wx_test_case.hpp"
 #include "wx_test_statusbar.hpp"
 
@@ -41,7 +40,6 @@ namespace
 {
 
 class census_benchmark
-    :private lmi::uncopyable<census_benchmark>
 {
   public:
     explicit census_benchmark(fs::path const& path)
@@ -57,6 +55,12 @@ class census_benchmark
         wxYield();
         }
 
+    ~census_benchmark()
+        {
+        // Close the census window opened in the ctor itself.
+        close_window();
+        }
+
     void time_operation
         (char const* operation
         ,char key
@@ -91,13 +95,10 @@ class census_benchmark
         z.Char('l', wxMOD_CONTROL); // "File|Close"
         }
 
-    ~census_benchmark()
-        {
-        // Close the census window opened in the ctor itself.
-        close_window();
-        }
-
   private:
+    census_benchmark(census_benchmark const&) = delete;
+    census_benchmark& operator=(census_benchmark const&) = delete;
+
     wxStatusBar& status_;
     wxString const name_;
 };
diff --git a/wx_test_case.hpp b/wx_test_case.hpp
index afbc8a9..5c62f66 100644
--- a/wx_test_case.hpp
+++ b/wx_test_case.hpp
@@ -24,15 +24,12 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <boost/filesystem/path.hpp>
 
 /// Base class for the test case objects.
 ///
 /// It is only supposed to be used by LMI_WX_TEST_CASE macro and not directly.
 class wx_base_test_case
-    :private lmi::uncopyable<wx_base_test_case>
 {
   public:
     /// The function actually executing the test code.
@@ -96,6 +93,10 @@ class wx_base_test_case
     explicit wx_base_test_case(char const* name);
 
     char const* const m_name;
+
+  private:
+    wx_base_test_case(wx_base_test_case const&) = delete;
+    wx_base_test_case& operator=(wx_base_test_case const&) = delete;
 };
 
 /// Define a test function and register it with the application tester.
diff --git a/wx_test_document.hpp b/wx_test_document.hpp
index 0f40420..0b50e0d 100644
--- a/wx_test_document.hpp
+++ b/wx_test_document.hpp
@@ -25,7 +25,6 @@
 #include "config.hpp"
 
 #include "mvc_controller.hpp"
-#include "uncopyable_lmi.hpp"
 
 #include <wx/log.h>
 #include <wx/testing.h>
@@ -54,7 +53,6 @@ wxWindow* wx_test_focus_controller_child(MvcController& 
dialog, char const* name
 /// to close().
 
 class wx_test_document_base
-    :private lmi::uncopyable<wx_test_document_base>
 {
   public:
     wx_test_document_base()
@@ -119,6 +117,9 @@ class wx_test_document_base
     void set_opened() { opened_ = true; }
 
   private:
+    wx_test_document_base(wx_test_document_base const&) = delete;
+    wx_test_document_base& operator=(wx_test_document_base const&) = delete;
+
     // Common part of different close() methods.
     void do_close()
     {
diff --git a/wx_test_output.hpp b/wx_test_output.hpp
index b20680a..751be08 100644
--- a/wx_test_output.hpp
+++ b/wx_test_output.hpp
@@ -24,8 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
-
 #include <boost/filesystem/operations.hpp>
 
 /// Class helping to check for the expected output file existence.
@@ -35,7 +33,6 @@
 /// later. It also cleans up the file when it is destroyed.
 
 class output_file_existence_checker
-    :private lmi::uncopyable<output_file_existence_checker>
 {
   public:
     output_file_existence_checker(fs::path const& path)
@@ -44,11 +41,6 @@ class output_file_existence_checker
         fs::remove(path_);
         }
 
-    bool exists() const
-        {
-        return fs::exists(path_);
-        }
-
     ~output_file_existence_checker()
         {
         try
@@ -60,7 +52,15 @@ class output_file_existence_checker
             }
         }
 
+    bool exists() const
+        {
+        return fs::exists(path_);
+        }
+
   private:
+    output_file_existence_checker(output_file_existence_checker const&) = 
delete;
+    output_file_existence_checker& operator=(output_file_existence_checker 
const&) = delete;
+
     fs::path path_;
 };
 
diff --git a/wx_test_validate_output.cpp b/wx_test_validate_output.cpp
index 58fcdfb..7507089 100644
--- a/wx_test_validate_output.cpp
+++ b/wx_test_validate_output.cpp
@@ -25,7 +25,6 @@
 #include "configurable_settings.hpp"
 #include "mvc_controller.hpp"
 #include "path_utility.hpp"
-#include "uncopyable_lmi.hpp"
 #include "wx_test_case.hpp"
 #include "wx_test_new.hpp"
 #include "wx_test_output.hpp"
diff --git a/xml_lmi.hpp b/xml_lmi.hpp
index f5a2f4e..a7909b7 100644
--- a/xml_lmi.hpp
+++ b/xml_lmi.hpp
@@ -24,7 +24,6 @@
 
 #include "config.hpp"
 
-#include "uncopyable_lmi.hpp"
 #include "xml_lmi_fwd.hpp"
 
 #include <xmlwrapp/node.h>              // xml::element
@@ -39,7 +38,6 @@
 namespace xml_lmi
 {
     class dom_parser
-        :private lmi::uncopyable<dom_parser>
     {
         typedef xml::tree_parser DomParser;
 
@@ -53,12 +51,14 @@ namespace xml_lmi
         xml::element const& root_node(std::string const& expected_name) const;
 
       private:
+        dom_parser(dom_parser const&) = delete;
+        dom_parser& operator=(dom_parser const&) = delete;
+
         std::string                     error_context_;
         std::unique_ptr<DomParser>      parser_;
     };
 
     class xml_document
-        :private lmi::uncopyable<xml_document>
     {
       public:
         xml_document(std::string const& root_node_name);
@@ -73,6 +73,9 @@ namespace xml_lmi
         void add_comment(std::string const&);
 
       private:
+        xml_document(xml_document const&) = delete;
+        xml_document& operator=(xml_document const&) = delete;
+
         std::string                     error_context_;
         std::unique_ptr<Document> const document_;
     };



reply via email to

[Prev in Thread] Current Thread [Next in Thread]