[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [lmi] odd/abstract_base a171b7f4 3/3: Split datum_string i
From: |
Greg Chicares |
Subject: |
[lmi-commits] [lmi] odd/abstract_base a171b7f4 3/3: Split datum_string into abstract base and concrete leaf |
Date: |
Thu, 14 Jul 2022 19:54:33 -0400 (EDT) |
branch: odd/abstract_base
commit a171b7f4f860b59cf156c6a083b9b7accb1002c1
Author: Gregory W. Chicares <gchicares@sbcglobal.net>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>
Split datum_string into abstract base and concrete leaf
This is a "spike" solution that has the virtue of passing every
nychthemeral test.
---
datum_string.cpp | 28 ++++++++++++++++++++++------
datum_string.hpp | 41 +++++++++++++++++++++++++++++++++++------
2 files changed, 57 insertions(+), 12 deletions(-)
diff --git a/datum_string.cpp b/datum_string.cpp
index 22951087..505f3b9a 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)
- :value_ {value}
+datum_string_base::datum_string_base(std::string const& s)
+ :value_ {s}
{
}
-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,27 @@ 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(std::string const& s)
+ :datum_string_base {s}
+{
+}
+
+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 68fc7188..ee69bb6a 100644
--- a/datum_string.hpp
+++ b/datum_string.hpp
@@ -30,8 +30,37 @@
#include <string>
-class datum_string
+class datum_string_base
:public datum_base
+{
+ public:
+ 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 = 0;
+
+ datum_string_base& operator=(std::string const&);
+
+ std::string const& value() const;
+
+ // datum_base required implementation.
+ std::istream& read (std::istream&) override;
+ std::ostream& write(std::ostream&) const override;
+
+ private:
+ std::string value_;
+};
+
+inline datum_string_base::~datum_string_base() = default;
+
+bool operator==(datum_string_base const&, datum_string_base const&);
+
+class datum_string
+ :public datum_string_base
{
public:
datum_string() = default;
@@ -45,14 +74,14 @@ class datum_string
datum_string& operator=(std::string const&);
- std::string const& value() const;
+// std::string const& value() const;
// datum_base required implementation.
- std::istream& read (std::istream&) override;
- std::ostream& write(std::ostream&) const override;
+// std::istream& read (std::istream&) override;
+// std::ostream& write(std::ostream&) const override;
- private:
- std::string value_;
+//private:
+// std::string value_;
};
bool operator==(datum_string const&, datum_string const&);