You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							111 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
	
	
							111 lines
						
					
					
						
							2.9 KiB
						
					
					
				| //  Copyright John Maddock 2007. | |
|  | |
| //  Use, modification and distribution are subject to the | |
| //  Boost Software License, Version 1.0. (See accompanying file | |
| //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
|  | |
| /* | |
| This header defines two traits classes, both in namespace boost::math::tools. | |
|  | |
| is_distribution<D>::value is true iff D has overloaded "cdf" and | |
| "quantile" functions, plus member typedefs value_type and policy_type.   | |
| It's not much of a definitive test frankly, | |
| but if it looks like a distribution and quacks like a distribution | |
| then it must be a distribution. | |
|  | |
| is_scaled_distribution<D>::value is true iff D is a distribution | |
| as defined above, and has member functions "scale" and "location". | |
|  | |
| */ | |
| 
 | |
| #ifndef BOOST_STATS_IS_DISTRIBUTION_HPP | |
| #define BOOST_STATS_IS_DISTRIBUTION_HPP | |
|  | |
| #ifdef _MSC_VER | |
| #pragma once | |
| #endif | |
|  | |
| #include <boost/mpl/has_xxx.hpp> | |
| // should be the last #include | |
| #include <boost/type_traits/detail/bool_trait_def.hpp> | |
|  | |
| namespace boost{ namespace math{ namespace tools{ | |
| 
 | |
| namespace detail{ | |
| 
 | |
| BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_value_type, value_type, true) | |
| BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_policy_type, policy_type, true) | |
| 
 | |
| template<class D> | |
| char cdf(const D& ...); | |
| template<class D> | |
| char quantile(const D& ...); | |
| 
 | |
| template <class D> | |
| struct has_cdf | |
| { | |
|    static D d; | |
|    BOOST_STATIC_CONSTANT(bool, value = sizeof(cdf(d, 0.0f)) != 1); | |
| }; | |
| 
 | |
| template <class D> | |
| struct has_quantile | |
| { | |
|    static D d; | |
|    BOOST_STATIC_CONSTANT(bool, value = sizeof(quantile(d, 0.0f)) != 1); | |
| }; | |
| 
 | |
| template <class D> | |
| struct is_distribution_imp | |
| { | |
|    BOOST_STATIC_CONSTANT(bool, value =  | |
|       has_quantile<D>::value  | |
|       && has_cdf<D>::value | |
|       && has_value_type<D>::value | |
|       && has_policy_type<D>::value); | |
| }; | |
| 
 | |
| template <class sig, sig val> | |
| struct result_tag{}; | |
| 
 | |
| template <class D> | |
| double test_has_location(const volatile result_tag<typename D::value_type (D::*)()const, &D::location>*); | |
| template <class D> | |
| char test_has_location(...); | |
| 
 | |
| template <class D> | |
| double test_has_scale(const volatile result_tag<typename D::value_type (D::*)()const, &D::scale>*); | |
| template <class D> | |
| char test_has_scale(...); | |
| 
 | |
| template <class D, bool b> | |
| struct is_scaled_distribution_helper | |
| { | |
|    BOOST_STATIC_CONSTANT(bool, value = false); | |
| }; | |
| 
 | |
| template <class D> | |
| struct is_scaled_distribution_helper<D, true> | |
| { | |
|    BOOST_STATIC_CONSTANT(bool, value =  | |
|       (sizeof(test_has_location<D>(0)) != 1)  | |
|       &&  | |
|       (sizeof(test_has_scale<D>(0)) != 1)); | |
| }; | |
| 
 | |
| template <class D> | |
| struct is_scaled_distribution_imp | |
| { | |
|    BOOST_STATIC_CONSTANT(bool, value = (::boost::math::tools::detail::is_scaled_distribution_helper<D, ::boost::math::tools::detail::is_distribution_imp<D>::value>::value)); | |
| }; | |
| 
 | |
| } // namespace detail | |
|  | |
| BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_distribution,T,::boost::math::tools::detail::is_distribution_imp<T>::value) | |
| BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_scaled_distribution,T,::boost::math::tools::detail::is_scaled_distribution_imp<T>::value) | |
| 
 | |
| }}} | |
| 
 | |
| #endif | |
|  | |
| 
 | |
| 
 |