00001
00002
00003
00004
00005
00006
00007
00008 #ifndef synaps_arithm_let_H
00009 #define synaps_arithm_let_H
00010
00011 #include <cstdlib>
00012 #include <complex>
00013 #include <iostream>
00014 #include <synaps/init.h>
00015 #include <synaps/base/type.h>
00016 #include <synaps/arithm/let.h>
00017
00018
00019 namespace std {template<class C> struct complex;}
00020
00021 __BEGIN_NAMESPACE_SYNAPS
00022
00024
00030 namespace let {
00031
00032
00033
00035 template<class A, class B> inline void assign(A& a, const B & b)
00036 {
00037
00038 a=b;
00039 }
00040
00041
00042 template<class A, class B> void copy( A & a, const B& b );
00043
00044
00045 inline void assign( int & a, double d ) { a = (int)rint(d); };
00046
00047 inline void assign(double & d, int i) {d = double(i);}
00048 inline void assign(double & d, unsigned i) {d = double(i);}
00049 inline void assign(double & d, double z) {d = z;}
00050
00052 template<class X> inline
00053 const X & convert(const X& x, const type::As<X>& mth)
00054 {
00055 return x;
00056 }
00057 template<class X, class Y> inline
00058 Y convert(const X& x, const type::As<Y>& mth )
00059 {
00060 return (Y)x;
00061 };
00062
00063 template < typename FT,
00064 typename T > inline
00065 FT convert(const T& a, const T& b, const type::As<FT>& mth) {return FT(a, b); }
00066
00067 template<class T>
00068 double convert(const T& a, const T& b, const type::As<double>& mth)
00069 {
00070 double u,v;
00071 assign(u,a); assign(v,b);
00072 return u/v;
00073 }
00074 inline double convert(double a, double b, const type::As<double>& mth) {return a/b;}
00075
00076 template<class C> inline
00077 void assign(std::complex<C> & z, const C& x) { z= std::complex<C>(x);}
00078
00079 template<class X> inline void assign(X & a, char *s) { a = X(s); }
00080
00081 template<> inline void assign(int &i, char *s) {i = atoi(s);}
00082 template<> inline void assign(long int &i, char *s) {i = atol(s);}
00083
00084 #ifndef __CYGWIN__
00085 template<> inline void assign(long long int &i,char *s) {i = atoll(s);}
00086 #endif //__CYGWIN__
00087
00088
00089 inline void assign(float & d, char* s) {d = atof(s);}
00090
00091 inline void assign(double & d, char* s) {d = atof(s);}
00092
00093 inline void assign(long double & d, char *s) {d = atof(s);}
00094
00095 inline void assign(std::complex<double> & z, const char* s)
00096 {
00097 z = std::complex<double>(atof(s),0);
00098 }
00099
00100
00101
00102
00103 }
00104
00105 __END_NAMESPACE_SYNAPS
00106 #endif // synaps_arithm_let_H
00107