lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [lmi] master cde94ff9 10/13: Use an abstract-xor-final hie


From: Greg Chicares
Subject: [lmi-commits] [lmi] master cde94ff9 10/13: Use an abstract-xor-final hierarchy
Date: Wed, 27 Jul 2022 15:16:34 -0400 (EDT)

branch: master
commit cde94ff973687fefec022e1555b41436de9e2708
Author: Gregory W. Chicares <gchicares@sbcglobal.net>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>

    Use an abstract-xor-final hierarchy
---
 ce_product_name.hpp |  4 +++-
 ce_skin_name.hpp    |  4 +++-
 datum_base.hpp      | 11 ++---------
 datum_boolean.hpp   |  8 ++------
 datum_sequence.cpp  | 10 ----------
 datum_sequence.hpp  | 23 ++++++++++++++++-------
 datum_string.hpp    | 15 +++------------
 mc_enum.hpp         |  2 ++
 tn_range.hpp        |  8 ++------
 9 files changed, 33 insertions(+), 52 deletions(-)

diff --git a/ce_product_name.hpp b/ce_product_name.hpp
index 003fbc53..3b4bef58 100644
--- a/ce_product_name.hpp
+++ b/ce_product_name.hpp
@@ -52,7 +52,7 @@
 /// possible without adjusting the base class's 'allowed_' vector and
 /// perhaps changing the way ordinal() works?
 
-class LMI_SO ce_product_name
+class LMI_SO ce_product_name final
     :public mc_enum_base
 {
   public:
@@ -77,6 +77,8 @@ class LMI_SO ce_product_name
     std::string value() const;
 
   private:
+    void concrete_if_not_pure() override {}
+
     // datum_base required implementation.
     std::istream& read (std::istream&) override;
     std::ostream& write(std::ostream&) const override;
diff --git a/ce_skin_name.hpp b/ce_skin_name.hpp
index 644248a0..94f38f39 100644
--- a/ce_skin_name.hpp
+++ b/ce_skin_name.hpp
@@ -42,7 +42,7 @@
 /// to end users, but skin names are more esoteric and it is less
 /// confusing to show them as file names rather than apparent phrases.
 
-class ce_skin_name
+class ce_skin_name final
     :public mc_enum_base
 {
   public:
@@ -67,6 +67,8 @@ class ce_skin_name
     std::string value() const;
 
   private:
+    void concrete_if_not_pure() override {}
+
     // datum_base required implementation.
     std::istream& read (std::istream&) override;
     std::ostream& write(std::ostream&) const override;
diff --git a/datum_base.hpp b/datum_base.hpp
index 53511fc2..d92afc9d 100644
--- a/datum_base.hpp
+++ b/datum_base.hpp
@@ -24,6 +24,7 @@
 
 #include "config.hpp"
 
+#include "crtp_base.hpp"                // abstract_base
 #include "so_attributes.hpp"
 
 #include <iosfwd>
@@ -33,7 +34,7 @@
 /// Special member functions are protected simply because no need has
 /// arisen for them to be public.
 
-class LMI_SO datum_base
+class LMI_SO datum_base : private lmi::abstract_base<datum_base>
 {
   public:
     void enable(bool);
@@ -42,14 +43,6 @@ class LMI_SO datum_base
     virtual std::istream& read (std::istream&)       = 0;
     virtual std::ostream& write(std::ostream&) const = 0;
 
-  protected:
-    datum_base() = default;
-    datum_base(datum_base const&) = default;
-    datum_base(datum_base&&) = default;
-    datum_base& operator=(datum_base const&) = default;
-    datum_base& operator=(datum_base&&) = default;
-    virtual ~datum_base() = default;
-
   private:
     bool enabled_ {true};
 };
diff --git a/datum_boolean.hpp b/datum_boolean.hpp
index accd1a92..1759f72e 100644
--- a/datum_boolean.hpp
+++ b/datum_boolean.hpp
@@ -32,12 +32,6 @@ class datum_boolean final
   public:
     explicit datum_boolean(bool = true);
 
-    datum_boolean(datum_boolean const&) = default;
-    datum_boolean(datum_boolean&&) = default;
-    datum_boolean& operator=(datum_boolean const&) = default;
-    datum_boolean& operator=(datum_boolean&&) = default;
-    ~datum_boolean() override = default;
-
     datum_boolean& operator=(bool);
 
     bool value() const;
@@ -47,6 +41,8 @@ class datum_boolean final
     std::ostream& write(std::ostream&) const override;
 
   private:
+    void concrete_if_not_pure() override {}
+
     bool value_;
 };
 
diff --git a/datum_sequence.cpp b/datum_sequence.cpp
index 0a7ba75d..e5b4a131 100644
--- a/datum_sequence.cpp
+++ b/datum_sequence.cpp
@@ -25,17 +25,7 @@
 
 #include "assert_lmi.hpp"
 
-/// Default constructor.
-///
-/// Throws if insane.
-
-sequence_base::sequence_base()
-{
-}
-
 /// Construct from string.
-///
-/// Throws if insane.
 
 sequence_base::sequence_base(std::string const& s)
     :datum_string_base{s}
diff --git a/datum_sequence.hpp b/datum_sequence.hpp
index e122accd..e32bf26b 100644
--- a/datum_sequence.hpp
+++ b/datum_sequence.hpp
@@ -65,15 +65,9 @@ class sequence_base
     virtual std::map<std::string,std::string> const allowed_keywords() const;
 
   protected:
-    sequence_base();
+    sequence_base() = default;
     explicit sequence_base(std::string const&);
 
-    sequence_base(sequence_base const&) = default;
-    sequence_base(sequence_base&&) = default;
-    sequence_base& operator=(sequence_base const&) = default;
-    sequence_base& operator=(sequence_base&&) = default;
-    ~sequence_base() override = default;
-
     sequence_base& operator=(std::string const&);
 
     void assert_sanity() const;
@@ -109,6 +103,9 @@ class numeric_sequence final
     bool numeric_values_are_allowable() const override {return true;}
     bool keyword_values_are_allowable() const override {return false;}
     std::map<std::string,std::string> const allowed_keywords() const override;
+
+  private:
+    void concrete_if_not_pure() override {}
 };
 
 bool operator==(numeric_sequence const&, numeric_sequence const&);
