mbed-os5 only for TYBLE16
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
platform/cxxsupport/mstd_algorithm@1:9db0e321a9f4, 2019-12-31 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue Dec 31 06:02:27 2019 +0000
- Revision:
- 1:9db0e321a9f4
updated based on mbed-os5.15.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 1:9db0e321a9f4 | 1 | /* mbed Microcontroller Library |
kenjiArai | 1:9db0e321a9f4 | 2 | * Copyright (c) 2019 ARM Limited |
kenjiArai | 1:9db0e321a9f4 | 3 | * SPDX-License-Identifier: Apache-2.0 |
kenjiArai | 1:9db0e321a9f4 | 4 | * |
kenjiArai | 1:9db0e321a9f4 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
kenjiArai | 1:9db0e321a9f4 | 6 | * you may not use this file except in compliance with the License. |
kenjiArai | 1:9db0e321a9f4 | 7 | * You may obtain a copy of the License at |
kenjiArai | 1:9db0e321a9f4 | 8 | * |
kenjiArai | 1:9db0e321a9f4 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
kenjiArai | 1:9db0e321a9f4 | 10 | * |
kenjiArai | 1:9db0e321a9f4 | 11 | * Unless required by applicable law or agreed to in writing, software |
kenjiArai | 1:9db0e321a9f4 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
kenjiArai | 1:9db0e321a9f4 | 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
kenjiArai | 1:9db0e321a9f4 | 14 | * See the License for the specific language governing permissions and |
kenjiArai | 1:9db0e321a9f4 | 15 | * limitations under the License. |
kenjiArai | 1:9db0e321a9f4 | 16 | */ |
kenjiArai | 1:9db0e321a9f4 | 17 | #ifndef MSTD_ALGORITHM_ |
kenjiArai | 1:9db0e321a9f4 | 18 | #define MSTD_ALGORITHM_ |
kenjiArai | 1:9db0e321a9f4 | 19 | |
kenjiArai | 1:9db0e321a9f4 | 20 | /* <mstd_algorithm> |
kenjiArai | 1:9db0e321a9f4 | 21 | * |
kenjiArai | 1:9db0e321a9f4 | 22 | * - provides <algorithm> |
kenjiArai | 1:9db0e321a9f4 | 23 | * - For ARM C 5, standard C++11/14 features: |
kenjiArai | 1:9db0e321a9f4 | 24 | * - std::min, std::max for std::initializer_list |
kenjiArai | 1:9db0e321a9f4 | 25 | * - std::all_of, std::any_of, std::none_of |
kenjiArai | 1:9db0e321a9f4 | 26 | * - std::find_if_not |
kenjiArai | 1:9db0e321a9f4 | 27 | * - std::equal (2-range forms) |
kenjiArai | 1:9db0e321a9f4 | 28 | * - std::copy_n, std::move, std::move_backward |
kenjiArai | 1:9db0e321a9f4 | 29 | * - mstd::min, mstd::max constexpr replacements |
kenjiArai | 1:9db0e321a9f4 | 30 | */ |
kenjiArai | 1:9db0e321a9f4 | 31 | |
kenjiArai | 1:9db0e321a9f4 | 32 | #include <algorithm> |
kenjiArai | 1:9db0e321a9f4 | 33 | |
kenjiArai | 1:9db0e321a9f4 | 34 | #ifdef __CC_ARM |
kenjiArai | 1:9db0e321a9f4 | 35 | #include <mstd_utility> |
kenjiArai | 1:9db0e321a9f4 | 36 | #endif |
kenjiArai | 1:9db0e321a9f4 | 37 | |
kenjiArai | 1:9db0e321a9f4 | 38 | namespace mstd { |
kenjiArai | 1:9db0e321a9f4 | 39 | #ifdef __CC_ARM |
kenjiArai | 1:9db0e321a9f4 | 40 | // Really want basic min/max to be constexpr as per C++14 |
kenjiArai | 1:9db0e321a9f4 | 41 | template <typename T> |
kenjiArai | 1:9db0e321a9f4 | 42 | constexpr const T &max(const T &a, const T &b) |
kenjiArai | 1:9db0e321a9f4 | 43 | { |
kenjiArai | 1:9db0e321a9f4 | 44 | return a < b ? b : a; |
kenjiArai | 1:9db0e321a9f4 | 45 | } |
kenjiArai | 1:9db0e321a9f4 | 46 | |
kenjiArai | 1:9db0e321a9f4 | 47 | template <typename T, class Compare> |
kenjiArai | 1:9db0e321a9f4 | 48 | constexpr const T &max(const T &a, const T &b, Compare comp) |
kenjiArai | 1:9db0e321a9f4 | 49 | { |
kenjiArai | 1:9db0e321a9f4 | 50 | return comp(a, b) ? b : a; |
kenjiArai | 1:9db0e321a9f4 | 51 | } |
kenjiArai | 1:9db0e321a9f4 | 52 | |
kenjiArai | 1:9db0e321a9f4 | 53 | template <typename T> |
kenjiArai | 1:9db0e321a9f4 | 54 | constexpr const T &min(const T &a, const T &b) |
kenjiArai | 1:9db0e321a9f4 | 55 | { |
kenjiArai | 1:9db0e321a9f4 | 56 | return b < a ? b : a; |
kenjiArai | 1:9db0e321a9f4 | 57 | } |
kenjiArai | 1:9db0e321a9f4 | 58 | |
kenjiArai | 1:9db0e321a9f4 | 59 | template <typename T> |
kenjiArai | 1:9db0e321a9f4 | 60 | constexpr const T &min(const T &a, const T &b, Compare comp) |
kenjiArai | 1:9db0e321a9f4 | 61 | { |
kenjiArai | 1:9db0e321a9f4 | 62 | return comp(b, a) ? b : a; |
kenjiArai | 1:9db0e321a9f4 | 63 | } |
kenjiArai | 1:9db0e321a9f4 | 64 | |
kenjiArai | 1:9db0e321a9f4 | 65 | // Maybe sort out C++14 constexpr for these later - these are C++11 at least |
kenjiArai | 1:9db0e321a9f4 | 66 | template <typename T> |
kenjiArai | 1:9db0e321a9f4 | 67 | T max(initializer_list<T> il) |
kenjiArai | 1:9db0e321a9f4 | 68 | { |
kenjiArai | 1:9db0e321a9f4 | 69 | return *std::max_element(begin(il), end(il)); |
kenjiArai | 1:9db0e321a9f4 | 70 | } |
kenjiArai | 1:9db0e321a9f4 | 71 | |
kenjiArai | 1:9db0e321a9f4 | 72 | template <typename T, class Compare> |
kenjiArai | 1:9db0e321a9f4 | 73 | T max(initializer_list<T> il, Compare comp) |
kenjiArai | 1:9db0e321a9f4 | 74 | { |
kenjiArai | 1:9db0e321a9f4 | 75 | return *std::max_element(begin(il), end(il), comp); |
kenjiArai | 1:9db0e321a9f4 | 76 | } |
kenjiArai | 1:9db0e321a9f4 | 77 | |
kenjiArai | 1:9db0e321a9f4 | 78 | template <typename T> |
kenjiArai | 1:9db0e321a9f4 | 79 | T min(initializer_list<T> il) |
kenjiArai | 1:9db0e321a9f4 | 80 | { |
kenjiArai | 1:9db0e321a9f4 | 81 | return *std::min_element(begin(il), end(il)); |
kenjiArai | 1:9db0e321a9f4 | 82 | } |
kenjiArai | 1:9db0e321a9f4 | 83 | |
kenjiArai | 1:9db0e321a9f4 | 84 | template <typename T, class Compare> |
kenjiArai | 1:9db0e321a9f4 | 85 | T min(initializer_list<T> il, Compare comp) |
kenjiArai | 1:9db0e321a9f4 | 86 | { |
kenjiArai | 1:9db0e321a9f4 | 87 | return *std::min_element(begin(il), end(il), comp); |
kenjiArai | 1:9db0e321a9f4 | 88 | } |
kenjiArai | 1:9db0e321a9f4 | 89 | |
kenjiArai | 1:9db0e321a9f4 | 90 | template <typename T1, typename T2> |
kenjiArai | 1:9db0e321a9f4 | 91 | class pair; |
kenjiArai | 1:9db0e321a9f4 | 92 | |
kenjiArai | 1:9db0e321a9f4 | 93 | template <typename T> |
kenjiArai | 1:9db0e321a9f4 | 94 | constexpr pair<const T &, const T &> minmax(const T &a, const T &b) |
kenjiArai | 1:9db0e321a9f4 | 95 | { |
kenjiArai | 1:9db0e321a9f4 | 96 | if (b < a) { |
kenjiArai | 1:9db0e321a9f4 | 97 | return pair<const T &, const T &>(b, a); |
kenjiArai | 1:9db0e321a9f4 | 98 | } else { |
kenjiArai | 1:9db0e321a9f4 | 99 | return pair<const T &, const T &>(a, b); |
kenjiArai | 1:9db0e321a9f4 | 100 | } |
kenjiArai | 1:9db0e321a9f4 | 101 | } |
kenjiArai | 1:9db0e321a9f4 | 102 | |
kenjiArai | 1:9db0e321a9f4 | 103 | template <typename T, class Compare> |
kenjiArai | 1:9db0e321a9f4 | 104 | constexpr pair<const T &, const T &> minmax(const T &a, const T &b, Compare comp) |
kenjiArai | 1:9db0e321a9f4 | 105 | { |
kenjiArai | 1:9db0e321a9f4 | 106 | if (comp(b, a)) { |
kenjiArai | 1:9db0e321a9f4 | 107 | return pair<const T &, const T &>(b, a); |
kenjiArai | 1:9db0e321a9f4 | 108 | } else { |
kenjiArai | 1:9db0e321a9f4 | 109 | return pair<const T &, const T &>(a, b); |
kenjiArai | 1:9db0e321a9f4 | 110 | } |
kenjiArai | 1:9db0e321a9f4 | 111 | } |
kenjiArai | 1:9db0e321a9f4 | 112 | #else |
kenjiArai | 1:9db0e321a9f4 | 113 | using std::min; |
kenjiArai | 1:9db0e321a9f4 | 114 | using std::max; |
kenjiArai | 1:9db0e321a9f4 | 115 | using std::minmax; |
kenjiArai | 1:9db0e321a9f4 | 116 | #endif |
kenjiArai | 1:9db0e321a9f4 | 117 | } |
kenjiArai | 1:9db0e321a9f4 | 118 | |
kenjiArai | 1:9db0e321a9f4 | 119 | #ifdef __CC_ARM |
kenjiArai | 1:9db0e321a9f4 | 120 | |
kenjiArai | 1:9db0e321a9f4 | 121 | namespace std { |
kenjiArai | 1:9db0e321a9f4 | 122 | // [alg.all_of] |
kenjiArai | 1:9db0e321a9f4 | 123 | template <class InputIterator, class Predicate> |
kenjiArai | 1:9db0e321a9f4 | 124 | bool all_of(InputIterator first, InputIterator last, Predicate pred) |
kenjiArai | 1:9db0e321a9f4 | 125 | { |
kenjiArai | 1:9db0e321a9f4 | 126 | for (; first != last; ++first) { |
kenjiArai | 1:9db0e321a9f4 | 127 | if (!pred(*first)) { |
kenjiArai | 1:9db0e321a9f4 | 128 | return false; |
kenjiArai | 1:9db0e321a9f4 | 129 | } |
kenjiArai | 1:9db0e321a9f4 | 130 | } |
kenjiArai | 1:9db0e321a9f4 | 131 | return true; |
kenjiArai | 1:9db0e321a9f4 | 132 | } |
kenjiArai | 1:9db0e321a9f4 | 133 | |
kenjiArai | 1:9db0e321a9f4 | 134 | // [alg.any_of] |
kenjiArai | 1:9db0e321a9f4 | 135 | template <class InputIterator, class Predicate> |
kenjiArai | 1:9db0e321a9f4 | 136 | bool any_of(InputIterator first, InputIterator last, Predicate pred) |
kenjiArai | 1:9db0e321a9f4 | 137 | { |
kenjiArai | 1:9db0e321a9f4 | 138 | for (; first != last; ++first) { |
kenjiArai | 1:9db0e321a9f4 | 139 | if (pred(*first)) { |
kenjiArai | 1:9db0e321a9f4 | 140 | return true; |
kenjiArai | 1:9db0e321a9f4 | 141 | } |
kenjiArai | 1:9db0e321a9f4 | 142 | } |
kenjiArai | 1:9db0e321a9f4 | 143 | return false; |
kenjiArai | 1:9db0e321a9f4 | 144 | } |
kenjiArai | 1:9db0e321a9f4 | 145 | |
kenjiArai | 1:9db0e321a9f4 | 146 | // [alg.none_of] |
kenjiArai | 1:9db0e321a9f4 | 147 | template <class InputIterator, class Predicate> |
kenjiArai | 1:9db0e321a9f4 | 148 | bool none_of(InputIterator first, InputIterator last, Predicate pred) |
kenjiArai | 1:9db0e321a9f4 | 149 | { |
kenjiArai | 1:9db0e321a9f4 | 150 | for (; first != last; ++first) { |
kenjiArai | 1:9db0e321a9f4 | 151 | if (pred(*first)) { |
kenjiArai | 1:9db0e321a9f4 | 152 | return false; |
kenjiArai | 1:9db0e321a9f4 | 153 | } |
kenjiArai | 1:9db0e321a9f4 | 154 | } |
kenjiArai | 1:9db0e321a9f4 | 155 | return true; |
kenjiArai | 1:9db0e321a9f4 | 156 | } |
kenjiArai | 1:9db0e321a9f4 | 157 | |
kenjiArai | 1:9db0e321a9f4 | 158 | // [alg.find] |
kenjiArai | 1:9db0e321a9f4 | 159 | template<class InputIterator, class Predicate> |
kenjiArai | 1:9db0e321a9f4 | 160 | InputIterator find_if_not(InputIterator first, InputIterator last, Predicate pred) |
kenjiArai | 1:9db0e321a9f4 | 161 | { |
kenjiArai | 1:9db0e321a9f4 | 162 | for (; first != last; ++first) { |
kenjiArai | 1:9db0e321a9f4 | 163 | if (!pred(*first)) { |
kenjiArai | 1:9db0e321a9f4 | 164 | return first; |
kenjiArai | 1:9db0e321a9f4 | 165 | } |
kenjiArai | 1:9db0e321a9f4 | 166 | } |
kenjiArai | 1:9db0e321a9f4 | 167 | return first; |
kenjiArai | 1:9db0e321a9f4 | 168 | } |
kenjiArai | 1:9db0e321a9f4 | 169 | |
kenjiArai | 1:9db0e321a9f4 | 170 | // [alg.equal] |
kenjiArai | 1:9db0e321a9f4 | 171 | namespace impl { |
kenjiArai | 1:9db0e321a9f4 | 172 | template<class RandomAccessIterator1, class RandomAccessIterator2> |
kenjiArai | 1:9db0e321a9f4 | 173 | bool equal(RandomAccessIterator1 first1, RandomAccessIterator1 last1, |
kenjiArai | 1:9db0e321a9f4 | 174 | RandomAccessIterator2 first2, RandomAccessIterator2 last2, |
kenjiArai | 1:9db0e321a9f4 | 175 | random_access_iterator_tag, |
kenjiArai | 1:9db0e321a9f4 | 176 | random_access_iterator_tag) |
kenjiArai | 1:9db0e321a9f4 | 177 | { |
kenjiArai | 1:9db0e321a9f4 | 178 | if (last1 - first1 != last2 - first2) { |
kenjiArai | 1:9db0e321a9f4 | 179 | return false; |
kenjiArai | 1:9db0e321a9f4 | 180 | } |
kenjiArai | 1:9db0e321a9f4 | 181 | return equal(first1, last1, first2); |
kenjiArai | 1:9db0e321a9f4 | 182 | } |
kenjiArai | 1:9db0e321a9f4 | 183 | |
kenjiArai | 1:9db0e321a9f4 | 184 | template<class RandomAccessIterator1, class RandomAccessIterator2, class BinaryPredicate> |
kenjiArai | 1:9db0e321a9f4 | 185 | bool equal(RandomAccessIterator1 first1, RandomAccessIterator1 last1, |
kenjiArai | 1:9db0e321a9f4 | 186 | RandomAccessIterator2 first2, RandomAccessIterator2 last2, |
kenjiArai | 1:9db0e321a9f4 | 187 | BinaryPredicate pred, |
kenjiArai | 1:9db0e321a9f4 | 188 | random_access_iterator_tag, |
kenjiArai | 1:9db0e321a9f4 | 189 | random_access_iterator_tag) |
kenjiArai | 1:9db0e321a9f4 | 190 | { |
kenjiArai | 1:9db0e321a9f4 | 191 | if (last1 - first1 != last2 - first2) { |
kenjiArai | 1:9db0e321a9f4 | 192 | return false; |
kenjiArai | 1:9db0e321a9f4 | 193 | } |
kenjiArai | 1:9db0e321a9f4 | 194 | return equal(first1, last1, first2, pred); |
kenjiArai | 1:9db0e321a9f4 | 195 | } |
kenjiArai | 1:9db0e321a9f4 | 196 | |
kenjiArai | 1:9db0e321a9f4 | 197 | template<class InputIterator1, class InputIterator2> |
kenjiArai | 1:9db0e321a9f4 | 198 | bool equal(InputIterator1 first1, InputIterator1 last1, |
kenjiArai | 1:9db0e321a9f4 | 199 | InputIterator2 first2, InputIterator2 last2, |
kenjiArai | 1:9db0e321a9f4 | 200 | input_iterator_tag, |
kenjiArai | 1:9db0e321a9f4 | 201 | input_iterator_tag) |
kenjiArai | 1:9db0e321a9f4 | 202 | { |
kenjiArai | 1:9db0e321a9f4 | 203 | for (; first1 != last1 && first2 != last2; ++first1, ++first2) { |
kenjiArai | 1:9db0e321a9f4 | 204 | if (!(*first1 == *first2)) { |
kenjiArai | 1:9db0e321a9f4 | 205 | return false; |
kenjiArai | 1:9db0e321a9f4 | 206 | } |
kenjiArai | 1:9db0e321a9f4 | 207 | } |
kenjiArai | 1:9db0e321a9f4 | 208 | return first1 == last1 && first2 == last2; |
kenjiArai | 1:9db0e321a9f4 | 209 | } |
kenjiArai | 1:9db0e321a9f4 | 210 | |
kenjiArai | 1:9db0e321a9f4 | 211 | template<class InputIterator1, class InputIterator2, class BinaryPredicate> |
kenjiArai | 1:9db0e321a9f4 | 212 | bool equal(InputIterator1 first1, InputIterator1 last1, |
kenjiArai | 1:9db0e321a9f4 | 213 | InputIterator2 first2, InputIterator2 last2, |
kenjiArai | 1:9db0e321a9f4 | 214 | BinaryPredicate pred, |
kenjiArai | 1:9db0e321a9f4 | 215 | input_iterator_tag, |
kenjiArai | 1:9db0e321a9f4 | 216 | input_iterator_tag) |
kenjiArai | 1:9db0e321a9f4 | 217 | { |
kenjiArai | 1:9db0e321a9f4 | 218 | for (; first1 != last1 && first2 != last2; ++first1, ++first2) { |
kenjiArai | 1:9db0e321a9f4 | 219 | if (!pred(*first1, *first2)) { |
kenjiArai | 1:9db0e321a9f4 | 220 | return false; |
kenjiArai | 1:9db0e321a9f4 | 221 | } |
kenjiArai | 1:9db0e321a9f4 | 222 | } |
kenjiArai | 1:9db0e321a9f4 | 223 | return first1 == last1 && first2 == last2; |
kenjiArai | 1:9db0e321a9f4 | 224 | } |
kenjiArai | 1:9db0e321a9f4 | 225 | } |
kenjiArai | 1:9db0e321a9f4 | 226 | |
kenjiArai | 1:9db0e321a9f4 | 227 | template<class InputIterator1, class InputIterator2> |
kenjiArai | 1:9db0e321a9f4 | 228 | bool equal(InputIterator1 first1, InputIterator1 last1, |
kenjiArai | 1:9db0e321a9f4 | 229 | InputIterator2 first2, InputIterator2 last2) |
kenjiArai | 1:9db0e321a9f4 | 230 | { |
kenjiArai | 1:9db0e321a9f4 | 231 | return impl::equal(first1, last1, first2, last2, |
kenjiArai | 1:9db0e321a9f4 | 232 | typename iterator_traits<InputIterator1>::iterator_category(), |
kenjiArai | 1:9db0e321a9f4 | 233 | typename iterator_traits<InputIterator2>::iterator_category()); |
kenjiArai | 1:9db0e321a9f4 | 234 | } |
kenjiArai | 1:9db0e321a9f4 | 235 | |
kenjiArai | 1:9db0e321a9f4 | 236 | template<class InputIterator1, class InputIterator2, class BinaryPredicate> |
kenjiArai | 1:9db0e321a9f4 | 237 | bool equal(InputIterator1 first1, InputIterator1 last1, |
kenjiArai | 1:9db0e321a9f4 | 238 | InputIterator2 first2, InputIterator2 last2, |
kenjiArai | 1:9db0e321a9f4 | 239 | BinaryPredicate pred) |
kenjiArai | 1:9db0e321a9f4 | 240 | { |
kenjiArai | 1:9db0e321a9f4 | 241 | return impl::equal(first1, last1, first2, last2, pred, |
kenjiArai | 1:9db0e321a9f4 | 242 | typename iterator_traits<InputIterator1>::iterator_category(), |
kenjiArai | 1:9db0e321a9f4 | 243 | typename iterator_traits<InputIterator2>::iterator_category()); |
kenjiArai | 1:9db0e321a9f4 | 244 | |
kenjiArai | 1:9db0e321a9f4 | 245 | } |
kenjiArai | 1:9db0e321a9f4 | 246 | |
kenjiArai | 1:9db0e321a9f4 | 247 | // [alg.copy] |
kenjiArai | 1:9db0e321a9f4 | 248 | |
kenjiArai | 1:9db0e321a9f4 | 249 | namespace impl |
kenjiArai | 1:9db0e321a9f4 | 250 | { |
kenjiArai | 1:9db0e321a9f4 | 251 | template<class RandomAccessIterator, class Size, class OutputIterator> |
kenjiArai | 1:9db0e321a9f4 | 252 | OutputIterator copy_n(RandomAccessIterator first, Size n, OutputIterator result, random_access_iterator_tag) |
kenjiArai | 1:9db0e321a9f4 | 253 | { |
kenjiArai | 1:9db0e321a9f4 | 254 | // presumably this should have memcpy etc optimisations |
kenjiArai | 1:9db0e321a9f4 | 255 | return std::copy(first, first + n, result); |
kenjiArai | 1:9db0e321a9f4 | 256 | } |
kenjiArai | 1:9db0e321a9f4 | 257 | |
kenjiArai | 1:9db0e321a9f4 | 258 | template<class InputIterator, class Size, class OutputIterator> |
kenjiArai | 1:9db0e321a9f4 | 259 | OutputIterator copy_n(InputIterator first, Size n, OutputIterator result, input_iterator_tag) |
kenjiArai | 1:9db0e321a9f4 | 260 | { |
kenjiArai | 1:9db0e321a9f4 | 261 | for (Size i = 0; i < n; ++i) { |
kenjiArai | 1:9db0e321a9f4 | 262 | *result++ = *first++; |
kenjiArai | 1:9db0e321a9f4 | 263 | } |
kenjiArai | 1:9db0e321a9f4 | 264 | return result; |
kenjiArai | 1:9db0e321a9f4 | 265 | } |
kenjiArai | 1:9db0e321a9f4 | 266 | } |
kenjiArai | 1:9db0e321a9f4 | 267 | |
kenjiArai | 1:9db0e321a9f4 | 268 | template<class InputIterator, class Size, class OutputIterator> |
kenjiArai | 1:9db0e321a9f4 | 269 | OutputIterator copy_n(InputIterator first, Size n, OutputIterator result) |
kenjiArai | 1:9db0e321a9f4 | 270 | { |
kenjiArai | 1:9db0e321a9f4 | 271 | return impl::copy_n(first, n, result, |
kenjiArai | 1:9db0e321a9f4 | 272 | typename iterator_traits<InputIterator>::iterator_category()); |
kenjiArai | 1:9db0e321a9f4 | 273 | } |
kenjiArai | 1:9db0e321a9f4 | 274 | |
kenjiArai | 1:9db0e321a9f4 | 275 | template<class InputIterator, class OutputIterator, class Predicate> |
kenjiArai | 1:9db0e321a9f4 | 276 | OutputIterator copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred) |
kenjiArai | 1:9db0e321a9f4 | 277 | { |
kenjiArai | 1:9db0e321a9f4 | 278 | for (; first != last; ++first) { |
kenjiArai | 1:9db0e321a9f4 | 279 | if (pred(*first)) { |
kenjiArai | 1:9db0e321a9f4 | 280 | *result++ = *first; |
kenjiArai | 1:9db0e321a9f4 | 281 | } |
kenjiArai | 1:9db0e321a9f4 | 282 | } |
kenjiArai | 1:9db0e321a9f4 | 283 | return result; |
kenjiArai | 1:9db0e321a9f4 | 284 | } |
kenjiArai | 1:9db0e321a9f4 | 285 | |
kenjiArai | 1:9db0e321a9f4 | 286 | // [alg.move] |
kenjiArai | 1:9db0e321a9f4 | 287 | |
kenjiArai | 1:9db0e321a9f4 | 288 | template<class InputIterator, class OutputIterator> |
kenjiArai | 1:9db0e321a9f4 | 289 | OutputIterator move(InputIterator first, InputIterator last, OutputIterator result) |
kenjiArai | 1:9db0e321a9f4 | 290 | { |
kenjiArai | 1:9db0e321a9f4 | 291 | while (first != last) { |
kenjiArai | 1:9db0e321a9f4 | 292 | *result++ = std::move(*first++); |
kenjiArai | 1:9db0e321a9f4 | 293 | } |
kenjiArai | 1:9db0e321a9f4 | 294 | return result; |
kenjiArai | 1:9db0e321a9f4 | 295 | } |
kenjiArai | 1:9db0e321a9f4 | 296 | |
kenjiArai | 1:9db0e321a9f4 | 297 | template<class BidirectionalIterator1, class BidirectionalIterator2> |
kenjiArai | 1:9db0e321a9f4 | 298 | BidirectionalIterator2 move_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result) |
kenjiArai | 1:9db0e321a9f4 | 299 | { |
kenjiArai | 1:9db0e321a9f4 | 300 | while (last != first) { |
kenjiArai | 1:9db0e321a9f4 | 301 | *--result = std::move(*--last); |
kenjiArai | 1:9db0e321a9f4 | 302 | } |
kenjiArai | 1:9db0e321a9f4 | 303 | return result; |
kenjiArai | 1:9db0e321a9f4 | 304 | } |
kenjiArai | 1:9db0e321a9f4 | 305 | |
kenjiArai | 1:9db0e321a9f4 | 306 | } |
kenjiArai | 1:9db0e321a9f4 | 307 | |
kenjiArai | 1:9db0e321a9f4 | 308 | #endif // __CC_ARM |
kenjiArai | 1:9db0e321a9f4 | 309 | |
kenjiArai | 1:9db0e321a9f4 | 310 | namespace mstd |
kenjiArai | 1:9db0e321a9f4 | 311 | { |
kenjiArai | 1:9db0e321a9f4 | 312 | using std::initializer_list; |
kenjiArai | 1:9db0e321a9f4 | 313 | using std::all_of; |
kenjiArai | 1:9db0e321a9f4 | 314 | using std::any_of; |
kenjiArai | 1:9db0e321a9f4 | 315 | using std::none_of; |
kenjiArai | 1:9db0e321a9f4 | 316 | using std::for_each; |
kenjiArai | 1:9db0e321a9f4 | 317 | using std::find; |
kenjiArai | 1:9db0e321a9f4 | 318 | using std::find_if; |
kenjiArai | 1:9db0e321a9f4 | 319 | using std::find_if_not; |
kenjiArai | 1:9db0e321a9f4 | 320 | using std::find_end; |
kenjiArai | 1:9db0e321a9f4 | 321 | using std::find_first_of; |
kenjiArai | 1:9db0e321a9f4 | 322 | using std::adjacent_find; |
kenjiArai | 1:9db0e321a9f4 | 323 | using std::count; |
kenjiArai | 1:9db0e321a9f4 | 324 | using std::count_if; |
kenjiArai | 1:9db0e321a9f4 | 325 | using std::mismatch; |
kenjiArai | 1:9db0e321a9f4 | 326 | using std::equal; |
kenjiArai | 1:9db0e321a9f4 | 327 | using std::search; |
kenjiArai | 1:9db0e321a9f4 | 328 | using std::search_n; |
kenjiArai | 1:9db0e321a9f4 | 329 | using std::copy; |
kenjiArai | 1:9db0e321a9f4 | 330 | using std::copy_n; |
kenjiArai | 1:9db0e321a9f4 | 331 | using std::copy_if; |
kenjiArai | 1:9db0e321a9f4 | 332 | using std::move; |
kenjiArai | 1:9db0e321a9f4 | 333 | using std::move_backward; |
kenjiArai | 1:9db0e321a9f4 | 334 | using std::swap_ranges; |
kenjiArai | 1:9db0e321a9f4 | 335 | using std::iter_swap; |
kenjiArai | 1:9db0e321a9f4 | 336 | using std::transform; |
kenjiArai | 1:9db0e321a9f4 | 337 | using std::replace; |
kenjiArai | 1:9db0e321a9f4 | 338 | using std::replace_if; |
kenjiArai | 1:9db0e321a9f4 | 339 | using std::replace_copy; |
kenjiArai | 1:9db0e321a9f4 | 340 | using std::replace_copy_if; |
kenjiArai | 1:9db0e321a9f4 | 341 | using std::fill; |
kenjiArai | 1:9db0e321a9f4 | 342 | using std::fill_n; |
kenjiArai | 1:9db0e321a9f4 | 343 | using std::generate; |
kenjiArai | 1:9db0e321a9f4 | 344 | using std::generate_n; |
kenjiArai | 1:9db0e321a9f4 | 345 | using std::remove; |
kenjiArai | 1:9db0e321a9f4 | 346 | using std::remove_if; |
kenjiArai | 1:9db0e321a9f4 | 347 | using std::remove_copy; |
kenjiArai | 1:9db0e321a9f4 | 348 | using std::remove_copy_if; |
kenjiArai | 1:9db0e321a9f4 | 349 | using std::unique; |
kenjiArai | 1:9db0e321a9f4 | 350 | using std::unique_copy; |
kenjiArai | 1:9db0e321a9f4 | 351 | using std::reverse; |
kenjiArai | 1:9db0e321a9f4 | 352 | using std::reverse_copy; |
kenjiArai | 1:9db0e321a9f4 | 353 | using std::rotate; |
kenjiArai | 1:9db0e321a9f4 | 354 | using std::rotate_copy; |
kenjiArai | 1:9db0e321a9f4 | 355 | using std::partition; |
kenjiArai | 1:9db0e321a9f4 | 356 | using std::stable_partition; |
kenjiArai | 1:9db0e321a9f4 | 357 | using std::sort; |
kenjiArai | 1:9db0e321a9f4 | 358 | using std::stable_sort; |
kenjiArai | 1:9db0e321a9f4 | 359 | using std::partial_sort; |
kenjiArai | 1:9db0e321a9f4 | 360 | using std::partial_sort_copy; |
kenjiArai | 1:9db0e321a9f4 | 361 | using std::nth_element; |
kenjiArai | 1:9db0e321a9f4 | 362 | using std::lower_bound; |
kenjiArai | 1:9db0e321a9f4 | 363 | using std::upper_bound; |
kenjiArai | 1:9db0e321a9f4 | 364 | using std::equal_range; |
kenjiArai | 1:9db0e321a9f4 | 365 | using std::binary_search; |
kenjiArai | 1:9db0e321a9f4 | 366 | using std::merge; |
kenjiArai | 1:9db0e321a9f4 | 367 | using std::inplace_merge; |
kenjiArai | 1:9db0e321a9f4 | 368 | using std::includes; |
kenjiArai | 1:9db0e321a9f4 | 369 | using std::set_union; |
kenjiArai | 1:9db0e321a9f4 | 370 | using std::set_intersection; |
kenjiArai | 1:9db0e321a9f4 | 371 | using std::set_difference; |
kenjiArai | 1:9db0e321a9f4 | 372 | using std::set_symmetric_difference; |
kenjiArai | 1:9db0e321a9f4 | 373 | using std::push_heap; |
kenjiArai | 1:9db0e321a9f4 | 374 | using std::pop_heap; |
kenjiArai | 1:9db0e321a9f4 | 375 | using std::make_heap; |
kenjiArai | 1:9db0e321a9f4 | 376 | using std::sort_heap; |
kenjiArai | 1:9db0e321a9f4 | 377 | using std::min_element; |
kenjiArai | 1:9db0e321a9f4 | 378 | using std::max_element; |
kenjiArai | 1:9db0e321a9f4 | 379 | using std::lexicographical_compare; |
kenjiArai | 1:9db0e321a9f4 | 380 | using std::next_permutation; |
kenjiArai | 1:9db0e321a9f4 | 381 | using std::prev_permutation; |
kenjiArai | 1:9db0e321a9f4 | 382 | |
kenjiArai | 1:9db0e321a9f4 | 383 | } |
kenjiArai | 1:9db0e321a9f4 | 384 | |
kenjiArai | 1:9db0e321a9f4 | 385 | #endif // MSTD_ALGORITHM_ |