[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>