lmi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lmi-commits] [4819] Rearrange explicit instantiation


From: Greg Chicares
Subject: [lmi-commits] [4819] Rearrange explicit instantiation
Date: Sat, 27 Mar 2010 01:26:17 +0000

Revision: 4819
          http://svn.sv.gnu.org/viewvc/?view=rev&root=lmi&revision=4819
Author:   chicares
Date:     2010-03-27 01:26:16 +0000 (Sat, 27 Mar 2010)
Log Message:
-----------
Rearrange explicit instantiation

Modified Paths:
--------------
    lmi/trunk/mc_enum_test_aux.cpp
    lmi/trunk/mc_enum_test_aux.hpp
    lmi/trunk/mc_enum_types.cpp
    lmi/trunk/mc_enum_types.hpp
    lmi/trunk/mc_enum_types_aux.cpp

Modified: lmi/trunk/mc_enum_test_aux.cpp
===================================================================
--- lmi/trunk/mc_enum_test_aux.cpp      2010-03-26 22:47:25 UTC (rev 4818)
+++ lmi/trunk/mc_enum_test_aux.cpp      2010-03-27 01:26:16 UTC (rev 4819)
@@ -26,9 +26,8 @@
 #   pragma hdrstop
 #endif // __BORLANDC__
 
-#include "mc_enum.hpp"
 #include "mc_enum.tpp"
-#include "mc_enum_test_aux_enums.hpp" // Plain enums.
+#include "mc_enum_test_aux.hpp"
 
 // The mc_enum types used for unit testing are explicitly instantiated
 // here, and not in the unit-test driver. This deliberately follows
@@ -37,6 +36,8 @@
 
 extern enum_holiday const holiday_enums[] = {h_Theophany, h_Easter, 
h_Pentecost};
 extern char const*const holiday_strings[] = {"Theophany", "Easter", 
"Pentecost"};
+template<> struct mc_enum_key<enum_holiday>
+  :public mc_enum_data<enum_holiday, 3, holiday_enums, holiday_strings> {};
 template class mc_enum<enum_holiday>;
 
 // Ni'ihau is deliberately (mis)spelled with an underbar instead of an
@@ -44,18 +45,7 @@
 
 extern enum_island const  island_enums[] = {i_Easter, i_Pago_Pago, i_Ni_ihau};
 extern char const*const island_strings[] = {"Easter", "Pago Pago", "Ni_ihau"};
+template<> struct mc_enum_key<enum_island>
+  :public mc_enum_data<enum_island, 3, island_enums, island_strings> {};
 template class mc_enum<enum_island>;
 
-// Explicit instantiation of class mc_enum above does not require a
-// definition of mc_enum_key<T>, which does not appear in the class
-// definition. However, because mc_enum_key<T> is used in the bodies
-// of member functions, it must be defined in this TU--before the
-// point of explicit instantiation of the member functions, but not
-// necessarily of the class [14.5.1.1/1]. The reason for including
-// its definition below rather than above is to force array bounds to
-// be 'calculated' [8.3.4/3], so that errors are detected at compile
-// time: this is the motivation for keeping class template mc_enum
-// and its metadata physically separate.
-
-#include "mc_enum_test_aux.hpp"
-

Modified: lmi/trunk/mc_enum_test_aux.hpp
===================================================================
--- lmi/trunk/mc_enum_test_aux.hpp      2010-03-26 22:47:25 UTC (rev 4818)
+++ lmi/trunk/mc_enum_test_aux.hpp      2010-03-27 01:26:16 UTC (rev 4819)
@@ -27,20 +27,10 @@
 #include "config.hpp"
 
 #include "mc_enum_fwd.hpp"
-#include "mc_enum_metadata.hpp"
 #include "mc_enum_test_aux_enums.hpp"
 
-extern enum_holiday const holiday_enums[3];
-extern char const*const holiday_strings[3];
-template<> struct mc_enum_key<enum_holiday>
-  :public mc_enum_data<enum_holiday, 3, holiday_enums, holiday_strings> {};
 typedef mc_enum<enum_holiday> e_holiday;
+typedef mc_enum<enum_island > e_island ;
 
-extern enum_island const island_enums[3];
-extern char const*const island_strings[3];
-template<> struct mc_enum_key<enum_island>
-  :public mc_enum_data<enum_island, 3, island_enums, island_strings> {};
-typedef mc_enum<enum_island> e_island;
-
 #endif // mc_enum_test_aux_hpp
 

Modified: lmi/trunk/mc_enum_types.cpp
===================================================================
--- lmi/trunk/mc_enum_types.cpp 2010-03-26 22:47:25 UTC (rev 4818)
+++ lmi/trunk/mc_enum_types.cpp 2010-03-27 01:26:16 UTC (rev 4819)
@@ -26,9 +26,8 @@
 #   pragma hdrstop
 #endif // __BORLANDC__
 