@@ -139,6 +136,9 @@ class payment_sequence final
     bool numeric_values_are_allowable() const override {return true;}
     bool keyword_values_are_allowable() const override {return true;}
     std::map<std::string,std::string> const allowed_keywords() const override;
+
+  private:
+    void concrete_if_not_pure() override {}
 };
 
 bool operator==(payment_sequence const&, payment_sequence const&);
@@ -170,6 +170,9 @@ class mode_sequence final
     bool keyword_values_are_allowable() const override {return true;}
     std::string const default_keyword() const override;
     std::map<std::string,std::string> const allowed_keywords() const override;
+
+  private:
+    void concrete_if_not_pure() override {}
 };
 
 bool operator==(mode_sequence const&, mode_sequence const&);
@@ -200,6 +203,9 @@ class specamt_sequence final
     bool numeric_values_are_allowable() const override {return true;}
     bool keyword_values_are_allowable() const override {return true;}
     std::map<std::string,std::string> const allowed_keywords() const override;
+
+  private:
+    void concrete_if_not_pure() override {}
 };
 
 bool operator==(specamt_sequence const&, specamt_sequence const&);
@@ -231,6 +237,9 @@ class dbo_sequence final
     bool keyword_values_are_allowable() const override {return true;}
     std::string const default_keyword() const override;
     std::map<std::string,std::string> const allowed_keywords() const override;
+
+  private:
+    void concrete_if_not_pure() override {}
 };
 
 bool operator==(dbo_sequence const&, dbo_sequence const&);
diff --git a/datum_string.hpp b/datum_string.hpp
index 468ca4be..7985a580 100644
--- a/datum_string.hpp
+++ b/datum_string.hpp
@@ -37,12 +37,6 @@ class datum_string_base
     datum_string_base() = default;
     explicit datum_string_base(std::string const&);
 
-    datum_string_base(datum_string_base const&) = default;
-    datum_string_base(datum_string_base&&) = default;
-    datum_string_base& operator=(datum_string_base const&) = default;
-    datum_string_base& operator=(datum_string_base&&) = default;
-    ~datum_string_base() override = default;
-
     datum_string_base& operator=(std::string const&);
 
     std::string const& value() const;
@@ -64,13 +58,10 @@ class datum_string final
     datum_string() = default;
     explicit datum_string(std::string const& s) : datum_string_base{s} {}
 
-    datum_string(datum_string const&) = default;
-    datum_string(datum_string&&) = default;
-    datum_string& operator=(datum_string const&) = default;
-    datum_string& operator=(datum_string&&) = default;
-    ~datum_string() override = default;
-
     datum_string& operator=(std::string const&);
+
+  private:
+    void concrete_if_not_pure() override {}
 };
 
 bool operator==(datum_string const&, datum_string const&);
diff --git a/mc_enum.hpp b/mc_enum.hpp
index e01434d7..acd3c533 100644
--- a/mc_enum.hpp
+++ b/mc_enum.hpp
@@ -132,6 +132,8 @@ class mc_enum final
     static char const* const* c();
     static std::vector<std::string> const& s();
 
+    void concrete_if_not_pure() override {}
+
     // datum_base required implementation.
     std::istream& read (std::istream&) override;
     std::ostream& write(std::ostream&) const override;
diff --git a/tn_range.hpp b/tn_range.hpp
index fe6de2ba..0605f887 100644
--- a/tn_range.hpp
+++ b/tn_range.hpp
@@ -241,12 +241,6 @@ class tn_range final
     explicit tn_range(Number);
     explicit tn_range(std::string const&);
 
-    tn_range(tn_range const&) = default;
-    tn_range(tn_range&&) = default;
-    tn_range& operator=(tn_range const&) = default;
-    tn_range& operator=(tn_range&&) = default;
-    ~tn_range() override = default;
-
     tn_range& operator=(Number);
     tn_range& operator=(std::string const&);
 
@@ -273,6 +267,8 @@ class tn_range final
     std::string format_limits_for_error_message() const;
     bool is_valid(Number) const;
 
+    void concrete_if_not_pure() override {}
+
     // datum_base required implementation.
     std::istream& read (std::istream&) override;
     std::ostream& write(std::ostream&) const override;



reply via email to

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