1 #ifndef __GNUC__
2 #pragma once
3 #endif
4 #ifndef __XR_UTILS_H__
5 #define __XR_UTILS_H__
6 
7 #include <string>
8 
9 namespace xray_re {
10 
11 template<typename T> static inline
find_by_name(T & container,const char * name)12 typename T::value_type find_by_name(T& container, const char* name)
13 {
14 	for (typename T::iterator it = container.begin(),
15 			end = container.end(); it != end; ++it) {
16 		if ((*it)->name() == name)
17 			return *it;
18 	}
19 	return 0;
20 }
21 
22 template<typename T> static inline
find_by_name(T & container,const std::string & name)23 typename T::value_type find_by_name(T& container, const std::string& name)
24 {
25 	return find_by_name<T>(container, name.c_str());
26 }
27 
delete_elements(T * container[],size_t n)28 template<typename T> void delete_elements(T* container[], size_t n)
29 {
30 	for (T **p = container, **end = p + n; p != end; ++p)
31 		delete *p;
32 }
33 
delete_elements(T & container)34 template<typename T> void delete_elements(T& container)
35 {
36 	for (typename T::iterator it = container.begin(), end = container.end(); it != end; ++it)
37 		delete *it;
38 }
39 
clear_container(T & container)40 template<typename T> void clear_container(T& container)
41 {
42 	for (typename T::iterator it = container.begin(), end = container.end(); it != end; ++it)
43 		delete *it;
44 	container.clear();
45 }
46 
trim_container(T & container)47 template<typename T> void trim_container(T& container)
48 {
49 	for (typename T::iterator it = container.begin(), end = container.end(); it != end; ++it)
50 		delete *it;
51 	T().swap(container);
52 }
53 
__compare(const T & left,const T & right)54 template<typename T> inline int __compare(const T& left, const T& right)
55 {
56 	return (left < right) ? -1 : (left == right ? 0 : +1);
57 }
58 
lower_bound_if(I first,I last,P pred)59 template<typename I, typename P> inline I lower_bound_if(I first, I last, P pred)
60 {
61 	for (ptrdiff_t count = last - first; 0 < count; ) {
62 		ptrdiff_t count2 = count / 2;
63 		I it = first + count2;
64 		if (pred(*it)) {
65 			first = ++it;
66 			count -= count2 + 1;
67 		} else {
68 			count = count2;
69 		}
70 	}
71 	return first;
72 }
73 
delete_safe(const T * & p)74 template<typename T> inline void delete_safe(const T*& p) { delete p; p = 0; }
75 
76 template<typename T> struct ptr_less {
operatorptr_less77 	inline bool operator()(const T* l, const T* r) const { return *l < *r; }
78 };
79 
80 template<typename T> struct ptr_greater {
operatorptr_greater81 	inline bool operator()(const T* l, const T* r) const { return *l > *r; }
82 };
83 
84 #if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1600
85 #define xr_uninitialized_fill_n(p, n, v)	stdext::unchecked_uninitialized_fill_n((p), (n), (v))
86 #else
87 #define xr_uninitialized_fill_n(p, n, v)	std::uninitialized_fill_n((p), (n), (v))
88 #endif
89 
90 } // end of namespace xray_re
91 
92 #endif
93