-#include "mc_enum.hpp"
 #include "mc_enum.tpp"
-#include "mc_enum_type_enums.hpp" // Plain enums.
+#include "mc_enum_types.hpp"
 
 // Here write illustrative examples and anything that doesn't follow
 // the macro paradigm, such as enumerators with nonsuccessive values.
@@ -54,6 +53,8 @@
     ,"B"
     ,"C"
     };
+template<> struct mc_enum_key<enum_option>
+  :public mc_enum_data<enum_option, 3, option_enums, option_strings> {};
 template class mc_enum<enum_option>;
 
 extern mcenum_emission const emission_enums[] =
@@ -82,6 +83,8 @@
     ,"emit_text_stream"
     ,"emit_custom_0"
     };
+template<> struct mc_enum_key<mcenum_emission>
+  :public mc_enum_data<mcenum_emission, 11, emission_enums, emission_strings> 
{};
 template class mc_enum<mcenum_emission>;
 
 extern rounding_style const rounding_style_enums[] =
@@ -102,66 +105,57 @@
     ,"Current"
     ,"Not at all"
     };
+template<> struct mc_enum_key<rounding_style>
+  :public mc_enum_data<rounding_style, 7, rounding_style_enums, 
rounding_style_strings> {};
 template class mc_enum<rounding_style>;
 
 #include "mc_enum_types.xpp"
 
-#define MC_DEFINE(TYPE) \
+#define MC_DEFINE(TYPE,NUMBER) \
 extern mcenum_##TYPE const TYPE##_enums[] = TYPE##_VALUES \
 extern char const*const TYPE##_strings[] = TYPE##_NAMES \
+template<> struct mc_enum_key<mcenum_##TYPE> \
+  :public mc_enum_data<mcenum_##TYPE, NUMBER, TYPE##_enums, TYPE##_strings> 
{}; \
 template class mc_enum<mcenum_##TYPE>;
 
-MC_DEFINE(yes_or_no)
-MC_DEFINE(gender)
-MC_DEFINE(smoking)
-MC_DEFINE(class)
-MC_DEFINE(dbopt)
-MC_DEFINE(dbopt_7702)
-MC_DEFINE(mode)
-MC_DEFINE(gen_basis)
-MC_DEFINE(sep_basis)
-MC_DEFINE(rate_period)
-MC_DEFINE(run_basis)
-MC_DEFINE(ledger_type)
-MC_DEFINE(uw_basis)
-MC_DEFINE(table_rating)
-MC_DEFINE(solve_type)
-MC_DEFINE(solve_target)
-MC_DEFINE(pmt_strategy)
-MC_DEFINE(sa_strategy)
-MC_DEFINE(gen_acct_rate_type)
-MC_DEFINE(sep_acct_rate_type)
-MC_DEFINE(loan_rate_type)
-MC_DEFINE(fund_input_method)
-MC_DEFINE(run_order)
-MC_DEFINE(survival_limit)
-MC_DEFINE(term_adj_method)
-MC_DEFINE(state)
-MC_DEFINE(country)
-MC_DEFINE(defn_life_ins)
-MC_DEFINE(mec_avoid_method)
-MC_DEFINE(defn_material_change)
-MC_DEFINE(spread_method)
-MC_DEFINE(coi_rate_method)
-MC_DEFINE(anticipated_deduction)
-MC_DEFINE(part_mort_table)
-MC_DEFINE(premium_table)
-MC_DEFINE(from_point)
-MC_DEFINE(to_point)
-MC_DEFINE(report_column)
+MC_DEFINE(yes_or_no,2)
+MC_DEFINE(gender,3)
+MC_DEFINE(smoking,3)
+MC_DEFINE(class,4)
+MC_DEFINE(dbopt,3)
+MC_DEFINE(dbopt_7702,2)
+MC_DEFINE(mode,4)
+MC_DEFINE(gen_basis,3)
+MC_DEFINE(sep_basis,3)
+MC_DEFINE(rate_period,2)
+MC_DEFINE(run_basis,7)
+MC_DEFINE(ledger_type,8)
+MC_DEFINE(uw_basis,5)
+MC_DEFINE(table_rating,11)
+MC_DEFINE(solve_type,6)
+MC_DEFINE(solve_target,4)
+MC_DEFINE(pmt_strategy,8)
+MC_DEFINE(sa_strategy,8)
+MC_DEFINE(gen_acct_rate_type,2)
+MC_DEFINE(sep_acct_rate_type,2)
+MC_DEFINE(loan_rate_type,2)
+MC_DEFINE(fund_input_method,3)
+MC_DEFINE(run_order,2)
+MC_DEFINE(survival_limit,4)
+MC_DEFINE(term_adj_method,3)
+MC_DEFINE(state,53)
+MC_DEFINE(country,239)
+MC_DEFINE(defn_life_ins,3)
+MC_DEFINE(mec_avoid_method,2)
+MC_DEFINE(defn_material_change,5)
+MC_DEFINE(spread_method,2)
+MC_DEFINE(coi_rate_method,2)
+MC_DEFINE(anticipated_deduction,4)
+MC_DEFINE(part_mort_table,1)
+MC_DEFINE(premium_table,1)
+MC_DEFINE(from_point,4)
+MC_DEFINE(to_point,4)
+MC_DEFINE(report_column,56)
 
 #undef MC_DEFINE
 
