[Top][All Lists]
[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();}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [lmi-commits] [4819] Rearrange explicit instantiation,
Greg Chicares <=