1 #ifndef RDESTL_ALGORITHM_H 2 #define RDESTL_ALGORITHM_H 4 #include <stk_util/util/int_to_type_rdestl.h> 5 #include <stk_util/util/iterator_rdestl.h> 6 #include <stk_util/util/type_traits_rdestl.h> 7 #include <stk_util/util/utility_rdestl.h> 13 template<
typename T> RDE_FORCEINLINE
14 void copy_construct(T* mem,
const T& orig)
17 internal::copy_construct(mem, orig, int_to_type<has_trivial_copy<T>::value>());
21 template<
typename T> RDE_FORCEINLINE
22 void construct(T* mem)
24 internal::construct(mem, int_to_type<has_trivial_constructor<T>::value>());
28 template<
typename T> RDE_FORCEINLINE
31 internal::destruct(mem, int_to_type<has_trivial_destructor<T>::value>());
36 void copy_n(
const T* first,
size_t n, T* result)
38 internal::copy_n(first, n, result, int_to_type<has_trivial_copy<T>::value>());
43 void copy(
const T* first,
const T* last, T* result)
45 internal::copy(first, last, result, int_to_type<has_trivial_copy<T>::value>());
50 void copy_construct_n(T* first,
size_t n, T* result)
52 internal::copy_construct_n(first, n, result, int_to_type<has_trivial_copy<T>::value>());
56 void move_n(
const T* from,
size_t n, T* result)
58 RDE_ASSERT(from != result || n == 0);
60 if (result > from && result < from + n)
62 internal::move_n(from, n, result, int_to_type<has_trivial_copy<T>::value>());
66 internal::copy_n(from, n, result, int_to_type<has_trivial_copy<T>::value>());
72 void move(
const T* first,
const T* last, T* result)
74 RDE_ASSERT(first != result || first == last);
75 if (result > first && result < last)
77 internal::move(first, last, result, int_to_type<has_trivial_copy<T>::value>());
81 internal::copy(first, last, result, int_to_type<has_trivial_copy<T>::value>());
87 void construct_n(T* first,
size_t n)
89 internal::construct_n(first, n, int_to_type<has_trivial_constructor<T>::value>());
94 void destruct_n(T* first,
size_t n)
96 internal::destruct_n(first, n, int_to_type<has_trivial_destructor<T>::value>());
100 template<
typename T> RDE_FORCEINLINE
101 void fill_n(T* first,
size_t n,
const T& val)
110 while (first != last)
112 *first = val; ++first;
113 case 7: *first = val; ++first;
114 case 6: *first = val; ++first;
115 case 5: *first = val; ++first;
116 case 4: *first = val; ++first;
117 case 3: *first = val; ++first;
118 case 2: *first = val; ++first;
119 case 1: *first = val; ++first;
125 template<
typename TIter,
typename TDist>
inline 126 void distance(TIter first, TIter last, TDist& dist)
128 internal::distance(first, last, dist,
typename iterator_traits<TIter>::iterator_category());
132 template<
typename TIter,
typename TDist>
inline 133 void advance(TIter& iter, TDist off)
135 internal::advance(iter, off,
typename iterator_traits<TIter>::iterator_category());
139 template<
class TIter,
typename T,
class TPred>
inline 140 TIter lower_bound(TIter first, TIter last,
const T& val,
const TPred& pred)
142 internal::test_ordering(first, last, pred);
144 distance(first, last, dist);
147 const int halfDist = dist >> 1;
149 advance(mid, halfDist);
150 if (internal::debug_pred(pred, *mid, val))
151 first = ++mid, dist -= halfDist + 1;
159 template<
class TIter,
typename T,
class TPred>
inline 160 TIter
upper_bound(TIter first, TIter last,
const T& val,
const TPred& pred)
162 internal::test_ordering(first, last, pred);
164 distance(first, last, dist);
167 const int halfDist = dist >> 1;
169 advance(mid, halfDist);
170 if (!internal::debug_pred(pred, val, *mid))
171 first = ++mid, dist -= halfDist + 1;
179 template<
class TIter,
typename T>
180 TIter
find(TIter first, TIter last,
const T& val)
182 while (first != last)
192 template<
class TIter,
typename T,
class TPred>
193 TIter
find_if(TIter first, TIter last,
const T& val,
const TPred& pred)
195 while (first != last)
197 if (pred(*first, val))
205 template<
class TIter,
typename T>
206 void accumulate(TIter first, TIter last, T& result)
208 while (first != last)
219 return t >= T(0) ? t : -t;
222 RDE_FORCEINLINE
int abs(
int x)
224 const int y = x >> 31;
227 RDE_FORCEINLINE
short abs(
short x)
229 const short y = x >> 15;
234 template<
typename T>
inline 235 T max(
const T& x,
const T& y)
237 return x > y ? x : y;
241 template<
typename T>
inline 242 T min(
const T& x,
const T& y)
244 return x < y ? x : y;
263 template<
typename TAssignable>
264 void swap(TAssignable& a, TAssignable& b)
273 #endif // #ifndef RDESTL_ALGORITHM_H InputIterator find_if(InputIterator first, InputIterator last, Predicate predicate)
OutputIterator fill_n(OutputIterator first, Size n, const T &value)
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)
ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T &value)
Part * find(const PartVector &parts, const std::string &name)
Find a part by name in a collection of parts.