lmi-commits
[Top][All Lists]
Advanced

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

[lmi-commits] [lmi] master 9effa535 4/4: Cleave class datum_string into


From: Greg Chicares
Subject: [lmi-commits] [lmi] master 9effa535 4/4: Cleave class datum_string into base and leaf classes
Date: Fri, 15 Jul 2022 22:21:57 -0400 (EDT)

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

    Cleave class datum_string into base and leaf classes
    
    Meyers, MEC++ #33: "Make non-leaf classes abstract". See:
      https://lists.nongnu.org/archive/html/lmi/2022-07/msg00073.html
    et seqq.
---
 datum_sequence.cpp |  4 ++--
 datum_sequence.hpp |  2 +-
 datum_string.cpp   | 21 ++++++++++++++++-----
 datum_string.hpp   | 36 +++++++++++++++++++++++++++---------
 4 files changed, 46 insertions(+), 17 deletions(-)

diff --git a/datum_sequence.cpp b/datum_sequence.cpp
index 76506b52..f60ea9fb 100644
--- a/datum_sequence.cpp
+++ b/datum_sequence.cpp
@@ -40,7 +40,7 @@ sequence_base::sequence_base()
 /// Throws if insane.
 
 sequence_base::sequence_base(std::string const& s)
-    :datum_string                {s}
+    :datum_string_base           {s}
     ,keyword_values_are_blocked_ {false}
 {
     assert_sanity();
@@ -48,7 +48,7 @@ sequence_base::sequence_base(std::string const& s)
 
 sequence_base& sequence_base::operator=(std::string const& s)
 {
-    datum_string::operator=(s);
+    datum_string_base::operator=(s);
     return *this;
 }
 
diff --git a/datum_sequence.hpp b/datum_sequence.hpp
index ccc0030c..8c266e8b 100644
--- a/datum_sequence.hpp
+++ b/datum_sequence.hpp
@@ -56,7 +56,7 @@
 /// e.g., must accommodate numeric entry.
 
 class sequence_base
-    :public datum_string
+    :public datum_string_base
 {
   public:
     bool equals(sequence_base const&) const;
diff --git a/datum_string.cpp b/datum_string.cpp
index 22951087..b46f15c4 100644
--- a/datum_string.cpp
+++ b/datum_string.cpp
@@ -28,23 +28,23 @@
 #include <istream>
 #include <ostream>
 
-datum_string::datum_string(std::string const& value)
+datum_string_base::datum_string_base(std::string const& value)
     :value_ {value}
 {
 }
 
-datum_string& datum_string::operator=(std::string const& s)
+datum_string_base& datum_string_base::operator=(std::string const& s)
 {
     value_ = s;
     return *this;
 }
 
-std::string const& datum_string::value() const
+std::string const& datum_string_base::value() const
 {
     return value_;
 }
 
-std::istream& datum_string::read(std::istream& is)
+std::istream& datum_string_base::read(std::istream& is)
 {
     std::locale old_locale = is.imbue(blank_is_not_whitespace_locale());
     is >> value_;
@@ -52,11 +52,22 @@ std::istream& datum_string::read(std::istream& is)
     return is;
 }
 
-std::ostream& datum_string::write(std::ostream& os) const
+std::ostream& datum_string_base::write(std::ostream& os) const
 {
     return os << value();
 }
 
+bool operator==(datum_string_base const& lhs, datum_string_base const& rhs)
+{
+    return lhs.value() == rhs.value();
+}
+
+datum_string& datum_string::operator=(std::string const& s)
+{
+    datum_string_base::operator=(s);
+    return *this;
+}
+
 bool operator==(datum_string const& lhs, datum_string const& rhs)
 {
     return lhs.value() == rhs.value();
diff --git a/datum_string.hpp b/datum_string.hpp
index a71f2a38..9af53b40 100644
--- a/datum_string.hpp
+++ b/datum_string.hpp
@@ -30,20 +30,20 @@
 
 #include <string>
 
-class datum_string
+class datum_string_base
     :public datum_base
 {
   public:
-    datum_string() = default;
-    explicit datum_string(std::string const&);
+    datum_string_base() = default;
+    explicit datum_string_base(std::string const&);
 
-    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_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& operator=(std::string const&);
+    datum_string_base& operator=(std::string const&);
 
     std::string const& value() const;
 
@@ -55,6 +55,24 @@ class datum_string
     std::string value_;
 };
 
+bool operator==(datum_string_base const&, datum_string_base const&);
+
+class datum_string final
+    :public datum_string_base
+{
+  public:
+    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&);
+};
+
 bool operator==(datum_string const&, datum_string const&);
 
 template<> inline datum_string value_cast<datum_string,std::string>



reply via email to

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