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_vdata 4 #ifndef tools_vdata 5 #define tools_vdata 5 #define tools_vdata 6 6 7 #include <vector> 7 #include <vector> 8 8 9 #if defined(__APPLE__) 9 #if defined(__APPLE__) 10 #include <TargetConditionals.h> 10 #include <TargetConditionals.h> 11 #endif 11 #endif 12 12 13 namespace tools { 13 namespace tools { 14 14 15 // || !__GXX_EXPERIMENTAL_CXX0X__ 15 // || !__GXX_EXPERIMENTAL_CXX0X__ 16 16 17 template <class T> 17 template <class T> 18 inline const T* vec_data(const std::vector<T>& 18 inline const T* vec_data(const std::vector<T>& a_vec) { 19 #if TARGET_OS_IPHONE || __INTEL_COMPILER || _M 19 #if TARGET_OS_IPHONE || __INTEL_COMPILER || _MSC_VER || (__GNUC__ == 4 && __GNUC_MINOR__ <= 0) 20 if(a_vec.empty()) return 0; 20 if(a_vec.empty()) return 0; 21 const T& vf = a_vec.front(); 21 const T& vf = a_vec.front(); 22 return &vf; 22 return &vf; 23 #else 23 #else 24 return a_vec.data(); 24 return a_vec.data(); 25 #endif 25 #endif 26 } 26 } 27 27 28 template <class T> 28 template <class T> 29 inline T* vec_data(std::vector<T>& a_vec) { 29 inline T* vec_data(std::vector<T>& a_vec) { 30 #if TARGET_OS_IPHONE || __INTEL_COMPILER || _M 30 #if TARGET_OS_IPHONE || __INTEL_COMPILER || _MSC_VER || (__GNUC__ == 4 && __GNUC_MINOR__ <= 0) 31 if(a_vec.empty()) return 0; 31 if(a_vec.empty()) return 0; 32 T& vf = a_vec.front(); 32 T& vf = a_vec.front(); 33 return &vf; 33 return &vf; 34 #else 34 #else 35 return a_vec.data(); 35 return a_vec.data(); 36 #endif 36 #endif 37 } 37 } 38 38 39 /* 39 /* 40 #include "forit" 40 #include "forit" 41 //std::vector<bool>::data() does not compile. 41 //std::vector<bool>::data() does not compile. The below may do the job : 42 inline bool* _vec_data(std::vector<bool>& a_v, 42 inline bool* _vec_data(std::vector<bool>& a_v,bool& a_to_delete) { 43 a_to_delete = true; 43 a_to_delete = true; 44 bool* _data = new bool[a_v.size()+1]; 44 bool* _data = new bool[a_v.size()+1]; 45 size_t count = 0; 45 size_t count = 0; 46 tools_vforcit(bool,a_v,it) {_data[count] = * 46 tools_vforcit(bool,a_v,it) {_data[count] = *it;count++;} 47 return _data; 47 return _data; 48 } 48 } 49 49 50 template <class TYPE> 50 template <class TYPE> 51 inline TYPE* _vec_data(std::vector<TYPE>& a_v, 51 inline TYPE* _vec_data(std::vector<TYPE>& a_v,bool& a_to_delete) { 52 a_to_delete = false; 52 a_to_delete = false; 53 return vec_data(a_v); 53 return vec_data(a_v); 54 } 54 } 55 */ 55 */ 56 56 57 inline void tools_vdata_check_compile() {std:: 57 inline void tools_vdata_check_compile() {std::vector<double> v;vec_data(v);} 58 58 59 } 59 } 60 60 61 #endif 61 #endif