Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights 1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 2 // See the file tools.license for terms. 3 3 4 #ifndef tools_rcmp 4 #ifndef tools_rcmp 5 #define tools_rcmp 5 #define tools_rcmp 6 6 7 // used in safe cast. 7 // used in safe cast. 8 8 9 #include <string> 9 #include <string> 10 #include <cstring> 10 #include <cstring> 11 11 12 namespace tools { 12 namespace tools { 13 13 14 inline bool rcmp(const char* a_1,const char* a 14 inline bool rcmp(const char* a_1,const char* a_2) { 15 size_t l1 = ::strlen(a_1); 15 size_t l1 = ::strlen(a_1); 16 size_t l2 = ::strlen(a_2); 16 size_t l2 = ::strlen(a_2); 17 if(l1!=l2) return false; 17 if(l1!=l2) return false; 18 if(!l1) return true; 18 if(!l1) return true; 19 const char* p1 = a_1+l1-1; 19 const char* p1 = a_1+l1-1; 20 const char* p2 = a_2+l2-1; 20 const char* p2 = a_2+l2-1; 21 //ab 21 //ab 22 //012 22 //012 23 for(size_t index=0;index<l1;index++,p1--,p2- 23 for(size_t index=0;index<l1;index++,p1--,p2--) { 24 if(*p1!=*p2) return false; 24 if(*p1!=*p2) return false; 25 } 25 } 26 return true; 26 return true; 27 } 27 } 28 28 29 inline bool rcmp(const std::string& a_1,const 29 inline bool rcmp(const std::string& a_1,const char* a_2) { 30 std::string::size_type l1 = a_1.size(); 30 std::string::size_type l1 = a_1.size(); 31 size_t l2 = ::strlen(a_2); 31 size_t l2 = ::strlen(a_2); 32 if(size_t(l1)!=l2) return false; 32 if(size_t(l1)!=l2) return false; 33 if(!l1) return true; 33 if(!l1) return true; 34 const char* p1 = a_1.c_str()+l1-1; 34 const char* p1 = a_1.c_str()+l1-1; 35 const char* p2 = a_2+l2-1; 35 const char* p2 = a_2+l2-1; 36 //ab 36 //ab 37 //012 37 //012 38 for(std::string::size_type index=0;index<l1; 38 for(std::string::size_type index=0;index<l1;index++,p1--,p2--) { 39 if(*p1!=*p2) return false; 39 if(*p1!=*p2) return false; 40 } 40 } 41 return true; 41 return true; 42 } 42 } 43 43 44 inline bool rcmp(const char* a_1,const std::st 44 inline bool rcmp(const char* a_1,const std::string& a_2) { 45 size_t l1 = ::strlen(a_1); 45 size_t l1 = ::strlen(a_1); 46 std::string::size_type l2 = a_2.size(); 46 std::string::size_type l2 = a_2.size(); 47 if(l1!=size_t(l2)) return false; 47 if(l1!=size_t(l2)) return false; 48 if(!l1) return true; 48 if(!l1) return true; 49 const char* p1 = a_1+l1-1; 49 const char* p1 = a_1+l1-1; 50 const char* p2 = a_2.c_str()+l2-1; 50 const char* p2 = a_2.c_str()+l2-1; 51 //ab 51 //ab 52 //012 52 //012 53 for(size_t index=0;index<l1;index++,p1--,p2- 53 for(size_t index=0;index<l1;index++,p1--,p2--) { 54 if(*p1!=*p2) return false; 54 if(*p1!=*p2) return false; 55 } 55 } 56 return true; 56 return true; 57 } 57 } 58 58 59 inline bool rcmp(const std::string& a_1,const 59 inline bool rcmp(const std::string& a_1,const std::string& a_2) { 60 std::string::size_type l1 = a_1.size(); 60 std::string::size_type l1 = a_1.size(); 61 std::string::size_type l2 = a_2.size(); 61 std::string::size_type l2 = a_2.size(); 62 if(l1!=l2) return false; 62 if(l1!=l2) return false; 63 if(!l1) return true; 63 if(!l1) return true; 64 const char* p1 = a_1.c_str()+l1-1; 64 const char* p1 = a_1.c_str()+l1-1; 65 const char* p2 = a_2.c_str()+l2-1; 65 const char* p2 = a_2.c_str()+l2-1; 66 //ab 66 //ab 67 //012 67 //012 68 for(std::string::size_type index=0;index<l1; 68 for(std::string::size_type index=0;index<l1;index++,p1--,p2--) { 69 if(*p1!=*p2) return false; 69 if(*p1!=*p2) return false; 70 } 70 } 71 return true; 71 return true; 72 } 72 } 73 73 74 } 74 } 75 75 76 #endif 76 #endif