Warning, /include/Geant4/tools/eqT is written in an unsupported language. File is not indexed.
0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003
0004 #ifndef tools_eqT
0005 #define tools_eqT
0006
0007 namespace tools {
0008
0009 template <class NUMBER,class PREC>
0010 inline bool numbers_are_equal(const NUMBER& a_left,const NUMBER& a_right,const PREC& a_prec,PREC(*a_fabs)(const NUMBER&)) {
0011 NUMBER diff = a_left - a_right;
0012 if(a_fabs(diff)>=a_prec) return false;
0013 return true;
0014 }
0015
0016 template <class NUMBER,class PREC>
0017 inline bool is_zero(const NUMBER& a_left,const PREC& a_prec,PREC(*a_fabs)(const NUMBER&)) {
0018 if(a_fabs(a_left)>=a_prec) return false;
0019 return true;
0020 }
0021
0022 template <class VEC,class PREC>
0023 inline bool vectors_are_equal(const VEC& a_1,const VEC& a_2,const PREC& a_prec,PREC(*a_fabs)(const PREC&)) {
0024 if(a_1.size()!=a_2.size()) return false;
0025 typedef typename VEC::size_type sz_t;
0026 sz_t sz = a_1.size();
0027 //bool status = true;
0028 for(sz_t index=0;index<sz;index++) {
0029 if(!numbers_are_equal(a_1[index],a_2[index],a_prec,a_fabs))
0030 //{ ::printf("debug : vectors_are_equals : %lu : %g %g\n",index,a_1[index],a_2[index]);
0031 return false;
0032 //status = false;
0033 //}
0034 }
0035 return true;
0036 //return status;
0037 }
0038
0039 template <class VECVEC,class PREC>
0040 inline bool vecvecs_are_equal(const VECVEC& a_1,const VECVEC& a_2,const PREC& a_prec,PREC(*a_fabs)(const PREC&)) {
0041 if(a_1.size()!=a_2.size()) return false;
0042 typedef typename VECVEC::size_type sz_t;
0043 sz_t sz = a_1.size();
0044 for(sz_t index=0;index<sz;index++) {
0045 if(!vectors_are_equal(a_1[index],a_2[index],a_prec,a_fabs)) return false;
0046 }
0047 return true;
0048 }
0049
0050 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
0051 /// PREC(*a_fabs)(PREC) : /////////////////////////////////////////////////////////////////////////////////////
0052 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
0053
0054 // for histo equals functions.
0055
0056 template <class NUMBER,class PREC>
0057 inline bool numbers_are_equal(const NUMBER& a_left,const NUMBER& a_right,const PREC& a_prec,PREC(*a_fabs)(NUMBER)) {
0058 NUMBER diff = a_left - a_right;
0059 if(a_fabs(diff)>=a_prec) return false;
0060 return true;
0061 }
0062
0063 template <class VEC,class PREC>
0064 inline bool vectors_are_equal(const VEC& a_1,const VEC& a_2,const PREC& a_prec,PREC(*a_fabs)(PREC)) {
0065 if(a_1.size()!=a_2.size()) return false;
0066 typedef typename VEC::size_type sz_t;
0067 sz_t sz = a_1.size();
0068 //bool status = true;
0069 for(sz_t index=0;index<sz;index++) {
0070 if(!numbers_are_equal(a_1[index],a_2[index],a_prec,a_fabs))
0071 //{ ::printf("debug : vectors_are_equals : %lu : %g %g\n",index,a_1[index],a_2[index]);
0072 return false;
0073 //status = false;
0074 //}
0075 }
0076 return true;
0077 //return status;
0078 }
0079
0080 template <class VECVEC,class PREC>
0081 inline bool vecvecs_are_equal(const VECVEC& a_1,const VECVEC& a_2,const PREC& a_prec,PREC(*a_fabs)(PREC)) {
0082 if(a_1.size()!=a_2.size()) return false;
0083 typedef typename VECVEC::size_type sz_t;
0084 sz_t sz = a_1.size();
0085 for(sz_t index=0;index<sz;index++) {
0086 if(!vectors_are_equal(a_1[index],a_2[index],a_prec,a_fabs)) return false;
0087 }
0088 return true;
0089 }
0090
0091 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
0092 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
0093 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
0094
0095 }
0096
0097 #endif