File indexing completed on 2025-10-31 08:22:57
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 
0014 
0015 
0016 
0017 
0018 
0019 
0020 
0021 
0022 
0023 
0024 
0025 
0026 
0027 
0028 
0029 
0030 
0031 
0032 
0033 
0034 
0035 
0036 
0037 
0038 #ifndef __has_c2_factory_hh
0039 #define __has_c2_factory_hh 1
0040 
0041 #include "c2_function.hh"
0042 
0043 
0044 
0045 
0046 
0047 
0048 
0049 
0050 
0051 
0052 
0053 
0054 
0055 
0056 template<typename float_type>
0057 class c2_factory
0058 {
0059   public:
0060     
0061     static c2_classic_function_p<float_type>& classic_function(float_type (*c_func)(float_type))
0062     {
0063       return *new c2_classic_function_p<float_type>(c_func);
0064     }
0065     
0066     static c2_plugin_function_p<float_type>& plugin_function()
0067     {
0068       return *new c2_plugin_function_p<float_type>();
0069     }
0070     
0071     static c2_plugin_function_p<float_type>& plugin_function(c2_function<float_type>& f)
0072     {
0073       return *new c2_plugin_function_p<float_type>(f);
0074     }
0075     
0076     static c2_const_plugin_function_p<float_type>& const_plugin_function()
0077     {
0078       return *new c2_const_plugin_function_p<float_type>();
0079     }
0080     
0081     static c2_const_plugin_function_p<float_type>&
0082     const_plugin_function(const c2_function<float_type>& f)
0083     {
0084       return *new c2_const_plugin_function_p<float_type>(f);
0085     }
0086     
0087     static c2_scaled_function_p<float_type>& scaled_function(const c2_function<float_type>& outer,
0088                                                              float_type scale)
0089     {
0090       return *new c2_scaled_function_p<float_type>(outer, scale);
0091     }
0092     
0093     static c2_cached_function_p<float_type>& cached_function(const c2_function<float_type>& func)
0094     {
0095       return *new c2_cached_function_p<float_type>(func);
0096     }
0097     
0098     static c2_constant_p<float_type>& constant(float_type x)
0099     {
0100       return *new c2_constant_p<float_type>(x);
0101     }
0102     
0103     static interpolating_function_p<float_type>& interpolating_function()
0104     {
0105       return *new interpolating_function_p<float_type>();
0106     }
0107     
0108     static lin_log_interpolating_function_p<float_type>& lin_log_interpolating_function()
0109     {
0110       return *new lin_log_interpolating_function_p<float_type>();
0111     }
0112     
0113     static log_lin_interpolating_function_p<float_type>& log_lin_interpolating_function()
0114     {
0115       return *new log_lin_interpolating_function_p<float_type>();
0116     }
0117     
0118     static log_log_interpolating_function_p<float_type>& log_log_interpolating_function()
0119     {
0120       return *new log_log_interpolating_function_p<float_type>();
0121     }
0122     
0123     static arrhenius_interpolating_function_p<float_type>& arrhenius_interpolating_function()
0124     {
0125       return *new arrhenius_interpolating_function_p<float_type>();
0126     }
0127     
0128     static c2_connector_function_p<float_type>&
0129     connector_function(float_type x0, const c2_function<float_type>& f0, float_type x2,
0130                        const c2_function<float_type>& f2, bool auto_center, float_type y1)
0131     {
0132       return *new c2_connector_function_p<float_type>(x0, f0, x2, f2, auto_center, y1);
0133     }
0134     
0135     static c2_connector_function_p<float_type>& connector_function(const c2_fblock<float_type>& fb0,
0136                                                                    const c2_fblock<float_type>& fb2,
0137                                                                    bool auto_center, float_type y1)
0138     {
0139       return *new c2_connector_function_p<float_type>(fb0, fb2, auto_center, y1);
0140     }
0141     
0142     static c2_connector_function_p<float_type>& connector_function(float_type x0, float_type y0,
0143                                                                    float_type yp0, float_type ypp0,
0144                                                                    float_type x2, float_type y2,
0145                                                                    float_type yp2, float_type ypp2,
0146                                                                    bool auto_center, float_type y1)
0147     {
0148       return *new c2_connector_function_p<float_type>(x0, y0, yp0, ypp0, x2, y2, yp2, ypp2,
0149                                                       auto_center, y1);
0150     }
0151     
0152     static c2_piecewise_function_p<float_type>& piecewise_function()
0153     {
0154       return *new c2_piecewise_function_p<float_type>();
0155     }
0156     
0157     static c2_sin_p<float_type>& sin() { return *new c2_sin_p<float_type>(); }
0158     
0159     static c2_cos_p<float_type>& cos() { return *new c2_cos_p<float_type>(); }
0160     
0161     static c2_tan_p<float_type>& tan() { return *new c2_tan_p<float_type>(); }
0162     
0163     static c2_log_p<float_type>& log() { return *new c2_log_p<float_type>(); }
0164     
0165     static c2_exp_p<float_type>& exp() { return *new c2_exp_p<float_type>(); }
0166     
0167     static c2_sqrt_p<float_type>& sqrt() { return *new c2_sqrt_p<float_type>(); }
0168     
0169     static c2_recip_p<float_type>& recip(float_type scale = 1)
0170     {
0171       return *new c2_recip_p<float_type>(scale);
0172     }
0173     
0174     static c2_identity_p<float_type>& identity() { return *new c2_identity_p<float_type>(); }
0175     
0176     static c2_linear_p<float_type>& linear(float_type x0, float_type y0, float_type slope)
0177     {
0178       return *new c2_linear_p<float_type>(x0, y0, slope);
0179     }
0180     
0181     static c2_quadratic_p<float_type>& quadratic(float_type x0, float_type y0, float_type xcoef,
0182                                                  float_type x2coef)
0183     {
0184       return *new c2_quadratic_p<float_type>(x0, y0, xcoef, x2coef);
0185     }
0186     
0187     static c2_power_law_p<float_type>& power_law(float_type scale, float_type power)
0188     {
0189       return *new c2_power_law_p<float_type>(scale, power);
0190     }
0191     
0192     static c2_inverse_function_p<float_type>&
0193     inverse_function(const c2_function<float_type>& source)
0194     {
0195       return *new c2_inverse_function_p<float_type>(source);
0196     }
0197 
0198 #if 0
0199 
0200 
0201 template <template <typename f_t> class Final > 
0202     static interpolating_function_p<float_type> 
0203     & inverse_integrated_density_bins(const std::vector<float_type> &bincenters,
0204                 const std::vector<float_type> &binheights)
0205                 throw(c2_exception) 
0206       {
0207         return ::inverse_integrated_density_bins<float_type, Final<float_type> >
0208                         (bincenters, binheights);
0209       }
0210 
0211 
0212 template <template <typename f_t> class Final > 
0213     static interpolating_function_p<float_type>
0214     & inverse_integrated_density_function(
0215                 const std::vector<float_type> &bincenters,
0216                 const c2_function<float_type> &binheights)
0217                 throw(c2_exception) 
0218       {
0219         return ::inverse_integrated_density_function<float_type,
0220                                                      Final<float_type> >
0221                         (bincenters, binheights);
0222       }
0223 #endif
0224 };
0225 
0226 #endif