[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [5021] Refactor, exposing an ancient defect
From: |
Greg Chicares |
Subject: |
[lmi-commits] [5021] Refactor, exposing an ancient defect |
Date: |
Sat, 03 Jul 2010 22:51:39 +0000 |
Revision: 5021
http://svn.sv.gnu.org/viewvc/?view=rev&root=lmi&revision=5021
Author: chicares
Date: 2010-07-03 22:51:38 +0000 (Sat, 03 Jul 2010)
Log Message:
-----------
Refactor, exposing an ancient defect
Modified Paths:
--------------
lmi/trunk/datum_sequence.cpp
lmi/trunk/datum_sequence.hpp
lmi/trunk/input.hpp
lmi/trunk/input_harmonization.cpp
lmi/trunk/input_realization.cpp
lmi/trunk/mec_input.hpp
Modified: lmi/trunk/datum_sequence.cpp
===================================================================
--- lmi/trunk/datum_sequence.cpp 2010-07-03 15:42:31 UTC (rev 5020)
+++ lmi/trunk/datum_sequence.cpp 2010-07-03 22:51:38 UTC (rev 5021)
@@ -122,6 +122,19 @@
return z.keyword_values_are_blocked_ == keyword_values_are_blocked_;
}
+/// Determine whether keywords are blocked.
+///
+/// Rationale: to support allowed_keywords() in derived classes.
+///
+/// It would be simple to provide a public accessor for the member
+/// datum, but maintaining strong encapsulation reduces the temptation
+/// for one component of MVC to inspect another's internals.
+
+bool datum_sequence::keyword_values_are_blocked() const
+{
+ return keyword_values_are_blocked_;
+}
+
/// Ensure that input is possible; throw otherwise.
///
/// Input is possible iff either
@@ -154,12 +167,40 @@
std::map<std::string,std::string> const payment_sequence::allowed_keywords()
const
{
+ if(keyword_values_are_blocked())
+ {
+ return std::map<std::string,std::string>();
+ }
+
static std::map<std::string,std::string> all_keywords;
if(all_keywords.empty())
{
- all_keywords["dummy"] = "DummyValue";
+ all_keywords["minimum" ] = "PmtMinimum" ;
+ all_keywords["target" ] = "PmtTarget" ;
+ all_keywords["sevenpay"] = "PmtMEP" ;
+ all_keywords["glp" ] = "PmtGLP" ;
+ all_keywords["gsp" ] = "PmtGSP" ;
+ all_keywords["corridor"] = "PmtCorridor" ;
+ all_keywords["table" ] = "PmtTable" ;
+ all_keywords["none" ] = "PmtInputScalar" ;
}
- return all_keywords;
+ std::map<std::string,std::string> permissible_keywords = all_keywords;
+ permissible_keywords.erase("none");
+
+ bool payment_indeterminate =
+ (
+ false
+ // TODO ?? Further conditions to disallow improper input:
+ // need to compare corresponding years.
+ // || specamt strategy is neither 'none' nor 'salary-based'
+ );
+
+ if(payment_indeterminate)
+ {
+ permissible_keywords.clear();
+ }
+
+ return permissible_keywords;
}
bool operator==(payment_sequence const& lhs, payment_sequence const& rhs)
@@ -177,12 +218,17 @@
std::map<std::string,std::string> const mode_sequence::allowed_keywords() const
{
+ LMI_ASSERT(!keyword_values_are_blocked());
static std::map<std::string,std::string> all_keywords;
if(all_keywords.empty())
{
- all_keywords["dummy"] = "DummyValue";
+ all_keywords["annual" ] = "Annual";
+ all_keywords["semiannual"] = "Semiannual";
+ all_keywords["quarterly" ] = "Quarterly";
+ all_keywords["monthly" ] = "Monthly";
}
- return all_keywords;
+ std::map<std::string,std::string> permissible_keywords = all_keywords;
+ return permissible_keywords;
}
bool operator==(mode_sequence const& lhs, mode_sequence const& rhs)
Modified: lmi/trunk/datum_sequence.hpp
===================================================================
--- lmi/trunk/datum_sequence.hpp 2010-07-03 15:42:31 UTC (rev 5020)
+++ lmi/trunk/datum_sequence.hpp 2010-07-03 22:51:38 UTC (rev 5021)
@@ -83,9 +83,13 @@
virtual std::map<std::string,std::string> const allowed_keywords() const;
bool equals(datum_sequence const&) const;
+
+ protected:
+ bool keyword_values_are_blocked() const;
+
+ private:
void assert_sanity() const;
- private:
bool keyword_values_are_blocked_;
};
Modified: lmi/trunk/input.hpp
===================================================================
--- lmi/trunk/input.hpp 2010-07-03 15:42:31 UTC (rev 5020)
+++ lmi/trunk/input.hpp 2010-07-03 22:51:38 UTC (rev 5021)
@@ -31,6 +31,7 @@
#include "any_member.hpp"
#include "ce_product_name.hpp"
#include "datum_boolean.hpp"
+#include "datum_sequence.hpp"
#include "datum_string.hpp"
#include "mc_enum.hpp"
#include "mc_enum_types.hpp"
@@ -50,11 +51,6 @@
#include <string>
#include <vector>
-/// Eventually it may become important to distinguish strings that
-/// represent input sequences, for interactive validation.
-
-typedef datum_string datum_sequence;
-
/// Design notes for class input.
///
/// This class is the Model of the MVC framework for life-insurance
@@ -203,8 +199,6 @@
std::map<std::string,std::string> const
permissible_specified_amount_strategy_keywords();
std::map<std::string,std::string> const
permissible_death_benefit_option_keywords();
- std::map<std::string,std::string> const
permissible_payment_strategy_keywords();
- std::map<std::string,std::string> const
permissible_payment_mode_keywords();
std::string RealizeExtraMonthlyCustodialFee ();
std::string RealizeExtraCompensationOnAssets ();
@@ -396,10 +390,10 @@
datum_sequence ProjectedSalary ;
datum_sequence SpecifiedAmount ;
datum_sequence DeathBenefitOption ;
- datum_sequence Payment ;
- datum_sequence PaymentMode ;
- datum_sequence CorporationPayment ;
- datum_sequence CorporationPaymentMode ;
+ payment_sequence Payment ;
+ mode_sequence PaymentMode ;
+ payment_sequence CorporationPayment ;
+ mode_sequence CorporationPaymentMode ;
datum_sequence GeneralAccountRate ;
datum_sequence SeparateAccountRate ;
datum_sequence NewLoan ;
@@ -505,6 +499,11 @@
DesiredType* z = 0;
z = exact_cast<ce_product_name >(m); if(z) return z;
z = exact_cast<datum_string >(m); if(z) return z;
+ // Sequences.
+ z = exact_cast<datum_sequence >(m); if(z) return z;
+ z = exact_cast<mode_sequence >(m); if(z) return z;
+ z = exact_cast<payment_sequence >(m); if(z) return z;
+ // mc- types.
z = exact_cast<mce_gen_basis >(m); if(z) return z;
z = exact_cast<mce_class >(m); if(z) return z;
z = exact_cast<mce_country >(m); if(z) return z;
@@ -536,6 +535,7 @@
z = exact_cast<mce_to_point >(m); if(z) return z;
z = exact_cast<mce_uw_basis >(m); if(z) return z;
z = exact_cast<mce_yes_or_no >(m); if(z) return z;
+ // tnr- types.
z = exact_cast<tnr_attained_age >(m); if(z) return z;
z = exact_cast<tnr_corridor_factor >(m); if(z) return z;
z = exact_cast<tnr_date >(m); if(z) return z;
Modified: lmi/trunk/input_harmonization.cpp
===================================================================
--- lmi/trunk/input_harmonization.cpp 2010-07-03 15:42:31 UTC (rev 5020)
+++ lmi/trunk/input_harmonization.cpp 2010-07-03 22:51:38 UTC (rev 5021)
@@ -593,8 +593,10 @@
// no such scalar control was ported. For payment strategy, lmi offers
// only input sequences that are enabled by default.
- Payment .enable(mce_solve_ee_prem != SolveType);
- CorporationPayment.enable(mce_solve_er_prem != SolveType);
+ Payment .enable (mce_solve_ee_prem != SolveType);
+ Payment .block_keyword_values(mce_solve_ee_prem == SolveType);
+ CorporationPayment.enable (mce_solve_er_prem != SolveType);
+ CorporationPayment.block_keyword_values(mce_solve_er_prem == SolveType);
IndividualPaymentMode.allow_all(true);
// TODO ?? Should the following be permitted? If so, then either
Modified: lmi/trunk/input_realization.cpp
===================================================================
--- lmi/trunk/input_realization.cpp 2010-07-03 15:42:31 UTC (rev 5020)
+++ lmi/trunk/input_realization.cpp 2010-07-03 22:51:38 UTC (rev 5021)
@@ -193,57 +193,6 @@
}
//============================================================================
-std::map<std::string,std::string> const
-Input::permissible_payment_strategy_keywords()
-{
- static std::map<std::string,std::string> all_keywords;
- if(all_keywords.empty())
- {
- all_keywords["minimum" ] = "PmtMinimum" ;
- all_keywords["target" ] = "PmtTarget" ;
- all_keywords["sevenpay"] = "PmtMEP" ;
- all_keywords["glp" ] = "PmtGLP" ;
- all_keywords["gsp" ] = "PmtGSP" ;
- all_keywords["corridor"] = "PmtCorridor" ;
- all_keywords["table" ] = "PmtTable" ;
- all_keywords["none" ] = "PmtInputScalar" ;
- }
- std::map<std::string,std::string> permissible_keywords = all_keywords;
- permissible_keywords.erase("none");
-
- bool payment_indeterminate =
- (
- false
- // TODO ?? Further conditions to disallow improper input:
- // need to compare corresponding years.
- // || specamt strategy is neither 'none' nor 'salary-based'
- );
-
- if(payment_indeterminate)
- {
- permissible_keywords.clear();
- }
-
- return permissible_keywords;
-}
-
-//============================================================================
-std::map<std::string,std::string> const
-Input::permissible_payment_mode_keywords()
-{
- static std::map<std::string,std::string> all_keywords;
- if(all_keywords.empty())
- {
- all_keywords["annual" ] = "Annual";
- all_keywords["semiannual"] = "Semiannual";
- all_keywords["quarterly" ] = "Quarterly";
- all_keywords["monthly" ] = "Monthly";
- }
- std::map<std::string,std::string> permissible_keywords = all_keywords;
- return permissible_keywords;
-}
-
-//============================================================================
std::vector<std::string> Input::RealizeAllSequenceInput(bool report_errors)
{
LMI_ASSERT(years_to_maturity() == database_->length());
@@ -636,17 +585,12 @@
//============================================================================
std::string Input::RealizePayment()
{
- std::map<std::string,std::string> z =
permissible_payment_strategy_keywords();
- if(mce_solve_ee_prem == SolveType)
- {
- z.clear();
- }
return realize_sequence_string
(*this
,PaymentRealized_
,PaymentStrategyRealized_
,Payment
- ,z
+ ,Payment.allowed_keywords()
,std::string("none")
);
}
@@ -662,7 +606,7 @@
(*this
,PaymentModeRealized_
,PaymentMode
- ,permissible_payment_mode_keywords()
+ ,PaymentMode.allowed_keywords()
,std::string("annual")
);
}
@@ -670,18 +614,12 @@
//============================================================================
std::string Input::RealizeCorporationPayment()
{
- std::map<std::string,std::string> z =
permissible_payment_strategy_keywords();
- if(mce_solve_er_prem == SolveType)
- {
- z.clear();
- }
-
return realize_sequence_string
(*this
,CorporationPaymentRealized_
,CorporationPaymentStrategyRealized_
,CorporationPayment
- ,z
+ ,CorporationPayment.allowed_keywords()
,std::string("none")
);
}
@@ -697,7 +635,7 @@
(*this
,CorporationPaymentModeRealized_
,CorporationPaymentMode
- ,permissible_payment_mode_keywords()
+ ,CorporationPaymentMode.allowed_keywords()
,std::string("annual")
);
}
Modified: lmi/trunk/mec_input.hpp
===================================================================
--- lmi/trunk/mec_input.hpp 2010-07-03 15:42:31 UTC (rev 5020)
+++ lmi/trunk/mec_input.hpp 2010-07-03 22:51:38 UTC (rev 5021)
@@ -31,6 +31,7 @@
#include "any_member.hpp"
#include "ce_product_name.hpp"
#include "datum_boolean.hpp"
+#include "datum_sequence.hpp"
#include "datum_string.hpp"
#include "mc_enum.hpp"
#include "mc_enum_types.hpp"
@@ -49,11 +50,6 @@
#include <string>
#include <vector>
-/// Eventually it may become important to distinguish strings that
-/// represent input sequences, for interactive validation.
-
-typedef datum_string datum_sequence;
-
/// This class is the Model of the MVC framework for MEC testing.
///
/// See general notes on class Input.
@@ -194,6 +190,9 @@
DesiredType* z = 0;
z = exact_cast<ce_product_name >(m); if(z) return z;
z = exact_cast<datum_string >(m); if(z) return z;
+ // Sequences.
+ z = exact_cast<datum_sequence >(m); if(z) return z;
+ // mc- types.
z = exact_cast<mce_class >(m); if(z) return z;
z = exact_cast<mce_defn_life_ins >(m); if(z) return z;
z = exact_cast<mce_defn_material_change>(m); if(z) return z;
@@ -203,6 +202,7 @@
z = exact_cast<mce_table_rating >(m); if(z) return z;
z = exact_cast<mce_uw_basis >(m); if(z) return z;
z = exact_cast<mce_yes_or_no >(m); if(z) return z;
+ // tnr- types.
z = exact_cast<tnr_date >(m); if(z) return z;
z = exact_cast<tnr_duration >(m); if(z) return z;
z = exact_cast<tnr_issue_age >(m); if(z) return z;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [lmi-commits] [5021] Refactor, exposing an ancient defect,
Greg Chicares <=