00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _GLOBAL_H
00024 #define _GLOBAL_H
00025
00026 #include <iostream>
00027 #include <fstream>
00028
00029 #include <map>
00030 using namespace std;
00031
00032 #include "mystring.h"
00033 #include "info.h"
00034
00035 typedef double MyNT;
00036
00037
00038
00039
00040
00041
00042
00043 #define MY_LOOP_VAR(y) loop_var
00044
00045 #define MY_LOOP_ITERATOR_TYPE(p) (typename T::iterator)p
00046
00047 template<class T, class var_type>
00048 inline void MY_LoopInf(const T& S, var_type& x, void* p)
00049 {
00050 if (MY_LOOP_ITERATOR_TYPE(p) != S.end())
00051 x = *(MY_LOOP_ITERATOR_TYPE(p));
00052 }
00053
00054 template<class T>
00055 inline bool MY_LoopSucc(const T& S, void*& p)
00056 {
00057 if (MY_LOOP_ITERATOR_TYPE(p) != S.end())
00058 {
00059
00060 p = ++(MY_LOOP_ITERATOR_TYPE(p));
00061 return true;
00062 }
00063 else return false;
00064 }
00065
00066 #define MY_forall(x,S)\
00067 for(void* MY_LOOP_VAR(__LINE__) = S.begin();\
00068 MY_LoopInf(S,x,MY_LOOP_VAR(__LINE__)), MY_LoopSucc(S,MY_LOOP_VAR(__LINE__)); )
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 template < class T1, class T2 > ostream& operator<<(ostream& ostr, const pair< T1, T2 >& p)
00085 {
00086 ostr << "(" << p.first << ", " << p.second << ")";
00087 return(ostr);
00088 }
00089
00090
00091 inline bool fileCheck(ifstream& istr, const string& name)
00092 {
00093 if (!istr)
00094 {
00095 cerr << "ERROR! Cannot open file \"" << name << "\".\n";
00096 return(false);
00097 }
00098 return(true);
00099 }
00100
00101 inline bool fileCheck(ofstream& ostr, const string& name)
00102 {
00103 if (!ostr)
00104 {
00105 cerr << "ERROR! Cannot open file \"" << name << "\".\n";
00106 return(false);
00107 }
00108 return(true);
00109 }
00110
00111
00112 #endif // _GLOBAL_H