realroot_doc 0.1.1
|
00001 /********************************************************************* 00002 * This file is part of the source code of realroot library. * 00003 * Author(s): B. Mourrain, GALAAD, INRIA * 00004 ********************************************************************** 00005 History: 00006 $Id: let.hpp,v 1.3 2005/09/28 06:40:43 mourrain Exp $ 00007 **********************************************************************/ 00008 #ifndef mmx_assign_hpp 00009 #define mmx_assign_hpp 00010 //-------------------------------------------------------------------- 00011 #include <cstdlib> 00012 #include <complex> 00013 #include <iostream> 00014 //==================================================================== 00015 namespace std {template<class C> struct complex;} 00016 //-------------------------------------------------------------------- 00017 namespace mmx { 00018 00019 #ifndef WITH_AS 00020 #define WITH_AS 00021 template<typename T,typename F> struct as_helper { 00022 static inline T cv (const F& x) { return x; } 00023 }; 00024 template<typename T,typename F> inline T as (const F& x) { 00025 return as_helper<T,F>::cv (x); 00026 } 00027 00028 template<typename T,typename F, class U> inline T 00029 as (const F& x, const U& u) { 00030 return as_helper<T,F>::cv (x,u); 00031 } 00032 00033 template<typename T,typename F, class U, class V> inline T 00034 as (const F& x, const U& u, const V& v) { 00035 return as_helper<T,F>::cv (x,u,v); 00036 } 00037 #endif 00038 00039 //==================================================================== 00041 00047 namespace let { 00048 //-------------------------------------------------------------------- 00049 // template<class A, class B> inline void assign(A& a, const B& b); 00050 //-------------------------------------------------------------------- 00052 template<class A, class B> inline void assign(A& a, const B & b) { 00053 a=as<A>(b); 00054 } 00055 inline void assign( int & a, double d ) { a = (int)rint(d); }; 00056 //-------------------------------------------------------------------- 00057 inline void assign(double & d, int i) {d = double(i);} 00058 inline void assign(double & d, unsigned i) {d = double(i);} 00059 inline void assign(double & d, double z) {d = z;} 00060 //-------------------------------------------------------------------- 00061 template<class C> inline void 00062 assign(std::complex<C> & z, const C& x) { z= std::complex<C>(x);} 00063 //-------------------------------------------------------------------- 00064 template<class X> inline void assign(X & a, const char *s) { a = X(s); } 00065 //---------------------------------------------------------------------- 00066 template<> inline void assign(int &i, const char *s) {i = atoi(s);} 00067 template<> inline void assign(long int &i, const char *s) {i = atol(s);} 00068 //---------------------------------------------------------------------- 00069 #ifndef __CYGWIN__ 00070 template<> inline void assign(long long int &i, const char *s) {i = atoll(s);} 00071 #endif //__CYGWIN__ 00072 //---------------------------------------------------------------------- 00073 // template<> 00074 inline void assign(float & d, char* s) {d = atof(s);} 00075 // template<> 00076 inline void assign(double & d, char* s) {d = atof(s);} 00077 // template<> 00078 inline void assign(long double & d, char *s) {d = atof(s);} 00079 //-------------------------------------------------------------------- 00080 inline void 00081 assign(std::complex<double> & z, const char* s) { 00082 z = std::complex<double>(atof(s),0); 00083 } 00084 //-------------------------------------------------------------------- 00085 } 00086 //======================================================================== 00087 } //namespace mmx 00088 //======================================================================== 00089 #endif // realroot_assign_hpp 00090