[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [lmi] master 0311539 3/5: Make it easier to make input seq
From: |
Greg Chicares |
Subject: |
[lmi-commits] [lmi] master 0311539 3/5: Make it easier to make input sequences Copyable |
Date: |
Tue, 7 Mar 2017 18:04:20 -0500 (EST) |
branch: master
commit 0311539d36c7b67a57bba14c6add5bd012e59952
Author: Gregory W. Chicares <address@hidden>
Commit: Gregory W. Chicares <address@hidden>
Make it easier to make input sequences Copyable
Stored diagnostics in a std::string member, which is copyable (the
std::ostream where they are conveniently accumulated is not). Renamed
the accessor for diagnostics accordingly. Added a comment suggesting
how copy operations might be implemented.
Incidentally, made explicitly-deleted special member functions public:
that's clearer, equivalent, and gives simpler compiler diagnostics.
Also incidentally, made the 'parser' local variable in InputSequence's
public ctor const: there's no reason not to, and that's reason enough.
---
input_sequence.cpp | 4 ++--
input_sequence_parser.cpp | 9 +++++----
input_sequence_parser.hpp | 11 +++++++----
3 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/input_sequence.cpp b/input_sequence.cpp
index 23f035b..c5d3efc 100644
--- a/input_sequence.cpp
+++ b/input_sequence.cpp
@@ -94,7 +94,7 @@ InputSequence::InputSequence
|| a_keywords_only && contains(a_allowed_keywords, a_default_keyword)
);
- SequenceParser parser
+ SequenceParser const parser
(input_expression
,a_years_to_maturity
,a_issue_age
@@ -105,7 +105,7 @@ InputSequence::InputSequence
,a_keywords_only
);
- std::string const parser_diagnostics = parser.diagnostics();
+ std::string const parser_diagnostics = parser.diagnostic_messages();
if(!parser_diagnostics.empty())
{
throw std::runtime_error(parser_diagnostics);
diff --git a/input_sequence_parser.cpp b/input_sequence_parser.cpp
index d000d76..a66c1a5 100644
--- a/input_sequence_parser.cpp
+++ b/input_sequence_parser.cpp
@@ -51,11 +51,12 @@ SequenceParser::SequenceParser
,keywords_only_ (a_keywords_only)
{
sequence();
+ diagnostic_messages_ = diagnostics_.str();
}
-std::string SequenceParser::diagnostics() const
+std::string SequenceParser::diagnostic_messages() const
{
- return diagnostics_.str();
+ return diagnostic_messages_;
}
std::vector<ValueInterval> const& SequenceParser::intervals() const
@@ -655,8 +656,8 @@ void SequenceParser::mark_diagnostic_context()
/// Extract first substring from a '\n'-delimited exception::what().
///
-/// SequenceParser::diagnostics() returns a '\n'-delimited string
-/// describing all the anomalies diagnosed while parsing an input
+/// SequenceParser::diagnostic_messages() returns a '\n'-delimited
+/// string describing all anomalies diagnosed while parsing an input
/// sequence. When that string is not empty, it is reasonable to throw
/// an exception constructed from it--most generally, in its entirety.
///
diff --git a/input_sequence_parser.hpp b/input_sequence_parser.hpp
index 2e972d6..51c7935 100644
--- a/input_sequence_parser.hpp
+++ b/input_sequence_parser.hpp
@@ -46,15 +46,17 @@ class SequenceParser final
,bool a_keywords_only
);
+ // In case it is ever desired to implement these: they might
+ // simply copy the "parser products" data members that have
+ // public accessors.
+ SequenceParser(SequenceParser const&) = delete;
+ SequenceParser& operator=(SequenceParser const&) = delete;
~SequenceParser() = default;
- std::string diagnostics() const;
+ std::string diagnostic_messages() const;
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 = ';'
@@ -91,6 +93,7 @@ class SequenceParser final
void mark_diagnostic_context();
// Parser products.
+ std::string diagnostic_messages_;
std::vector<ValueInterval> intervals_;
// Streams for parser input and diagnostic messages.