-// Explicit instantiation of class mc_enum above does not require a
-// definition of mc_enum_key<T>, which does not appear in the class
-// definition. However, because mc_enum_key<T> is used in the bodies
-// of member functions, it must be defined in this TU--before the
-// point of explicit instantiation of the member functions, but not
-// necessarily of the class [14.5.1.1/1]. The reason for including
-// its definition below rather than above is to force array bounds to
-// be 'calculated' [8.3.4/3], so that errors are detected at compile
-// time: this is the motivation for keeping class template mc_enum
-// and its metadata physically separate.
-
-#include "mc_enum_types.hpp"
-

Modified: lmi/trunk/mc_enum_types.hpp
===================================================================
--- lmi/trunk/mc_enum_types.hpp 2010-03-26 22:47:25 UTC (rev 4818)
+++ lmi/trunk/mc_enum_types.hpp 2010-03-27 01:26:16 UTC (rev 4819)
@@ -27,75 +27,56 @@
 #include "config.hpp"
 
 #include "mc_enum_fwd.hpp"
-#include "mc_enum_metadata.hpp"
-#include "mc_enum_type_enums.hpp" // Plain enumerators.
+#include "mc_enum_type_enums.hpp"
 
 // Here write illustrative examples and anything that doesn't follow
 // the macro paradigm, such as enumerators with nonsuccessive values.
 
-extern enum_option const option_enums[3];
-extern char const*const option_strings[3];
-template<> struct mc_enum_key<enum_option>
-  :public mc_enum_data<enum_option, 3, option_enums, option_strings> {};
-typedef mc_enum<enum_option> e_option;
+typedef mc_enum<enum_option    > e_option          ;
+typedef mc_enum<mcenum_emission> e_emission        ;
+typedef mc_enum<rounding_style > mce_rounding_style;
 
-extern mcenum_emission const emission_enums[11];
-extern char const*const emission_strings[11];
-template<> struct mc_enum_key<mcenum_emission>
-  :public mc_enum_data<mcenum_emission, 11, emission_enums, emission_strings> 
{};
-typedef mc_enum<mcenum_emission> e_emission;
-
-extern rounding_style const rounding_style_enums[7];
-extern char const*const rounding_style_strings[7];
-template<> struct mc_enum_key<rounding_style>
-  :public mc_enum_data<rounding_style, 7, rounding_style_enums, 
rounding_style_strings> {};
-typedef mc_enum<rounding_style> mce_rounding_style;
-
-#define MC_DECLARE(TYPE,NUMBER) \
-extern mcenum_##TYPE const TYPE##_enums[NUMBER]; \
-extern char const*const TYPE##_strings[NUMBER]; \
-template<> struct mc_enum_key<mcenum_##TYPE> \
-  :public mc_enum_data<mcenum_##TYPE, NUMBER, TYPE##_enums, TYPE##_strings> 
{}; \
+#define MC_DECLARE(TYPE) \
 typedef mc_enum<mcenum_##TYPE> mce_##TYPE;
 
