lmi-commits
[Top][All Lists]
Advanced

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




reply via email to

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