You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							209 lines
						
					
					
						
							5.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							209 lines
						
					
					
						
							5.2 KiB
						
					
					
				
								/*
							 | 
						|
								 * constants.h
							 | 
						|
								 *
							 | 
						|
								 *  Created on: 11.10.2012
							 | 
						|
								 *      Author: Thomas Heinemann
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifndef STORM_UTILITY_CONSTTEMPLATES_H_
							 | 
						|
								#define STORM_UTILITY_CONSTTEMPLATES_H_
							 | 
						|
								
							 | 
						|
								#ifdef max
							 | 
						|
								#	undef max
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifdef min
							 | 
						|
								#	undef min
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#include <limits>
							 | 
						|
								
							 | 
						|
								#include "src/exceptions/InvalidArgumentException.h"
							 | 
						|
								#include "src/storage/BitVector.h"
							 | 
						|
								#include "src/storage/LabeledValues.h"
							 | 
						|
								
							 | 
						|
								namespace storm {
							 | 
						|
								
							 | 
						|
								namespace utility {
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Returns a constant value of 0 that is fit to the type it is being written to.
							 | 
						|
								 * As (at least) gcc has problems to use the correct template by the return value
							 | 
						|
								 * only, the function gets a pointer as a parameter to infer the return type.
							 | 
						|
								 *
							 | 
						|
								 * @note
							 | 
						|
								 * 	The template parameter is just inferred by the return type; GCC is not able to infer this
							 | 
						|
								 * 	automatically, hence the type should always be stated explicitly (e.g. @c constantZero<int>();)
							 | 
						|
								 *
							 | 
						|
								 * @return Value 0, fit to the return type
							 | 
						|
								 */
							 | 
						|
								template<typename _Scalar>
							 | 
						|
								static inline _Scalar constantZero() {
							 | 
						|
								   return _Scalar(0);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*! @cond TEMPLATE_SPECIALIZATION
							 | 
						|
								 * (By default, the template specifications are not included in the documentation)
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for int_fast32_t
							 | 
						|
								 * @return Value 0, fit to the type int_fast32_t
							 | 
						|
								 */
							 | 
						|
								template <>
							 | 
						|
								inline int_fast32_t constantZero() {
							 | 
						|
								   return 0;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for uint_fast64_t
							 | 
						|
								 * @return Value 0, fit to the type uint_fast64_t
							 | 
						|
								 */
							 | 
						|
								template <>
							 | 
						|
								inline uint_fast64_t constantZero() {
							 | 
						|
								   return 0;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for double
							 | 
						|
								 * @return Value 0.0, fit to the type double
							 | 
						|
								 */
							 | 
						|
								template <>
							 | 
						|
								inline double constantZero() {
							 | 
						|
								   return 0.0;
							 | 
						|
								}
							 | 
						|
								    
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for LabeledValues.
							 | 
						|
								 * @return A LabeledValues object that represents a value of 0.
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline storm::storage::LabeledValues<double> constantZero() {
							 | 
						|
								    return storm::storage::LabeledValues<double>(0.0);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*! @endcond */
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Returns a constant value of 1 that is fit to the type it is being written to.
							 | 
						|
								 * As (at least) gcc has problems to use the correct template by the return value
							 | 
						|
								 * only, the function gets a pointer as a parameter to infer the return type.
							 | 
						|
								 *
							 | 
						|
								 * @note
							 | 
						|
								 * 	The template parameter is just inferred by the return type; GCC is not able to infer this
							 | 
						|
								 * 	automatically, hence the type should always be stated explicitly (e.g. @c constantOne<int>();)
							 | 
						|
								 *
							 | 
						|
								 * @return Value 1, fit to the return type
							 | 
						|
								 */
							 | 
						|
								template<typename _Scalar>
							 | 
						|
								static inline _Scalar constantOne() {
							 | 
						|
								   return _Scalar(1);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*! @cond TEMPLATE_SPECIALIZATION
							 | 
						|
								 * (By default, the template specializations are not included in the documentation)
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for int_fast32_t
							 | 
						|
								 * @return Value 1, fit to the type int_fast32_t
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline int_fast32_t constantOne() {
							 | 
						|
								   return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for uint_fast64_t
							 | 
						|
								 * @return Value 1, fit to the type uint_fast61_t
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline uint_fast64_t constantOne() {
							 | 
						|
								   return 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for double
							 | 
						|
								 * @return Value 1.0, fit to the type double
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline double constantOne() {
							 | 
						|
								   return 1.0;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for LabeledValues.
							 | 
						|
								 * @return A LabeledValues object that represents a value of 1.
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline storm::storage::LabeledValues<double> constantOne() {
							 | 
						|
								    return storm::storage::LabeledValues<double>(1.0);
							 | 
						|
								}
							 | 
						|
								    
							 | 
						|
								/*! @endcond */
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Returns a constant value of infinity that is fit to the type it is being written to.
							 | 
						|
								 * As (at least) gcc has problems to use the correct template by the return value
							 | 
						|
								 * only, the function gets a pointer as a parameter to infer the return type.
							 | 
						|
								 *
							 | 
						|
								 * @note
							 | 
						|
								 * 	The template parameter is just inferred by the return type; GCC is not able to infer this
							 | 
						|
								 * 	automatically, hence the type should always be stated explicitly (e.g. @c constantOne<int>();)
							 | 
						|
								 *
							 | 
						|
								 * @return Value Infinity, fit to the return type
							 | 
						|
								 */
							 | 
						|
								template<typename _Scalar>
							 | 
						|
								static inline _Scalar constantInfinity() {
							 | 
						|
								   return std::numeric_limits<_Scalar>::infinity();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*! @cond TEMPLATE_SPECIALIZATION
							 | 
						|
								 * (By default, the template specializations are not included in the documentation)
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for int_fast32_t
							 | 
						|
								 * @return Value Infinity, fit to the type uint_fast32_t
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline int_fast32_t constantInfinity() {
							 | 
						|
									throw storm::exceptions::InvalidArgumentException() << "Integer has no infinity.";
							 | 
						|
									return std::numeric_limits<int_fast32_t>::max();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for uint_fast64_t
							 | 
						|
								 * @return Value Infinity, fit to the type uint_fast64_t
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline uint_fast64_t constantInfinity() {
							 | 
						|
									throw storm::exceptions::InvalidArgumentException() << "Integer has no infinity.";
							 | 
						|
									return std::numeric_limits<uint_fast64_t>::max();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for double
							 | 
						|
								 * @return Value Infinity, fit to the type double
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline double constantInfinity() {
							 | 
						|
								   return std::numeric_limits<double>::infinity();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/*!
							 | 
						|
								 * Template specialization for LabeledValues.
							 | 
						|
								 * @return Value Infinity, fit to the type LabeledValues.
							 | 
						|
								 */
							 | 
						|
								template<>
							 | 
						|
								inline storm::storage::LabeledValues<double> constantInfinity() {
							 | 
						|
								    return storm::storage::LabeledValues<double>(std::numeric_limits<double>::infinity());
							 | 
						|
								}
							 | 
						|
								    
							 | 
						|
								/*! @endcond */
							 | 
						|
								
							 | 
						|
								} //namespace utility
							 | 
						|
								
							 | 
						|
								} //namespace storm
							 | 
						|
								
							 | 
						|
								#endif /* STORM_UTILITY_CONSTTEMPLATES_H_ */
							 |