-MC_DECLARE(yes_or_no,2)
-MC_DECLARE(gender,3)
-MC_DECLARE(smoking,3)
-MC_DECLARE(class,4)
-MC_DECLARE(dbopt,3)
-MC_DECLARE(dbopt_7702,2)
-MC_DECLARE(mode,4)
-MC_DECLARE(gen_basis,3)
-MC_DECLARE(sep_basis,3)
-MC_DECLARE(rate_period,2)
-MC_DECLARE(run_basis,7)
-MC_DECLARE(ledger_type,8)
-MC_DECLARE(uw_basis,5)
-MC_DECLARE(table_rating,11)
-MC_DECLARE(solve_type,6)
-MC_DECLARE(solve_target,4)
-MC_DECLARE(pmt_strategy,8)
-MC_DECLARE(sa_strategy,8)
-MC_DECLARE(gen_acct_rate_type,2)
-MC_DECLARE(sep_acct_rate_type,2)
-MC_DECLARE(loan_rate_type,2)
-MC_DECLARE(fund_input_method,3)
-MC_DECLARE(run_order,2)
-MC_DECLARE(survival_limit,4)
-MC_DECLARE(term_adj_method,3)
-MC_DECLARE(state,53)
-MC_DECLARE(country,239)
-MC_DECLARE(defn_life_ins,3)
-MC_DECLARE(mec_avoid_method,2)
-MC_DECLARE(defn_material_change,5)
-MC_DECLARE(spread_method,2)
-MC_DECLARE(coi_rate_method,2)
-MC_DECLARE(anticipated_deduction,4)
-MC_DECLARE(part_mort_table,1)
-MC_DECLARE(premium_table,1)
-MC_DECLARE(from_point,4)
-MC_DECLARE(to_point,4)
-MC_DECLARE(report_column,56)
+MC_DECLARE(yes_or_no)
+MC_DECLARE(gender)
+MC_DECLARE(smoking)
+MC_DECLARE(class)
+MC_DECLARE(dbopt)
+MC_DECLARE(dbopt_7702)
+MC_DECLARE(mode)
+MC_DECLARE(gen_basis)
+MC_DECLARE(sep_basis)
+MC_DECLARE(rate_period)
+MC_DECLARE(run_basis)
+MC_DECLARE(ledger_type)
+MC_DECLARE(uw_basis)
+MC_DECLARE(table_rating)
+MC_DECLARE(solve_type)
+MC_DECLARE(solve_target)
+MC_DECLARE(pmt_strategy)
+MC_DECLARE(sa_strategy)
+MC_DECLARE(gen_acct_rate_type)
+MC_DECLARE(sep_acct_rate_type)
+MC_DECLARE(loan_rate_type)
+MC_DECLARE(fund_input_method)
+MC_DECLARE(run_order)
+MC_DECLARE(survival_limit)
+MC_DECLARE(term_adj_method)
+MC_DECLARE(state)
+MC_DECLARE(country)
+MC_DECLARE(defn_life_ins)
+MC_DECLARE(mec_avoid_method)
+MC_DECLARE(defn_material_change)
+MC_DECLARE(spread_method)
+MC_DECLARE(coi_rate_method)
+MC_DECLARE(anticipated_deduction)
+MC_DECLARE(part_mort_table)
+MC_DECLARE(premium_table)
+MC_DECLARE(from_point)
+MC_DECLARE(to_point)
+MC_DECLARE(report_column)
 
 #undef MC_DECLARE
 

Modified: lmi/trunk/mc_enum_types_aux.cpp
===================================================================
--- lmi/trunk/mc_enum_types_aux.cpp     2010-03-26 22:47:25 UTC (rev 4818)
+++ lmi/trunk/mc_enum_types_aux.cpp     2010-03-27 01:26:16 UTC (rev 4819)
@@ -29,20 +29,34 @@
 #include "mc_enum_types_aux.hpp"
 
 #include "alert.hpp"
+#include "assert_lmi.hpp"
 #include "mc_enum.hpp"
 #include "mc_enum_types.hpp"
 
-#include <boost/static_assert.hpp>
+namespace
+{
+/// Validate mc_n_gen_bases, mc_n_sep_bases, and mc_n_rate_periods.
+///
+/// Each of these very useful constants must equal the cardinality of
+/// its corresponding mc_enum type. This cannot gracefully be affirmed
+/// by a static assertion, so it's asserted at run time here.
 
-// The 'mc_n_' values could be initialized in the header with the
-// values they're tested against here, but that would complicate
-// the physical design. It's better to exclude heavyweight mc_enum
-// metadata from any header in which it's not indispensable.
+bool validate_mc_n_values()
+{
+    LMI_ASSERT(mc_n_gen_bases    == mce_gen_basis  ::all_strings().size());
+    LMI_ASSERT(mc_n_sep_bases    == mce_sep_basis  ::all_strings().size());
+    LMI_ASSERT(mc_n_rate_periods == mce_rate_period::all_strings().size());
+    return true;
+}
 
-BOOST_STATIC_ASSERT(mc_n_gen_bases    == mc_enum_key<mcenum_gen_basis  >::n_);
-BOOST_STATIC_ASSERT(mc_n_sep_bases    == mc_enum_key<mcenum_sep_basis  >::n_);
-BOOST_STATIC_ASSERT(mc_n_rate_periods == mc_enum_key<mcenum_rate_period>::n_);
+/// See:
+///   http://groups.google.com/address@hidden
+/// and Kanze's reply:
+///   http://groups.google.com/address@hidden
 
+volatile bool ensure_setup = validate_mc_n_values();
+} // Unnamed namespace.
+
 std::vector<std::string> const& LMI_SO all_strings_gender   () {return 
mce_gender  ::all_strings();}
 std::vector<std::string> const& LMI_SO all_strings_class    () {return 
mce_class   ::all_strings();}
 std::vector<std::string> const& LMI_SO all_strings_smoking  () {return 
mce_smoking ::all_strings();}





reply via email to

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